From 4898239d5289ed9dcdf584d6e446e29aac6803a5 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Wed, 19 Apr 2023 12:21:18 -0400 Subject: [PATCH 01/78] Perform upkeep in dev script --- contracts/ethereum/docs/index.md | 82 ++++++++++++++++++++++++++----- contracts/ethereum/scripts/dev.ts | 14 +++++- 2 files changed, 82 insertions(+), 14 deletions(-) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 89c33ca0e..138bfa82d 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -57,27 +57,41 @@ Perform the upkeep function getStake() external view returns (uint256) ``` -Get the total stake +Get the total manager stake #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | The total stake | +| [0] | uint256 | The total manager stake | -### getExpectedConsensusPrincipal +### getExecutionSwept ```solidity -function getExpectedConsensusPrincipal() external view returns (uint256) +function getExecutionSwept() public view returns (int256) ``` -Get the expected consensus stake principal +Get the total manager execution swept amount #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | The expected consensus stake principal | +| [0] | int256 | The total manager execution swept amount | + +### getExpectedConsensusStake + +```solidity +function getExpectedConsensusStake() external view returns (int256) +``` + +Get the total manager expected consensus stake + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | int256 | The total manager expected consensus stake | ## CasimirManager @@ -150,7 +164,7 @@ Constructor receive() external payable ``` -_Production will use oracle reporting balance increases, but receive is used for mocking rewards_ +_Used for mocking sweeps from Beacon to the manager_ ### reward @@ -368,6 +382,34 @@ Get the total manager stake | ---- | ---- | ----------- | | [0] | uint256 | The total manager stake | +### getExecutionStake + +```solidity +function getExecutionStake() public view returns (int256) +``` + +Get the total manager execution stake + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | int256 | The total manager execution stake | + +### getExecutionSwept + +```solidity +function getExecutionSwept() public view returns (int256) +``` + +Get the total manager execution swept amount + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | int256 | The total manager execution swept amount | + ### getConsensusStake ```solidity @@ -382,19 +424,21 @@ Get the total manager consensus stake | ---- | ---- | ----------- | | [0] | int256 | The latest total manager consensus stake | -### getExpectedConsensusPrincipal +### getExpectedConsensusStake ```solidity -function getExpectedConsensusPrincipal() public view returns (uint256) +function getExpectedConsensusStake() public view returns (int256) ``` -Get the total manager expected consensus stake principal +Get the total manager expected consensus stake + +_The expected stake will be honored with slashing recovery in place_ #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | The the total manager expected consensus stake principal | +| [0] | int256 | The the total manager expected consensus stake | ### getOpenDeposits @@ -779,16 +823,28 @@ function getStakedPoolIds() external view returns (uint32[]) function getStake() external view returns (uint256) ``` +### getExecutionStake + +```solidity +function getExecutionStake() external view returns (int256) +``` + +### getExecutionSwept + +```solidity +function getExecutionSwept() external view returns (int256) +``` + ### getConsensusStake ```solidity function getConsensusStake() external view returns (int256) ``` -### getExpectedConsensusPrincipal +### getExpectedConsensusStake ```solidity -function getExpectedConsensusPrincipal() external view returns (uint256) +function getExpectedConsensusStake() external view returns (int256) ``` ### getOpenDeposits diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 7a68ee5f4..0d9d890ab 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -1,7 +1,7 @@ import { deployContract } from '@casimir/hardhat' import { ContractConfig, DeploymentConfig, Validator } from '@casimir/types' import { validatorStore } from '@casimir/data' -import { CasimirManager, MockAggregator } from '../build/artifacts/types' +import { CasimirAutomation, CasimirManager, MockAggregator } from '../build/artifacts/types' import { ethers } from 'hardhat' void async function () { @@ -90,6 +90,9 @@ void async function () { await registration?.wait() } + const automationAddress = await casimirManager?.getAutomationAddress() as string + const casimirAutomation = await ethers.getContractAt('CasimirAutomation', automationAddress) as CasimirAutomation + /** Distribute rewards every ${blocksPerReward} blocks */ const blocksPerReward = 10 @@ -106,6 +109,15 @@ void async function () { const rewardAmount = (rewardPerValidator * activeValidatorPublicKeys.length).toString() const reward = await distributor.sendTransaction({ to: casimirManager?.address, value: ethers.utils.parseEther(rewardAmount) }) await reward.wait() + + /** Perform upkeep (todo add bounds to check data) */ + const checkData = ethers.utils.defaultAbiCoder.encode(['string'], ['']) + const { ...check } = await casimirAutomation.checkUpkeep(checkData) + const { upkeepNeeded, performData } = check + if (upkeepNeeded) { + const performUpkeep = await casimirAutomation.performUpkeep(performData) + await performUpkeep.wait() + } } } }) From 6f49471ae8f6f072e5b007586d115f98fdc1b0bb Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Wed, 19 Apr 2023 12:22:41 -0400 Subject: [PATCH 02/78] Perform upkeep after stake in dev script --- contracts/ethereum/scripts/dev.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 0d9d890ab..8c5f1b227 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -124,6 +124,16 @@ void async function () { /** Increase PoR mock aggregator answer after each pool is staked */ casimirManager?.on('PoolStaked(uint32)', async () => { + + /** Perform upkeep (todo add bounds to check data) */ + const checkData = ethers.utils.defaultAbiCoder.encode(['string'], ['']) + const { ...check } = await casimirAutomation.checkUpkeep(checkData) + const { upkeepNeeded, performData } = check + if (upkeepNeeded) { + const performUpkeep = await casimirAutomation.performUpkeep(performData) + await performUpkeep.wait() + } + if (mockAggregator) { const { ...feed } = await mockAggregator.latestRoundData() const { answer } = feed From 247f83f4e74588b5fe564be5b0e5fe7dae4ce4c5 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Thu, 20 Apr 2023 11:29:07 -0400 Subject: [PATCH 03/78] Fix camel case method --- common/helpers/src/index.ts | 6 +++--- services/users/src/providers/db.ts | 32 +++++++++++------------------- 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/common/helpers/src/index.ts b/common/helpers/src/index.ts index 07194fb76..7bf7a048d 100644 --- a/common/helpers/src/index.ts +++ b/common/helpers/src/index.ts @@ -43,8 +43,8 @@ export async function loadCredentials() { * @param string - The input string * @returns A camelCase string from the input string */ -export function camelCase(string: string, delimiter: string): string { - const words = string.split(delimiter).map(word => { +export function camelCase(string: string): string { + const words = string.split(/[\s_-]+/).map(word => { return word.replace(/\w+/g, (word) => { return word[0].toUpperCase() + word.slice(1).toLowerCase() }) @@ -61,7 +61,7 @@ export function camelCase(string: string, delimiter: string): string { * */ export function pascalCase(string: string): string { - const words = string.split('_').map(word => { + const words = string.split(/[\s_-]+/).map(word => { return word.replace(/\w+/g, (word) => { return word[0].toUpperCase() + word.slice(1).toLowerCase() }) diff --git a/services/users/src/providers/db.ts b/services/users/src/providers/db.ts index 427668ede..43401db71 100644 --- a/services/users/src/providers/db.ts +++ b/services/users/src/providers/db.ts @@ -94,31 +94,23 @@ export default function useDB() { } /** - * Format data from a database result (snake_case to camelCase). + * Format data from a database result object (convert to camelCase). * @param rows - The result date * @returns The formatted data */ - function formatResult(row: any) { - if (row) { - for (const key in row) { - /** Convert snake_case to camelCase */ - if (key.includes('_')) { - row[camelCase(key, '_')] = row[key] - delete row[key] - } - /* Convert kebab-case to camelCase */ - if (key.includes('-')) { - row[camelCase(key, '-')] = row[key] - delete row[key] + function formatResult(result: any) { + if (result) { + for (const key in result) { + result[camelCase(key)] = result[key] + delete result[key] + + if (result[camelCase(key)].isArray()) { + result[camelCase(key)] = result[camelCase(key)].map((result: any) => { + return formatResult(result) + }) } } - /** Format accounts as well */ - if (row.accounts) { - row.accounts = row.accounts.map((account: any) => { - return formatResult(account) - }) - } - return row + return result } } From 73a169dd5d55e19373d1a5a57ecc9a7bb7324276 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Thu, 20 Apr 2023 12:35:44 -0400 Subject: [PATCH 04/78] Remove old dkg submodule entry --- .gitmodules | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index cd299745b..cc8b08c33 100644 --- a/.gitmodules +++ b/.gitmodules @@ -22,6 +22,3 @@ [submodule "scripts/trezor/resources/trezor-user-env"] path = scripts/trezor/resources/trezor-user-env url = https://github.com/trezor/trezor-user-env.git -[submodule "services/keys/scripts/resources/dkg"] - path = services/keys/scripts/resources/dkg - url = https://github.com/RockX-SG/frost-dkg-demo.git From ee1f93a0c9bb21e535c63e85d462f01207bdb823 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Thu, 20 Apr 2023 12:39:12 -0400 Subject: [PATCH 05/78] Remove old dkg submodule directory --- services/keys/scripts/resources/dkg | 1 - 1 file changed, 1 deletion(-) delete mode 160000 services/keys/scripts/resources/dkg diff --git a/services/keys/scripts/resources/dkg b/services/keys/scripts/resources/dkg deleted file mode 160000 index 2a4ef8655..000000000 --- a/services/keys/scripts/resources/dkg +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2a4ef8655cff350d7c0ee22f16fc40e8ef3561ba From 1de27f71a90072688f017a6c2587b6bc61cab9a7 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Thu, 20 Apr 2023 12:43:02 -0400 Subject: [PATCH 06/78] Clean up submodules --- contracts/ethereum/docs/index.md | 662 ++++++++++++++--------------- services/keys/scripts/dev.ts | 8 +- services/keys/src/providers/dkg.ts | 7 +- 3 files changed, 340 insertions(+), 337 deletions(-) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 138bfa82d..4c740c8b7 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -917,6 +917,100 @@ function remove(uint32[] arr, uint256 index) internal function remove(bytes[] arr, uint256 index) internal ``` +## MockAggregator + +### version + +```solidity +uint256 version +``` + +### description + +```solidity +string description +``` + +### decimals + +```solidity +uint8 decimals +``` + +### latestAnswer + +```solidity +int256 latestAnswer +``` + +### latestTimestamp + +```solidity +uint256 latestTimestamp +``` + +### latestRound + +```solidity +uint256 latestRound +``` + +### getAnswer + +```solidity +mapping(uint256 => int256) getAnswer +``` + +### getTimestamp + +```solidity +mapping(uint256 => uint256) getTimestamp +``` + +### constructor + +```solidity +constructor(uint8 _decimals, int256 _initialAnswer) public +``` + +### updateAnswer + +```solidity +function updateAnswer(int256 _answer) public +``` + +### updateRoundData + +```solidity +function updateRoundData(uint80 _roundId, int256 _answer, uint256 _timestamp, uint256 _startedAt) public +``` + +### getRoundData + +```solidity +function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +### latestRoundData + +```solidity +function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +## MockKeeperRegistry + +### registerUpkeep + +```solidity +function registerUpkeep(address target, uint32 gasLimit, address admin, bytes checkData, bytes offchainConfig) external view returns (uint256 id) +``` + +### getState + +```solidity +function getState() external pure returns (struct State state, struct OnchainConfig config, address[] signers, address[] transmitters, uint8 f) +``` + ## Functions ### DEFAULT_BUFFER_SIZE @@ -1706,118 +1800,292 @@ Query the current deposit count. | ---- | ---- | ----------- | | [0] | bytes | The deposit count encoded as a little endian 64-bit number. | -## ISSVToken - -### mint +## OnchainConfig ```solidity -function mint(address to, uint256 amount) external +struct OnchainConfig { + uint32 paymentPremiumPPB; + uint32 flatFeeMicroLink; + uint32 checkGasLimit; + uint24 stalenessSeconds; + uint16 gasCeilingMultiplier; + uint96 minUpkeepSpend; + uint32 maxPerformGas; + uint32 maxCheckDataSize; + uint32 maxPerformDataSize; + uint256 fallbackGasPrice; + uint256 fallbackLinkPrice; + address transcoder; + address registrar; +} ``` -Mint tokens +## State -#### Parameters +```solidity +struct State { + uint32 nonce; + uint96 ownerLinkBalance; + uint256 expectedLinkBalance; + uint96 totalPremium; + uint256 numUpkeeps; + uint32 configCount; + uint32 latestConfigBlockNumber; + bytes32 latestConfigDigest; + uint32 latestEpoch; + bool paused; +} +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| to | address | The target address | -| amount | uint256 | The amount of token to mint | +## UpkeepInfo -## IWETH9 +```solidity +struct UpkeepInfo { + address target; + uint32 executeGas; + bytes checkData; + uint96 balance; + address admin; + uint64 maxValidBlocknumber; + uint32 lastPerformBlockNumber; + uint96 amountSpent; + bool paused; + bytes offchainConfig; +} +``` -### deposit +## UpkeepFailureReason ```solidity -function deposit() external payable +enum UpkeepFailureReason { + NONE, + UPKEEP_CANCELLED, + UPKEEP_PAUSED, + TARGET_CHECK_REVERTED, + UPKEEP_NOT_NEEDED, + PERFORM_DATA_EXCEEDS_LIMIT, + INSUFFICIENT_BALANCE +} ``` -Deposit ether to get wrapped ether +## KeeperRegistryBaseInterface -### withdraw +### registerUpkeep ```solidity -function withdraw(uint256) external +function registerUpkeep(address target, uint32 gasLimit, address admin, bytes checkData, bytes offchainConfig) external returns (uint256 id) ``` -Withdraw wrapped ether to get ether +### cancelUpkeep -## Buffer +```solidity +function cancelUpkeep(uint256 id) external +``` -_A library for working with mutable byte buffers in Solidity. +### pauseUpkeep -Byte buffers are mutable and expandable, and provide a variety of primitives -for appending to them. At any time you can fetch a bytes object containing the -current contents of the buffer. The bytes object should not be stored between -operations, as it may change due to resizing of the buffer._ +```solidity +function pauseUpkeep(uint256 id) external +``` -### buffer +### unpauseUpkeep ```solidity -struct buffer { - bytes buf; - uint256 capacity; -} +function unpauseUpkeep(uint256 id) external ``` -### init +### transferUpkeepAdmin ```solidity -function init(struct Buffer.buffer buf, uint256 capacity) internal pure returns (struct Buffer.buffer) +function transferUpkeepAdmin(uint256 id, address proposed) external ``` -_Initializes a buffer with an initial capacity._ - -#### Parameters +### acceptUpkeepAdmin -| Name | Type | Description | -| ---- | ---- | ----------- | -| buf | struct Buffer.buffer | The buffer to initialize. | -| capacity | uint256 | The number of bytes of space to allocate the buffer. | +```solidity +function acceptUpkeepAdmin(uint256 id) external +``` -#### Return Values +### updateCheckData -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | struct Buffer.buffer | The buffer, for chaining. | +```solidity +function updateCheckData(uint256 id, bytes newCheckData) external +``` -### fromBytes +### addFunds ```solidity -function fromBytes(bytes b) internal pure returns (struct Buffer.buffer) +function addFunds(uint256 id, uint96 amount) external ``` -_Initializes a new buffer from an existing bytes object. - Changes to the buffer may mutate the original value._ - -#### Parameters +### setUpkeepGasLimit -| Name | Type | Description | -| ---- | ---- | ----------- | -| b | bytes | The bytes object to initialize the buffer with. | +```solidity +function setUpkeepGasLimit(uint256 id, uint32 gasLimit) external +``` -#### Return Values +### setUpkeepOffchainConfig -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | struct Buffer.buffer | A new buffer. | +```solidity +function setUpkeepOffchainConfig(uint256 id, bytes config) external +``` -### truncate +### getUpkeep ```solidity -function truncate(struct Buffer.buffer buf) internal pure returns (struct Buffer.buffer) +function getUpkeep(uint256 id) external view returns (struct UpkeepInfo upkeepInfo) ``` -_Sets buffer length to 0._ +### getActiveUpkeepIDs -#### Parameters +```solidity +function getActiveUpkeepIDs(uint256 startIndex, uint256 maxCount) external view returns (uint256[]) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| buf | struct Buffer.buffer | The buffer to truncate. | +### getTransmitterInfo -#### Return Values +```solidity +function getTransmitterInfo(address query) external view returns (bool active, uint8 index, uint96 balance, uint96 lastCollected, address payee) +``` -| Name | Type | Description | +### getState + +```solidity +function getState() external view returns (struct State state, struct OnchainConfig config, address[] signers, address[] transmitters, uint8 f) +``` + +## IKeeperRegistry + +_The view methods are not actually marked as view in the implementation +but we want them to be easily queried off-chain. Solidity will not compile +if we actually inherit from this interface, so we document it here._ + +### checkUpkeep + +```solidity +function checkUpkeep(uint256 upkeepId) external view returns (bool upkeepNeeded, bytes performData, enum UpkeepFailureReason upkeepFailureReason, uint256 gasUsed, uint256 fastGasWei, uint256 linkNative) +``` + +## KeeperRegistryExecutableInterface + +### checkUpkeep + +```solidity +function checkUpkeep(uint256 upkeepId) external returns (bool upkeepNeeded, bytes performData, enum UpkeepFailureReason upkeepFailureReason, uint256 gasUsed, uint256 fastGasWei, uint256 linkNative) +``` + +## ISSVToken + +### mint + +```solidity +function mint(address to, uint256 amount) external +``` + +Mint tokens + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| to | address | The target address | +| amount | uint256 | The amount of token to mint | + +## IWETH9 + +### deposit + +```solidity +function deposit() external payable +``` + +Deposit ether to get wrapped ether + +### withdraw + +```solidity +function withdraw(uint256) external +``` + +Withdraw wrapped ether to get ether + +## Buffer + +_A library for working with mutable byte buffers in Solidity. + +Byte buffers are mutable and expandable, and provide a variety of primitives +for appending to them. At any time you can fetch a bytes object containing the +current contents of the buffer. The bytes object should not be stored between +operations, as it may change due to resizing of the buffer._ + +### buffer + +```solidity +struct buffer { + bytes buf; + uint256 capacity; +} +``` + +### init + +```solidity +function init(struct Buffer.buffer buf, uint256 capacity) internal pure returns (struct Buffer.buffer) +``` + +_Initializes a buffer with an initial capacity._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| buf | struct Buffer.buffer | The buffer to initialize. | +| capacity | uint256 | The number of bytes of space to allocate the buffer. | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | struct Buffer.buffer | The buffer, for chaining. | + +### fromBytes + +```solidity +function fromBytes(bytes b) internal pure returns (struct Buffer.buffer) +``` + +_Initializes a new buffer from an existing bytes object. + Changes to the buffer may mutate the original value._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| b | bytes | The bytes object to initialize the buffer with. | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | struct Buffer.buffer | A new buffer. | + +### truncate + +```solidity +function truncate(struct Buffer.buffer buf) internal pure returns (struct Buffer.buffer) +``` + +_Sets buffer length to 0._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| buf | struct Buffer.buffer | The buffer to truncate. | + +#### Return Values + +| Name | Type | Description | | ---- | ---- | ----------- | | [0] | struct Buffer.buffer | The original buffer, for chaining.. | @@ -2139,271 +2407,3 @@ function writeKVMap(struct CBOR.CBORBuffer buf, string key) internal pure function writeKVArray(struct CBOR.CBORBuffer buf, string key) internal pure ``` -## MockAggregator - -### version - -```solidity -uint256 version -``` - -### description - -```solidity -string description -``` - -### decimals - -```solidity -uint8 decimals -``` - -### latestAnswer - -```solidity -int256 latestAnswer -``` - -### latestTimestamp - -```solidity -uint256 latestTimestamp -``` - -### latestRound - -```solidity -uint256 latestRound -``` - -### getAnswer - -```solidity -mapping(uint256 => int256) getAnswer -``` - -### getTimestamp - -```solidity -mapping(uint256 => uint256) getTimestamp -``` - -### constructor - -```solidity -constructor(uint8 _decimals, int256 _initialAnswer) public -``` - -### updateAnswer - -```solidity -function updateAnswer(int256 _answer) public -``` - -### updateRoundData - -```solidity -function updateRoundData(uint80 _roundId, int256 _answer, uint256 _timestamp, uint256 _startedAt) public -``` - -### getRoundData - -```solidity -function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) -``` - -### latestRoundData - -```solidity -function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) -``` - -## MockKeeperRegistry - -### registerUpkeep - -```solidity -function registerUpkeep(address target, uint32 gasLimit, address admin, bytes checkData, bytes offchainConfig) external view returns (uint256 id) -``` - -### getState - -```solidity -function getState() external pure returns (struct State state, struct OnchainConfig config, address[] signers, address[] transmitters, uint8 f) -``` - -## OnchainConfig - -```solidity -struct OnchainConfig { - uint32 paymentPremiumPPB; - uint32 flatFeeMicroLink; - uint32 checkGasLimit; - uint24 stalenessSeconds; - uint16 gasCeilingMultiplier; - uint96 minUpkeepSpend; - uint32 maxPerformGas; - uint32 maxCheckDataSize; - uint32 maxPerformDataSize; - uint256 fallbackGasPrice; - uint256 fallbackLinkPrice; - address transcoder; - address registrar; -} -``` - -## State - -```solidity -struct State { - uint32 nonce; - uint96 ownerLinkBalance; - uint256 expectedLinkBalance; - uint96 totalPremium; - uint256 numUpkeeps; - uint32 configCount; - uint32 latestConfigBlockNumber; - bytes32 latestConfigDigest; - uint32 latestEpoch; - bool paused; -} -``` - -## UpkeepInfo - -```solidity -struct UpkeepInfo { - address target; - uint32 executeGas; - bytes checkData; - uint96 balance; - address admin; - uint64 maxValidBlocknumber; - uint32 lastPerformBlockNumber; - uint96 amountSpent; - bool paused; - bytes offchainConfig; -} -``` - -## UpkeepFailureReason - -```solidity -enum UpkeepFailureReason { - NONE, - UPKEEP_CANCELLED, - UPKEEP_PAUSED, - TARGET_CHECK_REVERTED, - UPKEEP_NOT_NEEDED, - PERFORM_DATA_EXCEEDS_LIMIT, - INSUFFICIENT_BALANCE -} -``` - -## KeeperRegistryBaseInterface - -### registerUpkeep - -```solidity -function registerUpkeep(address target, uint32 gasLimit, address admin, bytes checkData, bytes offchainConfig) external returns (uint256 id) -``` - -### cancelUpkeep - -```solidity -function cancelUpkeep(uint256 id) external -``` - -### pauseUpkeep - -```solidity -function pauseUpkeep(uint256 id) external -``` - -### unpauseUpkeep - -```solidity -function unpauseUpkeep(uint256 id) external -``` - -### transferUpkeepAdmin - -```solidity -function transferUpkeepAdmin(uint256 id, address proposed) external -``` - -### acceptUpkeepAdmin - -```solidity -function acceptUpkeepAdmin(uint256 id) external -``` - -### updateCheckData - -```solidity -function updateCheckData(uint256 id, bytes newCheckData) external -``` - -### addFunds - -```solidity -function addFunds(uint256 id, uint96 amount) external -``` - -### setUpkeepGasLimit - -```solidity -function setUpkeepGasLimit(uint256 id, uint32 gasLimit) external -``` - -### setUpkeepOffchainConfig - -```solidity -function setUpkeepOffchainConfig(uint256 id, bytes config) external -``` - -### getUpkeep - -```solidity -function getUpkeep(uint256 id) external view returns (struct UpkeepInfo upkeepInfo) -``` - -### getActiveUpkeepIDs - -```solidity -function getActiveUpkeepIDs(uint256 startIndex, uint256 maxCount) external view returns (uint256[]) -``` - -### getTransmitterInfo - -```solidity -function getTransmitterInfo(address query) external view returns (bool active, uint8 index, uint96 balance, uint96 lastCollected, address payee) -``` - -### getState - -```solidity -function getState() external view returns (struct State state, struct OnchainConfig config, address[] signers, address[] transmitters, uint8 f) -``` - -## IKeeperRegistry - -_The view methods are not actually marked as view in the implementation -but we want them to be easily queried off-chain. Solidity will not compile -if we actually inherit from this interface, so we document it here._ - -### checkUpkeep - -```solidity -function checkUpkeep(uint256 upkeepId) external view returns (bool upkeepNeeded, bytes performData, enum UpkeepFailureReason upkeepFailureReason, uint256 gasUsed, uint256 fastGasWei, uint256 linkNative) -``` - -## KeeperRegistryExecutableInterface - -### checkUpkeep - -```solidity -function checkUpkeep(uint256 upkeepId) external returns (bool upkeepNeeded, bytes performData, enum UpkeepFailureReason upkeepFailureReason, uint256 gasUsed, uint256 fastGasWei, uint256 linkNative) -``` - diff --git a/services/keys/scripts/dev.ts b/services/keys/scripts/dev.ts index 8d427b0a0..11060f947 100644 --- a/services/keys/scripts/dev.ts +++ b/services/keys/scripts/dev.ts @@ -2,8 +2,12 @@ import { $ } from 'zx' void async function () { await $`npx esno -r dotenv/config src/index.ts help` - const dkgServiceUrl = 'http://0.0.0.0:8000' - const groups = [[1, 2, 3, 4], [1, 2, 3, 4]] + + process.env.MESSENGER_SRV_ADDR='http://0.0.0.0:3000' + process.env.USE_HARDCODED_OPERATORS='true' + + const dkgServiceUrl = 'http://0.0.0.0:3000' + const groups = [[1, 2, 3, 4], [5, 6, 7, 8]] for (const group of groups) { console.log(`Starting ceremony for operators: ${group.join(',')}`) await $`npx esno -r dotenv/config src/index.ts create-validator --dkgServiceUrl ${dkgServiceUrl} --operatorIds ${group.join(',')}` diff --git a/services/keys/src/providers/dkg.ts b/services/keys/src/providers/dkg.ts index ba91d1b6c..cf371183f 100644 --- a/services/keys/src/providers/dkg.ts +++ b/services/keys/src/providers/dkg.ts @@ -2,9 +2,8 @@ import { KeyGenerationInput } from '../interfaces/KeyGenerationInput' import { Share } from '../interfaces/Share' import { DepositData } from '../interfaces/DepositData' import { DKGOptions } from '../interfaces/DKGOptions' -import { spawn } from 'child_process' import { ReshareInput } from '../interfaces/ReshareInput' -import { retry } from '@casimir/helpers' +import { retry, run } from '@casimir/helpers' export class DKG { /** Key generation service URL */ @@ -153,7 +152,7 @@ export class DKG { */ async start(): Promise { - spawn('docker', ['compose', '-f', 'scripts/resources/dkg/docker-compose.yaml', 'up', '-d']) + run('cd scripts/resources/dkg && docker compose up -d') /** Wait for the success */ let pong = false @@ -169,7 +168,7 @@ export class DKG { */ async stop(): Promise { - spawn('docker', ['compose', '-f', 'scripts/resources/dkg/docker-compose.yaml', 'down']) + run('cd scripts/resources/dkg && docker compose down') /** Wait for the failure */ let pong = true From 9d6f0b1fa93aa2f950558eb97710efed8dc1ed65 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Thu, 20 Apr 2023 12:51:06 -0400 Subject: [PATCH 07/78] Add updated rockx-dkg-cli submodule --- .gitmodules | 3 +++ services/keys/scripts/resources/rockx-dkg-cli | 1 + 2 files changed, 4 insertions(+) create mode 160000 services/keys/scripts/resources/rockx-dkg-cli diff --git a/.gitmodules b/.gitmodules index cc8b08c33..c3081fa2d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -22,3 +22,6 @@ [submodule "scripts/trezor/resources/trezor-user-env"] path = scripts/trezor/resources/trezor-user-env url = https://github.com/trezor/trezor-user-env.git +[submodule "services/keys/scripts/resources/rockx-dkg-cli"] + path = services/keys/scripts/resources/rockx-dkg-cli + url = https://github.com/RockX-SG/rockx-dkg-cli.git diff --git a/services/keys/scripts/resources/rockx-dkg-cli b/services/keys/scripts/resources/rockx-dkg-cli new file mode 160000 index 000000000..d54b6deec --- /dev/null +++ b/services/keys/scripts/resources/rockx-dkg-cli @@ -0,0 +1 @@ +Subproject commit d54b6deec019c3c693f16311d7834a24a2975430 From 206475d097b397e345ce697550b91c856de4d8a0 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Thu, 20 Apr 2023 22:42:10 -0400 Subject: [PATCH 08/78] Add large fourth user stake to integration test --- common/data/src/mock/operator.store.json | 16 +- common/data/src/mock/validator.store.json | 120 +++++----- common/helpers/src/index.ts | 9 + contracts/ethereum/hardhat.config.ts | 2 +- contracts/ethereum/src/CasimirManager.sol | 225 +++++++++--------- contracts/ethereum/test/fixtures/shared.ts | 56 ++++- contracts/ethereum/test/integration.ts | 30 ++- services/keys/scripts/dev.ts | 2 +- .../src/interfaces/ReshareValidatorOptions.ts | 2 + services/keys/src/interfaces/Share.ts | 6 - services/keys/src/interfaces/Shares.ts | 6 + services/keys/src/providers/dkg.ts | 100 ++++---- services/keys/src/providers/ssv.ts | 35 +-- 13 files changed, 328 insertions(+), 281 deletions(-) delete mode 100644 services/keys/src/interfaces/Share.ts create mode 100644 services/keys/src/interfaces/Shares.ts diff --git a/common/data/src/mock/operator.store.json b/common/data/src/mock/operator.store.json index 4abfbbb14..b7cda2913 100644 --- a/common/data/src/mock/operator.store.json +++ b/common/data/src/mock/operator.store.json @@ -1,10 +1,10 @@ { - "1": "http://host.docker.internal:8081", - "2": "http://host.docker.internal:8082", - "3": "http://host.docker.internal:8083", - "4": "http://host.docker.internal:8084", - "5": "http://host.docker.internal:8085", - "6": "http://host.docker.internal:8086", - "7": "http://host.docker.internal:8087", - "8": "http://host.docker.internal:8088" + "1": "http://0.0.0.0:8081", + "2": "http://0.0.0.0:8082", + "3": "http://0.0.0.0:8083", + "4": "http://0.0.0.0:8084", + "5": "http://0.0.0.0:8085", + "6": "http://0.0.0.0:8086", + "7": "http://0.0.0.0:8087", + "8": "http://0.0.0.0:8088" } \ No newline at end of file diff --git a/common/data/src/mock/validator.store.json b/common/data/src/mock/validator.store.json index 4319826ea..8a4ae5534 100644 --- a/common/data/src/mock/validator.store.json +++ b/common/data/src/mock/validator.store.json @@ -1,7 +1,7 @@ { - "1677691613687": { - "depositDataRoot": "0x35c168d0c415d4f737c0fbf713e4934eeaa41d3ca49a9614769db5a254e3a9a2", - "publicKey": "0xad178138705d1c19793946a8d2b030fdd89b80f6fb7f2c3a8c269558cb8623b86305f8f640007a30c1559c8dcaabd6ef", + "1677706967978": { + "depositDataRoot": "0x0d3537f422edccad29e6b6c585f1476171b281ecf600f5f758ebfe7483ae0cb4", + "publicKey": "0xb18f3f007086e8a7cf3848f55bf1e21eeafcf34c6e30b1fef283b158e9ce4769df4871f2a01cc6d0e37c18a3e1717d2d", "operatorIds": [ 1, 2, @@ -9,23 +9,23 @@ 4 ], "sharesEncrypted": [ - "0xa694598da0a340260fd809ce9cbf77cf8d3480b0077d6e85597e405415e692a0e4d0d1e527a521043587a375bf639d94faff5168f1b9608e728ee2dca809c4220847812d7a54cd4f698345e0f52c6b813253b759b00b6ce4072446055485ee2b125e6a44c593252e97532f402afdfc0ebb049746a0740875963cf877723694b0f2e912e47e4c341720a4c3a724350db3ef88d9837781245b4c02e284947d014cd1111607b6f56dcf1c135f1d41dfb19549839a2b65499489cb9cf84902130b5ee887d62ee56e0b2f3f065abe7303e1ec8c0befb93b829747dfb776edd79dea20215a3213f10b4086f02572deb1cbea8965988aa6e27659d86e8d691fa875c095", - "0x253e144a5e4e3a9ed957daee238e34d36c8a369a4a128bdd53f0f9747608715e89fd36921f304f5e01ffa27b1c3996d667da4d1121c8c3e5c33c46df99fa058f062381422986edd888a68c94ebe3c98efbf6f3045e4f8460ee5fcfdfdcc95b87a47892d167e07b29f9bfb507fc9eb6303a2aa38f7fca58e53037cead06afbfa23bde8216632968ecff531639208ffeb3d0e2b28a767ff26ef09beb8c724b5f6eb01d78a73592987b87e5d9f25c3593c66482a2a926b9f7fa8afcad0b83716b33c7e658782369a47ed7e919a9bb3613814789d6bec3d6abc41c8961158f93728e42f1a5a88f2590e4347eb65efb1672b143d27fb13973a8fce9750b22b10be621", - "0x8c94f7dfbbd65a29759cc38a0e7cbc95542d9ff45b8aa26122ea7dc308c1461602663c54d78f04b8e1b4332bbb7ddfa2d1fb63f720af5cc357b6a0bb0050a47ea702c535bdbb1545d4d2251f34e6590aa0490f2117b7698bc22abc823730dd47d282441a447fd7291e7e2991ddff7625c20162281c99f3a1bd26c56f0d84c50805d3ef18cb814fa91a872e8b18cc41024b200d8b6b0f4421586d8c4bd5a555547bf9a8c339921817708677f79d6c48c091405f53eed5cc4969e493c4e1adb41deea04ca32fce492d117c0287e0a6297066f37ec83b8935521f9d9df65967cdc8f20827c855c004be29044dde92925b87edd91dabdbde6a75463d30c8934c46be", - "0x117315a58d57e4593b41a1f403c06c7dbb5bac2a5af20ea35958cc1fb521f185585a80ad95d8ea6507ab33c6bbda172d045c3baa2e2813fd7d65c8efd9a60f656eb552e9f2d105aa632be9aed3d751d07b0f3305446069e846da13d600e6146073ab84fb95df28d05fe7f368334d8cc0278edbf5dcc088b0afa88482f0b3d853ac11b51dff60f142778ddb81970a2b3c2f95f5af3f2411c55b65833c61a6367978863f6dcc5c446ae3f6ac6ed281ddebbe447689cf2a593d7e1e57cf89268a115b55ec714a52de6a5a4f1fb0c58a47b04197df2e0d553a089fbade2add1f8c433abd0f1d838b1bee928e2f0d843787e961f6e594226891997881f8cc0d27feb7" + "0x18dafffa73c4ab42db13cd672467ea7cd0efea152c67f63417f2262f12e77304ee07cd545e22bb8a45d3676b2e2d1f6291236950ce6dd415e4e89f861ac2e51feea95cdd92e9b3f255d46623d354630e31906229ac80fea040b1d66f616086327127fd93c9949bd5d0bbe8dd2ca06cacd17e6f0a6a6b74c29f1512f27e71c643ad2a5ce261bb0f553d03a3df7853209eb047c1a4d8a056ca666d38a3cf5a453f61fae1547eb09920ae4a3b530bc74055eb050a0569e9bee8644afdc45a298c5fe700d18747d19c69bde6a2a9896440bfff4fdaae2f9345f8893a57a1b0576476ae97d76934a0030c81845db56860ee1705fce67d945398495b7d534f40fa6879", + "0x68086721c5510ad396852e4b571b2c7e9f5a7aa9228cfdfd4a17577b6a72af56efe6d67a5c223617dfefce37d4cf5dac7856e6c4501cb091eaa213bc226cad5db0c8ff846dd835cdcd7d2b01d5ca81e1c2530b82b9e600804894792589a1e862f84bb0a28d528f25f846c739c229c80cdb6f20691f00413bcbbb16718ee812b530be3f5406ed7d7b6adb25ca2ea33f0d49c5ddc932e81de8b1287cb5b59ed8bdb61dd87d242c5ad3b331ce08ce281c01aa5cc48d6c612795908b88d75be23127c3c19016bb358a0cdd22345a0d0562ad2a062fec19d3bb18b607b52fe124e228628ccc49a7b3105181fefd8310f80e53aae9e58a51838526263def0ca362ecbd", + "0xd88540e6c9808ded94249eb311ef42ba25b3f4f3e0e03442bf4549ea7c40fbeea9cf44755a2f5d6badc0ce5731c65fcba979d55512c992b42416feccca01b31ec5da53119b92a922955263dcee5d30764af93a4a1edb29f309373ecee24b6d5e268904a65510552278582f9f6d439d862b24d3356dfa1357cef79806ecafde3aa47ed835b34e4890568d72d7306f6be95c770fad609dd8d94fb05c77793e35b6d51b072141be3958caa69d7baa2e3f00048c165fbba10bf7922b11bee935523417b3d3dd14b0e84175db4b4116f6ba39beccb7f445b3f5fba38b578cedfcf1fd5a63835cd6498fef1d72424887f5cf2842277bafdcd10f54a5c4f28f01f151d8", + "0x35ce271f77983f8a2a976e98a9308549d46d24254ba49ad5aafe0fb4d3a40b2f33ce3f28cf9064fc0a9c9d166a394d99340634a533cc1e698ae29c43a32bf684aca226322cb997e9be0a3507e04da3aa2c6e77a3295f1af202f2d78567a8608934ea48fa4d2d0611b0a7c5e50847c61d625170947fd1cbae36acd386ee85b8786a2a4e3159eb9f49bb36eeed3de1fb160d2dbfc3da8c5bba7cfa706eaa96d17a5825a92facdae97c215828dc00d5f71c46c59786bbb31241ea8a92b8e50369655e7b98428be6c829ec6c83378f0cfc173a14424a04cbd255e55146996efeacf53d3eaef778eaa50b59fdd5e104d83086ec6c283d94f8cb91b5595ab0caff3431" ], "sharesPublicKeys": [ - "0x9880aa9807a26b676e6b74fd2c3c47ae09e9a7d8b36bc62cb1a97b4e2954bd3968165d7a706c7015f78fefef653cfdf3", - "0xa6e9beea57b965402d4bda55e6f07384b9886bacdfd9ee2ed51480b4e73c74f8489392f7d34d196479b023071bebde56", - "0xb9f11cd8d1b6e5bb951bcee0b019547e8c150534ecdd6f6a40ed2115497120965aaff645115023f78890546ee084ce23", - "0xa4572686fd833d63797cfc235277399f17e22d8c91d12a97e0b6f30ae2560149109328d81bea5b0ea3e17c5e6ba40c9e" + "0xa92e78bf681839252b73d747bc526c21c7a045b0d0d52380387823959ebb7ff61becb91b09890a0e31f20e47e16055c1", + "0x87c6cc2c7bf521187596902533649ad190d6a9eac811e39d82433b9224f2507245febecf59ee4cca02960ba01313df5f", + "0xa2fc1ace1dfd4f6f915d2e9ea2ae311d7e0749cde3ce8ff96b73007793c9afe58654befbcb8c18b81bf5abad04a641b1", + "0xa643c84020406e575abbcf03095fd1c7e80ebe43e200f751047458ccca56448273fdb1ad7f18cd94d7c9b5fcedf56db8" ], - "signature": "0x8f7ef7fb9171199e715bde2a2cbc9ab9c15b2583e1c6ee62816e3df563cdbb22b11530d42cacd76350d59b914c68f1c71707dd5b0d983626b81418dc65c16d29a8bfe6dba92740ac5ab04525beb43524ab206e9b7e0b41b68cac682054f07a1e", + "signature": "0x80e4e088bd71d8dd4d1d462ab1cc8344326fd6ba5f0c3ea594ad5a45130ce25668eef17dd333910861ccd64e423b11490614b70afc37736b6ebe5f2c3e7c2b628b0c91e246279f0e4f9670eee7614f37d66cf114ed561a2f7e02eea906fac74f", "withdrawalCredentials": "0x01000000000000000000000007e05700cb4e946ba50244e27f01805354cd8ef0" }, - "1677691665295": { - "depositDataRoot": "0xb68a2edad8b5d417c4ee85602f8103bd73f6d99def95a6a26e8f5d7784869a48", - "publicKey": "0x862d918edd3733e390b6cf12780c854a4321d9fd439ddfa8ae2365fe92d56b78a6b39be2a5335ef6a55180c094b2fa7b", + "1677707111195": { + "depositDataRoot": "0xe9a59c4c2f6a50c6de96602287795b8224ff2f2047e807da75ef1f2ec7694842", + "publicKey": "0x96b198a59dad0063dc8ea086af351c3eecf79136e5e6895d5029ba1a4698c631485895173c466390a59ca13b0f2a2e68", "operatorIds": [ 1, 2, @@ -33,23 +33,23 @@ 4 ], "sharesEncrypted": [ - "0x485e06b6a71ede328a015ac8032012c79ed74f2fd4fe7b589a6d373e47017eb0b5dd03584afcd1399f9da29dbef80237fb331beb1e780bebbff6945162ec0a3c656bf71568f00b2b0ffa0b87d39b6ae490d8a4e35d4dea4a7ca5b6e8ca9c896c819b9423c7d6aac798c8f4cd2a086d8ce0d534155229c5280ecd4744894aaefe19c5971f5a5d7c9a795c40e56cae7c14860e91ba4a1532122974846b6d847f35c94077cf94ad971ea5a467ee7c49e537c27e81386f15cb5d9179d237828970c20a99480b06bc572b15c98ea6b458bfb07ed067a40569967ab4b10b65211b15df21272d26964e53b81c019d2101ec3c86db7ace67d50e6a339aebe29ff1a72159", - "0x0445ba303bcf117f4013b13cf32ac8f341f4f612dbbbaf7341344728aaa44c645f852c8e0674224d7189eea66fe1682210e7764ac9b3127bd5f30059a0e4c2af1cbee7ef71fc804df4ef095f928bf874b00697745efa90b8ca9d586369296b8b35350f5fdf7af2215b71d82125ccf70c4aee880891e995cc72d90e54d32b351941878e7790e9287842eb4e6e4229c863bd07646a6a2f11f8eabae4b61b478f6ec3e2cf7781367fc11029f7b82569f9a85f88c537fb625f045d2d678f6a8d93582c19f9dcccae4233ba52b937905e2f20c5fa4335faeb0354c8fcf795bc44d427c4e67aa405c8980fc9fca99975b13d52a309f930e947447b2adf82a7ab9077ae", - "0x315c10991a4fc2682d37fa9d0923388915c9a1cf82bc462b9e6c2f9494225cbdee4ce7fc9e65da1168416d385f16adeeaba19f67c6482e3c934cc1e7db11e139e170989b6eb7807f6b0d25a7207306c30d6fbb9b71ae497f5339bd0bdb47ba3a8bcc657acc5c1f672cc9065dc1d87923cf7d635293fcf8e3147157caa4f3e5f133df77d4e8957255730b883d54c2dd1594fbdf222de4ac7611ae2ff0de0d383b0ee925693535a10a7814c8c0b78919ff2d105392cb7e2fd55c8c3dc1641126202b513237b0a05e46e48de8128bad0d7b8f38f2b1e73d32b38c05650f775c0c4a5c772ee31e04efd400c96a862edd69c3e37510e2ebdc2d9087eff6a9c67c0dad", - "0x862a2830c4fab5ead2cecda80a19c649fec98965230ff50a5c23eb8682550cd22c9fffdddf43ab14da2a868c73bda6376ff129338e780ebd2a31d93ce778255c5ee697e6076d38317d2b62b6df5d74215c47becc535db83c52c7cc3f6cf9c9c3388481ec56f1896c12662a7a4eccaafb51c04f86a4afbdec7a961c782d3b27fd21444792e17c6eb6cbf545cde3ff8decf1a5bf63efbc4ab217293ca3e24d4b7e5d370eb16b4d77fe63d1e4dce2a43e313b169865397eb2a92f7e7fee737709f8058db57c746098678a0d9e03ce88f12f0576f848829f07c101d42027bc866db9054e5f06c0f6c31f64bea4e4943c23edf32185c5d2e735ce2bcf5772f68ca93d" + "0x5f1a5ee977521066c2aa734c730816f0f74bea0d9358d6534552ceec238cb0b4aa87facaf7bc057da10ccc4aad6dcedf5083cceb9187c86769c4de2c14e7561b6e8add1e02cb7626170ebbabcddb197498557abf5785c7eaa92901b9b7e5cdd1869d587f564ceb68d84eb03b7e721b9718eef17fec817b5ac8496932a297990dbbb18674e35fbe7f0a6c8f9280dc7bf4f662ca97009557954bf2c11320a7b8869070d6f79e0e5e1227262245c03a0e86b4d065985227963632513160997bb5ddabae9e0549ae6f8b06ffd314582aee7e7fc7f632ebf71b5c24a4d1e1ef3c5ecc945cb39dd6d6c51c8d3d5870d5cb00fe5c4a4348acbb135ef7a5aedbd616912e", + "0x3b1623e4d1155dd53bafb51eb6447768a3de11b4feb2424c7a1eabab71c171839588c2ca9d9e3f9994ad5d75ed80fb90f90ccc54f1a747976d49652006c5f826a6e9139d0e02483c38f63e4554e8050fc42a342f24ce30257d7b86602e6a03de2212e006ecec429fcf519a7fbc1b90898acd94e48a4e65c1555072a1b6cd3c26fefc5fdbcc3a0b1af6a08d76a218b637415e726a40c19fadb8a15192c39885091d39750142a85b7660f38a7d740dfacca3c013e63e8a08262219b18c005f54ba9621376f6f9f09ed30a17b19f7f5bbfce422cf52ba4a1b845bba06b0ce9cdac86b9878087cdae885af3e3cb55d36ea66fa17d4c0784af9038e12fa3af8ec5100", + "0x2209adb28728a448adc0eda32b9542a457c0d61454f00e0c59b21b0074e0fad414c2b31b0715cfe3fd410d6df2215f3dbc9f7ae4dd709a5082e7c7475860843fce0353073f3c48787f81f6f695f9b9c643bfa2bf7f85aa19568f8b9c205235789525c5eb3ddf7a0f91ff6029d241eefb55dbaa0280e33693c912f6485d86e04b75b63689f48371bcda34a7d1077363334320b0afbe02215c17225d055e4ede7d1e26ceb170e0c03f6cd62b785bd06f78ec9b653b92d326ccc6ea1b85bf5f0fac2bb0816fa8dd00137b5dd44f9d067901ae8c54783d1152a98e8e183b38919a062d8cf62ffeeb6969c62287a0459f3540a12d89aa828da46ba837404a72cb4030", + "0x29b88dc2056a7b1f0deacac7532fdf112a25c5b3ae51680ebe62cc6de99b0ad253249e74cf37438fe0334e60b470605d7e7ceab34daf702f410a7ee1f1b52e77928c77094fcf47fc991c8dc986cac293405b3fe66485996a3beefaca2bc3b8543d1b540a0a6921eee041650c951fea376952a038793d5d23670a3a7fd4bc543ea87681029c806bdc17021709e731d5540cff24fb91e189cc2b5e59f04c3ff0e96ca4f3318aded0c09dfa6cbce9b46f511ce5038de3b2efda2a60c12534463c40ede614a7963058fdb47848176a7e3753a654a426c26d8488af644ecb2e26d5ef00cea4bcf65909932dee8ff48f9ec7a9f82268cceec4c029a8fffd4920824e68" ], "sharesPublicKeys": [ - "0x8f9edfdad0541ead1e094a4be7e835154dab8c170b6bb3bcda1290678d8c94dc91bbd9587d7bf725054629dd90f8b0e1", - "0x87179ff1d3734c8f04ea5889766f82b389e8b259cbfc2f8699af0d199280a285949e141a2d5d2292e7043fb3c8abb25c", - "0xb8e67dfc405649cd372d272786786e867c849ef6249da95d44eb4156e0e02218d45f23f824a76c788969d37c39daf88d", - "0x9631daf204400612d598d0874d233118fb7493a9506a77b30e8ab731f82e66efd8b7ed57e53a5e54ff26b75b7d7150a7" + "0x87b2dce78bdd092998949387c206a01cef0f69dfd4d85b72a288202f2a3e38c5780bb88734b48f455e52c4045d148a4c", + "0x85c09fa89fc3c9466fb8c906b9f1af158463f3b1b6eea8cb23406016102c83686f61fe82eae0d838d0166a312577b02d", + "0xa66380eed9ac85affe93f7387ab58261fe7679a9e25d5408dbe70754be46804990772b37a35a95aef4cf5127ada86458", + "0x88c1761c2955b75bc38c6d5ce64c972c46970d7ae00c701ec609d03ba3912d7ac040bae7fb8424d089e181e516ff0b41" ], - "signature": "0x8f7a49ad254ed8ad9ecb5c82dd445d92100e5fd2db5d513f6209a97c81754385c23d8dc5a2f0a5303a451640b20b8832047f74e4c991c0930e3d8ed4963f8f9fc3c7ed21bc5159591b80d060efbb4bbdd029982738799ea4721eb9c29d54e195", + "signature": "0x91ec46da324b8736f7f1a6ebe3b4bedc83511230c282af24b657e1dab9f11081507c34d02a02c4d5c7049d10407d73b915fa28a66b1701e1e0597406ea2b23d485227822faaaa3f80629a72bb7d15352a6a9adfc73cf84aeab6a725dcc6cda84", "withdrawalCredentials": "0x01000000000000000000000007e05700cb4e946ba50244e27f01805354cd8ef0" }, - "1677691693122": { - "depositDataRoot": "0xed1b37e4ad78bd34380a83679c68d21746173f209c6fce2cb9e8db2fd756e969", - "publicKey": "0x8cf6da2a54beebd10085102253521826bee0a2caea6e0ac6d66bbf8eccf8884e6e3768b058a331d8318fb6e0985a73ed", + "1677707132781": { + "depositDataRoot": "0xe9dfc7e7836f0582a810c29d35678afdf11e88bddf02b326b3331823edf8a382", + "publicKey": "0xa21d084713a2ebc0013e1effb3b94a71207617b859a9b5353e2ede5d4b4f8ee2f136eefc41a7aa5c4f62ac865a88191b", "operatorIds": [ 1, 2, @@ -57,23 +57,23 @@ 4 ], "sharesEncrypted": [ - "0x0d356ee3d051fb381f5aba5f64b5a49da190579c6dce69a046d207a6e0e001887408a587f7fad8bc5e8efa1131e1900dfd7b5f3bed151029f52ec75324e62b9e4141c7f21b880626105986b9561ca8024ed664d34cc3cf2b3e23d16d29fdc3270b4868335e9d0939960ab773d5f04e451cc8a7da04aeaaa92f6c4b3e17335f90755e9889e6dc547962be18ac1f7a7a9194dde00c3e9c36af3b2b71f7ec5c0fc236995afb65d1822986814c81fca0f3720342057a2bb8c1de044fd866605f0e08f353ff3da7324178f7cdd2cae4a7684c4202ee8b28dbb900515b57465eac5f22ddc7e73259f2fc10d1095eec872d8232b8063430209bd12aa8365049ef04fae1", - "0x9efa615ab35d44c718ad9e55f4955279431819ac83d115e73fa8fab1cf80d00bfd69c12ea8c5543c30273b28f7f905f04cd28a6d3dafa32e426ab9be046b423d020756e64254099e28c7b738b375e65b520b59db9f20acbd4722917d2a228f992d2b8dbe140e669502a2f599273c7c3dc7a18bbdc547a0f5dc7f6bb16ceadaaaff58ee383f54a515c3948aeac39b83b8a2c643da65e352b6e03ab150476f93eb9f20a511d67cca946809102b1a46a34e8f5200c0d112b0a981f452af581a2e5bf3ca3b42c508f4299c19eaaaccd8122c9951930faac8257f2dd6c3df5367619867f4fef8c59b0218cc88e5c41d98cb9cd581fdcf8e4a8388d984c69ffe77e9b4", - "0x7f1946f33a326e404285c65ea631fd067b47687a61ecbca42f1d123c1bfd9cc998ee91c28f405f66449c3a6ec61c6973208423d17e1dffcf7c7d8581269a95b1aa8da6042f6cf32d2595f8670a752a7def77afd495ca1799eb36773f4ea73f0f0deb197d84dd6317e7489ba0bc757a8a7f2af7d858e29ef59cd2e3cce3ecb05d84cc49e91daa2e3d75c55644aa9fb15f457763014a1b538c442b5e0c187ac9e5c8d334966b84fb616d4329804b7f3e82d7cadbdb7016dd7c45617e124fa6fef06b176dbfbe09e4530ac08e412c0b5912fd29c4262b0f6d81b4c964c37baa5d8b2a35f7be3c5b0b4ad9dcce830cdedcc78f49a349ad12dff16fb7d65bae144d83", - "0x7bd52f418a4c8bbf96ce9bce63fb94f4d9caca741f71449392eb033d5e6b0f770796bf0830fe73cf5175505161fbf64ccc97e80b392882d81ca5055eccf88c3d2c1fdfa9cfef837d2236370972b865e1786b37972a693f4570156dacebd4041338c256f5f7ea70d9399d1bc383e44065382a65e142103ba1c6d290e84664d8cd737ecfa8386ed4123f501544d30250ca61b05f52fd6255a1bd4dc6bc47af368378ab01af7c4923e39ea4fa2f2443a2b3f614fb7c792af7de539476d86715237079a4efd97298bef28edeb661bb8265eb569308d49577e828c1e7345d41b25fff9d11d4e98be97a52caa53a04b1ab353160cef879b01b08b789059bd18f3b6dd2" + "0x56469cced6756ac54137940b1ba2499b700539da948bb0b219472f7077c2ca72378435ed0dd214719181f768850d7f1c088b885ed958a913aa14b30330b10e9e469090d0917831713fe39c205158e414230aa59ff836e8a37f2cd704df1049261bfb9a9f0293faf2d21f1f52a456e4ced9eb5619a0723695072419cd69f844e9bb6cc36399bbe149961de2306ec6139f48114593784bfdbf90f05fff3f334fad61e2fd3af60c4e382818576c3814906560fa6483545f49f22932620d61fb7ddc2d80c819f2ae54cba0670dda3557d910068107b31930b8a7341ae2820041420346ff37409810836010b626da2d74f28ff5dd244acedcbf543e902f8a7677a698", + "0x68dddec161975aa7ec3bbee170bddcdec2258f7b644ea8f50ce82f048e44f0d8835a2507bf431bb6243007fd64c7e20a9d31854e1f1a343a94140eff3ec0aade07a8ff21b18d78c256f255dba5a85510fdb8960e747b431969cf86f23c1e261aaa37e57fd9dd7dc6d08fee5f6915481359f44ca551f7481cfad889552b9d53c40395b1fbbb694d168c5314ed39763e708975a6a99d7457cfcdf45816c0f368228c2cacc80cc522c89ab554b8d526a37d26514bd26c9c7c145fa2a1958e3dae6fe62c38ce9fee93c0c85db656c2df6cd06187e5d58e4ce4ce234a8d80cf89f84e6ea7a8738a3a97cfcbda67466a588223aa86aace7aafabf8dc2d4e3e3ed6d56c", + "0xc404d2f72d148a3e8f951dd98656d33c171d3fdee85cb606447dfe487b27622d3f88eaadf503ff3b996c2ef5f5fbbbbb632e4d9643296e6dbe8e9b43bf9abcd82bb6e9bd730f955b6dd1d1ba9e3dc760cb9cb1a1cec4fbd3f060554f561c51251dcd44bacdecfcd896080d8b276bb5a3ffaa5f1eff427f77ee86642f12d19cb157be2fe3a3086c4dc5ae38069ef62b352f0c5e0019577c568cf00bbe11d7c4174a256469ee7b7ab26c0b638fab85c7252b175f0e1fc95c721f5b993fb445ebeb22ef1da652e007df858dd8084b270748f6a90d347c90f383f1e5ffcab77d8aa8f84541acc0f8bbf8d7dc51e36c66c285ced09bdaf56c002eddd8ffaff6f0a843", + "0x361a1fe13ec3bab36a011ba66e7a14a8efbee1bb6f4227b92e1b137ca89ce9a449af80b6df049966b564655a3bbed8163f99b3e3009f89ff749c005d6011d53e472c3f966913fd8a23ae5a9a0bbddb550e680af64d88ad0dca8b0598ce84c78d1acd667a80358fc4cd8e27488e89702d3927e18dd5caa2536a911a82abaa2bf7459dfd3c7b236966e7ec1b9f1514eb1209d15230d6783b19c36d997693d1157795d844c7af0c1fcd7eaeea7f3e0e9e6547b724107ede32e3d674fbef27a94349dfc7438ccce9d9bae3a6bb6273a361e9e1bd542c4d1a0862082f67822aa12bcdb8dcd7212ba88288af44a33b55990e0c1e519731bfdfc429fc0e3084abd8bdfb" ], "sharesPublicKeys": [ - "0x939c520dacd57bb55c839718aeb2b935faa38491c246e808dc9f0fc8d342f5318856441346bec10465ebf94e95782f12", - "0x883dba7b846985b60aa9b500a4916099947cca596b536e2265bbe25169e79d782efe031cea194225b55c5e722bcb58a6", - "0x93788b5e8c1f3bd6ad0bea8676b67ded8846f26a2ce675808c959a66149e0d57a68016aa3047d8528d16c8ede9e09bd6", - "0xa5333ab593b88b6fd28ea064bb264aa3e1f3371afc0f2ad57d4754942649b18be3624ec20a2ab8ceddcfb30256951689" + "0xa148a47cf96932ab7a10ca6457f0b2a9d0b81f1ca079668087b1e70ca30cf6feb799ca340c66c3e9f04ec1387ffe1dda", + "0x98b15a8569aeb5f475f24689b90c1b31b48e5d54f37cd8f15bad3b1a1877a2461e7c352adbd14ec0577d6151a408a03f", + "0x95dabd7d48c3f9703061bd28bc8438d73ddb4a6b2dca513aa461edbb8022eff8d9918ba7f8154721a355ecdc6c79b84c", + "0xad5faccb495c4c4cfc51546eac85676386cf08830bdc4d461d56d47ecaef7b7eb2a9cc8e148e8c8265ec0c58ba1f4400" ], - "signature": "0xb4b4a67d7e049c15930acfc3a7fc25d3651f015252d262e958f4afa7fcb1275fcad227f256d123eda32d117dcc8087e4185be9d05ab79d46092fdb7eb204b8baefc02348ae020434d023908472e47d9d14600e1adb8de8e8c5135d8b9d37d8c5", + "signature": "0x84c9afaacfb7b5e2e4388b82fd93520b73096b5d686fd1b96335f466f812d0b5f6c7f9388d02b9db7b64f8c1ec238a1005f765f324fb0b4d2ed8d75613116742b19bf05d699adab3c91829da8be939499dfc94d886cb4ea037050d2124497012", "withdrawalCredentials": "0x01000000000000000000000007e05700cb4e946ba50244e27f01805354cd8ef0" }, - "1677691975778": { - "depositDataRoot": "0x45bba0ebe199c246e5d5b5cfcf167526b45c73af97f308b0e556555f2856ffdf", - "publicKey": "0xb6bfcaa42ede6424b426be636fb0be1776d5bb61d455f56f3239bdbb5b4e739ef0bd9a43a6d4ce6963d041c1d78dc839", + "1682029172203": { + "depositDataRoot": "0x080e0fd5662a93b7824fe3b9b3931d5255de029a9837af9fbbf38b430a1c0410", + "publicKey": "0xa8e451ef957f2afc2d1e5f90b2ed1e7293647631aa2578b8be914dbf335c3d349bbda05120e6723cf002df0b77cbaefb", "operatorIds": [ 1, 2, @@ -81,23 +81,23 @@ 4 ], "sharesEncrypted": [ - "0x3d56b4bbce0d94ffd75e29f5b46624a6b9921f2a17f36249bd619d3901c6dd5e34e3c8ceff55cd653e11784b24617359e9c3bdac3f2475c9220b41c4d94aab256aff75ef354f3fb4a28ca9313f9ed00c2cce0ae6f459bb00e3cc7f776c84da86254f77a9021eea7ba75795a91029d49b01bce0853019471ccbc6c9301c9c196557b11b343d8bbf2e8aeccececcd3ead5ddd831ecd6346bd5dfbabf946c00db7fbcafa6246d3464fc2d33303ffc4ff4aa62ef0619eed7ba2579d2ceb30e3fbade18698e78a9869eef8fcd748b004a177a1b97ca05592180ced35ba90e9bcbe7c78a1baf950848fa4a73fd3fb033161d1eabdbab3e1248cb7d1e3b09cd9c45bc74", - "0x97cf5b57431482345467f8157f194faa0f0a3ad4b2853fa5768c5083bff10e1377cb4272699f990424d4834967b63dbfca849133b400726794e1a2c21c969f36835b6f3f332fc004b94c25d5d027d7161da239ca6bc16560c371b314b163dbae2bdde497834c143ca296da2abb6e26ee9da17b727bc3d25aa69422bc3b6548ff756ac874d12b513c26abf96462f60992ff576e21b67bc174a9053154ae2b93bcc6ab965140a61c3c3c8df172414f36d24bd09bec4ec1bb0cf8ce70c83365383f7c3c45fc73f0352551b08dd6bee03f80f0ab837db74f4941fcb5bcee8c4982942c543eea57982175f3f807f23fe32020a0113786d25e09aa42d5cb3a5981a78f", - "0xc9578188d916ab52450c3e5871a0915115005f62949f6cf21f306d3827f96542e3b86b38da1514fe2ace36c0a13f76c68eb8e949fbf061bd520cd4a4b0fc99ac8a7312b3a49ef8201b9be96a296da3499842394f25e0bd0a05bb1c896586e7761568fc2710f313a5801511b85818f7598cb82d8435a8cc0379b1a92a7e17d8368b0504a9ff2d6af4278c6ac11a6a17170f51d9e382b315bbcf67434c9cde03e9ee066a8b562bda6777953c8f66ad4cb842c324303b95835c37e00fcee7940a38a637a776d1e734ae1dbfb36d0502a503169372a845f8a5ad0c96fe78cf0f3ec0042fac1e939f95d48834ed1082f62c7fda12ad436265acf27e27b4d8b40df0dd", - "0x36973ada680b0ef999819de47441315cb3827b92c71c112c5eda785b632babc2e961bdcce078f474391762d61c05fc81100ec959bc6b538674f561f970bb13f11d8032f27d6df31188394cd30790e70f2683e371c22ee9d2c68c00ae8c042ce2e442a496224fd8ad76bba7ce53d72878679098e483f68ea0c59ccc748a90527d6a8526337a4e08e65fc841273176a76e4607c2d1b5c980d849b33ed5e77af08cf3b9d3e86ecb0d18d0bae2170b5022cfe378c8c13f42c51808a7ed7b55c72d393ef65c1b906764077858aa18a4c6e93b6da5972af14d9985557207c5fbbeae5b55f13c5570749682839cc15f40b8fa48d21a9ed1799f1e901b5bfa0357f74b0c" + "0x1b829ef9e898c3a1eb7e0a8b58ceaf2d5d4284ce84124a1da1c63438e59c49cc08aa00e24970e1e76b1b9d9e351c67ee6679c9354dee5ff1c58f1cd4071989536066e532ed7875ae64d50ca7322b212d96b49b1539edb37a6bb679ec630998ca510e0dae8f48fa1f294e25144ec2629674d2853fae40a009a21e2c0a186d29ba7b21d83c7c96d619387b1a09eaddfca27f7d607b51882bcef2b2063cbcea6724d2d112b4f99b7692361a08fe7a2738cdb9f5978c9b1126ba224082e419dccfaed26e96e8d7ff7e8269bc98846614dc7be7c23157c4338e2ca6cd7cfbd4b9317eb057daadb1cd06704812080f9e1bb3d3c1ff7dcc216352f7288e6bbbf5939cb4", + "0x2fc1080c6ccbe48a243091aec02dfb818dd9f0a99db2895dcb85be4af40c255284d5f07cb1b75265d49054955207961a79ff4562301de966e1188a47589df17a1150818bbb3c91a70f7190f40ab4cf0cebce277dbe914a269715bac482202df2f559bf8788f91bce67f86a130e5eb20f004c6813720bd31623ae2f90328805a9774108edd0ae40a1ae26f52a8147c8959702df4bd24617dce1454938a2a44008456bed1e13157ecfbcccb657192b26ff8f32ca769743f6fae58fafa9769db684e63b613a0b4a56f5dd433267c733351f6c42622fd20ab5f58f634d2003f5a321a40b4c64a4659fec0cfa04b8c642f902a18374c712ab170249ddf3cce2330cb6", + "0x5827b573a74757440de6cb9afc9f7bc4906862ca9b225685a0b55ba7f7f2bde1db500c47089fa7e0dbde7b8e24188821fcf84b1f9a4fd34c46dbe6f6a32ffe398fdd2d4587586ae2b3b5d7b570ca180985edc883af4b2ad7591772b07527eb5382d79850897dc685754059d9d14a5f256b9aef75a9b3c09db6bcfbb7f42a16fc3ce381f355d2a0b0c2430750b24f25c2f2315705b09ba8606dbb2c8ac61efc93d62d974a7aaf163ca3f856335fc7179d9b68af5d470326ab0032fc6b94f73bb95e8d182baa1c6ed7cf49cd7741575e76a5c6d31f4410c7f6dea293447e0e79cc8a860d3eb223b7e52b2772d1f178267a23de4bf1a0aaa28541c49ba5ac3667e0", + "0x16be0386aa6a97dab30aa2b709cf14e1b425e718899388ea63cdb9f0dcc3537631997ce804848a9ca713ca99e13f5cbfd2be783ea971a753f3a60fd5408db4ef829a4d6c231ba3971c76662d9bd5fb9fc6fde90a68e9069f87cb1abd3040e382199e2c6b4f49ed9bb30a4716ccbdcd11f20415b66e831b2ea394b2fd87cb74bdcecf32d705c6e0a829a692b7b91af920fb83785ce859db1888b831a337005eecc1e6f10bc83da1c87ba01178b01c20660f1b08f302d6ffeeb99b4387f91711f638419a5393803a1efb1c30d3e4943301d0266a502de9a4b30884c19dc4c167cba53d85cc11cab5d3578e919ec827cdf2823d192408fda4faaae8ffc35e019c0a" ], "sharesPublicKeys": [ - "0x95982bab54311d326f46b09086b32bea15ec79176daf8f2f11aaac982bea95833e7547f49bb9b3498d171cb9ab3b110d", - "0xadc47a3d3ff441874aab6d12a0c3f131e3ce3483c5acebf57d1fa5da9e4b721b46f0e425d4326c7d76d0fb3e53a418f4", - "0x8ff90c28d3d86fe8e4a510e060b13a3612e4d81ab79faefaeffe9bfc72d400f11045ab447d4cf3fefde84871ddacbbfc", - "0x867e21ed889833ee47f2737a39a2065cb85e2390e059f68442ee028b8123573e6daae145dcb43c7a791046d904219ece" + "0xa410862d901916524df8620c5cc214eb02ec27c06d19dd02355052a5b40f0ac25280f5fbc364aa36f3f71d2729c01c43", + "0xa539c8d398fecce0801465b1451c8d9d5d0d5c37dba4b4eb47c6781302b39e228acce0ef1368805885b600b2955ee35d", + "0x834b18f29d22cbff851b8dac50c8a23995642b24e950552e1a495181f59e7e3c6e08c3567f2b9ff4584f8e5833d8e67f", + "0xb94b389871f8db8c0e3166cf0cb4303625c0f888228863a2b7064c0f7bebc1e36bcb61c3ef176d9d3356d77558066554" ], - "signature": "0x8af0c731654061cb6770cb6c5bfaf19294c68934b577400c8490931f3ef039cd3fefb0e1069dc82ca5c5e87639ceb30b05cbcb6ee999384b3455a7a7a7d7044c1a5c618b1683b62ddc1b7e286c8affd320fb084581119c03f3d79d127ca06b05", + "signature": "0x9884a6958bbda8cfe8f9e266754c8d0325df14fa2390200de1fbf560d985648370682a8f1339c938a8485835b172cc82129ed3278491e78fc10117fc0d441baf7046249c5439e9236bdaae40cffe67fd792eb7f7534ef0461e95c2aa334249b9", "withdrawalCredentials": "0x01000000000000000000000007e05700cb4e946ba50244e27f01805354cd8ef0" }, - "1677692000166": { - "depositDataRoot": "0x35c31eb72a867303510c94fe08c4afa837fe8be4cd18515f90fa3b0685da22ed", - "publicKey": "0x80e0b1e1332bdc057d978d260613d472decb7826b5bdb73faf41f8f0b14c6fcfec294b22b656cfce84a685f4eff5fb71", + "1682029266157": { + "depositDataRoot": "0x8823df02cd687de5fbd9fa579b3dd36bf4cee3fc0fbfbeb1db9075b08a2fde7a", + "publicKey": "0xb5c41bc1e75d68f19551dd901b09cf238ee4ea427db1d5bcc56ff8c06fe6c44af42d5796ee7c991ae5a467d6dad50b9d", "operatorIds": [ 1, 2, @@ -105,18 +105,18 @@ 4 ], "sharesEncrypted": [ - "0xc4396e872ca640ba7f8f269df4a22210fb84d4f8f7e5f6a9f09ce79feb6cc5f2ccfc885b984582faf5e0950ef55dc7e508fd4afa4b89e22ef7fab3fd24543b2739460d7bf171b434f63594c3a3425c13c5e005695ca47b86fc6a9ebeed943bafe79bf2d0c188993ab24eeb2f4329b7fa0b7a37d5d289184005ee9f81e56b6ab63b2988d2e8bb47a01aa629457a52fdaad459a911d6a3d5974d58a67991ad50ba96f1e07922c66ebfba43d783b86b1d0bde3f7a7875e4d8dd757eb1c432a56c9e874e0de6137ed1c2fb8969d7b39aa2926726d7ff42e7cd24335f7e4ce533145ebf9f5f6ddf2ae743e20759d5306c8d9f405b780b52a714c8c44e21c390e10280", - "0xb7ca830ed0c005ae2e4edb17aed4ff62158631d30c13f6c2728c43dddb997ac78dcf4c9a29af4ed0ed7a05a3317d3286a90c6d2c6b8e95add3f9f0263f365117624aa047764f677102ed32cfa59aa852466aec3973e5b6ae2baf40f5f5861cf145c44f6b0aa0885f5598ac317ff627da8a5e617fffd0b0ed067a5f4673699ee997e03a0a96a469969389fae678904734956f0007ea574e436a5da19014dfe073ffb355f947a63d670f1c7e21735cd502dd3a949621feed58a306d6613fa13f3f229bb809704ebb44536093ddec28ab3e8689ded91a5f10f74e5f5fd6e619e79b721dc645d1fc8348eb7dcdffe7997d8596baf14117c8535b82b55ad63457bf12", - "0xccebc2dcaad5c0dff30e720fbe0e03c8387a8d8d11a0d289f83b3e3420cfe3a994b497ce23029f1aa5db10b450dcf05cd93914330618de95da49cbddadf843d8d54d50fe5dc5a5d676e5c15f4fe73ebe7f5eaf79dd1e6096982838646330ec392618867f0ca4b1ebfa3af6dfd2a1c6ad134dd5df734ac1e56ecfee73b2bd3f5a50d21443ba7509ac1c77a8c6b1caf58032172465c040d73945aad7b9fa85a0159bf9b96ba26511fad7f84856c10d2daada21284284d0c8d80ab146557db389e077318327ec99d14e1da63e3dfda1ec07bd6fb2fb369f2a87bec9245b393f3a40c10bdf39517b7ac93e30c759bb344347746c74bbe8169f37a492ded526d25d7f", - "0x8d082e5deaa0331837b164cb61f7e66d8797851a6b78825d5f06fba2869323c45a9343c6ef89a2299be0fc27f65f71784d06372c8861743e7357b8981520f7b644eb0d8a4cecc44509d1a652ae8960b179963ef1102c721d20e55699bfdc74e66938552ea639ab05f8362ec61fb420aac0035e22f0bf89e4240c1de1a7f4166d2048071be85bc64850fc6c3c19018ee4ff87fd3064fd9f02529f8e4255d3bbbfc1867837bd90d9374178c8c2c4e08fda6372ced29712d230e3853b93258afa75d566d5831766963ed9f3d0c9130f9e02a9856e133b64a8666f57a6495456762b1102da93dd9fa5639b6e7112a727559e1bd505b69762e58b85c2647a621013d8" + "0x50d38e3a5b8f1331b6c9094fd970d091ce3d0abff83e00af648452e2a91e14849d96c2af58b8ebc0135e3b93352f8a24c50e3d2c018705a808162509fa9e5910c1821801b95147c449acf5d4abaff49d885dee031416b1ea55b9aa19af0eec50b431031c3937ba0c28e48dcfa8ab83bb15b28c71dce673d434cc868c66852ff06a70897692a810b5d0ff4fddb671261de7d870d52c3f788f4e477d51fd2543188e84ae50b3b65c3e78f70e129f5aeac1209b410ea8769d1dcb13c60a0ce5821f307e4f4b4fbac75e3be548edabf4741f1eda8b323ee3a1be41c91ef02ebc336801573edd4dd7884542c83abaac1cdc55da2dad97593d149f736e599f31287006", + "0xb658e8ffa00b046b459adc195c85a995a5f2a38516a71a9fb06dafb23f476f5738472b77850c47710a10c447971ae594bf5cfef0add739c0b2ecfb4bee9a8585a1324dc7e922473601d362fc95082f7aa02b0492ea2a82473a6b6301f96486e13cf00996cbfc9847044cddcadf5bde09ffe2306b36e86554b5927401b080cf785c9ebb2158c181a9530847c44333826341cd05178d6b55cb692c057e0592f41fa780e1a8a89b88fc6c6590f39fd22b85fcaedf90aeb157f21aa49bf5b7a2e459cddd2d915f808419d150f35589a07e3a7e87d0e5028db27a235f7572935dc225e0143c2e1e968433940f776d2c55792ed1bd911f8f815dbbb5a0677ca990f76a", + "0x600136e52c2e77265edcc674b1393ae3ea2a5eeb1667ae9aba7d6017fc5b0c617b2516fd12b2eca44269ff0d9c8bb63e54a5d17d59e09c75cd07ba34a00bef049eecf845dc72629f8abc5a3dbc77d9fb236f55105cd4ae1f20c9178219a256347ccab80ba330b0e97936b85c0bcb968afdd20427872f3d05d4d447f18ec03a0e3efc4d506867fe153c8356b45a951dba341f4189388a61c6ecc365d8a3896a9d51989ddeeb1b572eadd611a946c528986cd5f70d9cb8584bbef1cc6b4a49546b3cf9d126cd75784477a843cb5bcf701f972af114313ce3889546c17d9095589c9a4e854eaf0b48baaf7a9ee9432d6b9d40b0b24d08e5b50aceec92b391c7a21f", + "0xa43a54741faab9e7d013d2bbf16d37ff17168797c8842ca87bd1507da1d049f17f41f17635fecd749f46926e3bb0fb050bd868729ccc3a4754174b6a5be9026faed41d41e142cc3ee63bf8278fa2304409adc76b73f9233ef3a595aad7ac91f297285ae2be8aeb00b65ebfa6b94412a762c345324952e1041a80a530b6516503062b05635bafd759634f1f004b450e8a5e5df82e70e825f6ac10e85d09f7fa93e9888fd802a496d867cd57fa24f2aa2a1559b89eaa188e25d7b1ba9fe0943c0f975f87329e7566a448f87157f34c2fb7a7d71e088a972e9f2b2a901944a4c2abc0e2e4a7653d2b71b7690c28262a157db055411b6f679f3dc482d24fe48b7ce0" ], "sharesPublicKeys": [ - "0xa932154c1c2640f50653b57f6a00331c0c20c16760ae497c45e9186d1b6877c3882e5b4d7853ba6d545c3ac5d6d1d259", - "0x94ffa2a9a301a241870d7774d59839e442b845a6ea7b991b6261adb54a9da3156bb91d3d07ceb3f8e544e70e3c45dc00", - "0x85c82c0bf95dcf28c88f1265ff711d34a9d38e2d114e87207fe509a345e4de2c0bf09d943f5e2348d196fb1bb1bfdbf3", - "0xb1d9fea1d7652016e8eade38f627c2295c369716c4a1f52836383117c02b757b579195724c5c8ddbb81c70008397dcf4" + "0xa195e2dd8704a8cfb0249ef6f5eecb1f014b5f29d4cde983d93d01ca651a5c5cd7e261b9f1013803c2db23a5a538e3d3", + "0x8f47eb6d6c8bfd00437bf4f4c3063413ecc2fd5c01bb3664a7936b69d4e990bca601c4f3c6f4baa829ad8ef2afb08191", + "0x85763686250462930079aaf5ae4ae3c8048e6739d373faebe5dc72d55df6da4d94afabb9942576092335e0e590246d65", + "0xaeb305149e6373bf231bb450dc67727101871bf660afc24704c6bdf052a17e715fbc1db37e8acf621480b342ed1e166a" ], - "signature": "0xad2f96ba68197d0edf02b6c45a709a12140693d4c8b22fadbfdce23291ea7956522f15cb0226396ce280ceebc7520cba080c83fb24e5561b821a3e343f6770c837b3b482bca46e5063b478d6d8cb608a9077b14833e2e80308d63efa24764ab2", + "signature": "0x82ac99921a75f04c9b9d45df6c56523a5d0f00d74e5dab36769f3160710d0df02c60d07a703af536c18acdc3e513c4fe192cabf861f1f79a785768df3d47b09d13953cdadc7f747fc1b73ef855107d02486adb2c82024c3eec1f93f2e84e27f0", "withdrawalCredentials": "0x01000000000000000000000007e05700cb4e946ba50244e27f01805354cd8ef0" } } \ No newline at end of file diff --git a/common/helpers/src/index.ts b/common/helpers/src/index.ts index 7bf7a048d..240b79d36 100644 --- a/common/helpers/src/index.ts +++ b/common/helpers/src/index.ts @@ -173,4 +173,13 @@ export function getWallet(mnemonic?: string) { return ethers.Wallet.fromMnemonic(mnemonic) } return ethers.Wallet.createRandom() +} + +/** + * Get withdrawal credentials from withdrawal address + * @param {string} withdrawalAddress - Withdrawal address + * @returns {string} Withdrawal credentials + */ +export function getWithdrawalCredentials(withdrawalAddress: string): string { + return '01' + '0'.repeat(22) + withdrawalAddress.split('0x')[1] } \ No newline at end of file diff --git a/contracts/ethereum/hardhat.config.ts b/contracts/ethereum/hardhat.config.ts index 8e3a62d23..3165151e9 100644 --- a/contracts/ethereum/hardhat.config.ts +++ b/contracts/ethereum/hardhat.config.ts @@ -9,7 +9,7 @@ import '@openzeppelin/hardhat-upgrades' // Seed is provided const mnemonic = process.env.BIP39_SEED as string -const hid = { mnemonic, count: 5 } +const hid = { mnemonic, count: 10 } // Mining interval is provided const miningInterval = parseInt(process.env.MINING_INTERVAL as string) diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index 07d9e7274..17a6a67f0 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -152,13 +152,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { tokens[Token.WETH] = wethTokenAddress; /** Create automation and PoR contracts */ - casimirAutomation = new CasimirAutomation( - address(this) - ); - casimirPoR = new CasimirPoR( - address(this), - linkFeedAddress - ); + casimirAutomation = new CasimirAutomation(address(this)); + casimirPoR = new CasimirPoR(address(this), linkFeedAddress); } /** @@ -171,7 +166,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param amount The amount of ETH to reward */ function reward(uint256 amount) public { - require(amount >= rewardThreshold, "Reward amount must be equal or greater than reward threshold"); + require( + amount >= rewardThreshold, + "Reward amount must be equal or greater than reward threshold" + ); /** Reward fees set to zero for testing */ ProcessedDeposit memory processedDeposit = processFees( @@ -218,14 +216,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { address sender, ProcessedDeposit memory processedDeposit ) private { - /** - * Todo distribute SSV fees - * processedDeposit.ssvAmount - */ - - /** Distribute LINK fees to oracle */ - linkToken.transfer(getAutomationAddress(), processedDeposit.linkAmount); - emit ManagerDistribution( sender, processedDeposit.ethAmount, @@ -248,23 +238,81 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { pool = pools[poolId]; uint256 remainingCapacity = poolCapacity - pool.deposits; if (remainingCapacity > processedDeposit.ethAmount) { + /** Emit event before updating values */ emit PoolDeposit(sender, poolId, processedDeposit.ethAmount); + /** Update pool state */ openDeposits += processedDeposit.ethAmount; pool.deposits += processedDeposit.ethAmount; + processedDeposit.ethAmount = 0; } else { + /** Emit event before updating values */ emit PoolDeposit(sender, poolId, remainingCapacity); + /** Move pool from open to ready state */ openDeposits -= pool.deposits; pool.deposits += remainingCapacity; - processedDeposit.ethAmount -= remainingCapacity; - /** Move pool from open to ready state */ openPoolIds.remove(0); readyPoolIds.push(poolId); + + processedDeposit.ethAmount -= remainingCapacity; } } + + /** + * Handle SSV fee distribution in stakePool + */ + + /** Distribute LINK fees to automation contract */ + linkToken.transfer(getAutomationAddress(), processedDeposit.linkAmount); + } + + /** + * @dev Stake a pool validator and register with SSV + * @param poolId The pool ID + */ + function stakePool(uint32 poolId) external { + require(readyValidatorPublicKeys.length > 0, "No ready validators"); + + /** Get next ready validator */ + bytes memory publicKey = readyValidatorPublicKeys[0]; + Validator memory validator = validators[publicKey]; + + /** Get the pool */ + Pool storage pool = pools[poolId]; + + /** Move pool from ready to staked state */ + readyPoolIds.remove(0); + stakedPoolIds.push(poolId); + + /** Move validator from inactive to active state and add to pool */ + readyValidatorPublicKeys.remove(0); + stakedValidatorPublicKeys.push(publicKey); + pool.validatorIndex = stakedValidatorPublicKeys.length - 1; + + /** Deposit validator */ + beaconDeposit.deposit{value: pool.deposits}( + publicKey, // bytes + validator.withdrawalCredentials, // bytes + validator.signature, // bytes + validator.depositDataRoot // bytes32 + ); + + /** Pay SSV fees and register validator */ + /** Todo update for v3 SSV contracts and dynamic fees */ + uint256 mockSSVFee = 5 ether; + ssvToken.approve(address(ssvNetwork), mockSSVFee); + ssvNetwork.registerValidator( + publicKey, // bytes + validator.operatorIds, // uint32[] + validator.sharesPublicKeys, // bytes[] + validator.sharesEncrypted, // bytes[], + mockSSVFee // uint256 (fees handled on user deposits) + ); + + emit PoolStaked(poolId); } /** @@ -272,10 +320,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param amount The amount of ETH to withdraw */ function withdraw(uint256 amount) external nonReentrant { - require( - openDeposits >= amount, - "Withdrawing more than open deposits" - ); + require(openDeposits >= amount, "Withdrawing more than open deposits"); require(users[msg.sender].stake0 > 0, "User does not have a stake"); /** Settle user's compounded stake */ @@ -286,17 +331,19 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { "Withdrawing more than user stake" ); - /** Send ETH from manager to user */ - (bool success, ) = msg.sender.call{value: amount}(""); - require(success, "Transfer failed"); - /** Update user account state */ users[msg.sender].distributionSum0 = distributionSum; users[msg.sender].stake0 -= amount; /** Update balance state */ + Pool storage pool = pools[openPoolIds[0]]; + pool.deposits -= amount; openDeposits -= amount; + /** Send ETH from manager to user */ + (bool success, ) = msg.sender.call{value: amount}(""); + require(success, "Transfer failed"); + emit UserWithdrawed(msg.sender, amount); } @@ -402,76 +449,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { return swapRouter.exactInputSingle(params); } - /** - * @notice Get the current token fees as percentages - * @return The current token fees as percentages - */ - function getFees() public view returns (Fees memory) { - return Fees(getLINKFee(), getSSVFee()); - } - - /** - * @notice Get the LINK fee percentage to charge on each deposit - * @return The LINK fee percentage to charge on each deposit - */ - function getLINKFee() public view returns (uint32) { - return linkFee; - } - - /** - * @notice Get the SSV fee percentage to charge on each deposit - * @return The SSV fee percentage to charge on each deposit - */ - function getSSVFee() public view returns (uint32) { - return ssvFee; - } - - /** - * @dev Stake a pool validator and register with SSV - * @param poolId The pool ID - */ - function stakePool(uint32 poolId) external { - require(readyValidatorPublicKeys.length > 0, "No ready validators"); - - /** Get next ready validator */ - bytes memory publicKey = readyValidatorPublicKeys[0]; - Validator memory validator = validators[publicKey]; - - /** Get the pool */ - Pool storage pool = pools[poolId]; - - /** Deposit validator */ - beaconDeposit.deposit{value: pool.deposits}( - publicKey, // bytes - validator.withdrawalCredentials, // bytes - validator.signature, // bytes - validator.depositDataRoot // bytes32 - ); - - /** Pay SSV fees and register validator */ - /** Todo update for v3 SSV contracts and dynamic fees */ - uint256 mockSSVFee = 5 ether; - ssvToken.approve(address(ssvNetwork), mockSSVFee); - ssvNetwork.registerValidator( - publicKey, // bytes - validator.operatorIds, // uint32[] - validator.sharesPublicKeys, // bytes[] - validator.sharesEncrypted, // bytes[], - mockSSVFee // uint256 (fees handled on user deposits) - ); - - /** Move pool from ready to staked state */ - readyPoolIds.remove(0); - stakedPoolIds.push(poolId); - - /** Move validator from inactive to active state and add to pool */ - readyValidatorPublicKeys.remove(0); - stakedValidatorPublicKeys.push(publicKey); - pool.validatorIndex = stakedValidatorPublicKeys.length - 1; - - emit PoolStaked(poolId); - } - /** * @dev Remove a pool * @param poolId The pool ID @@ -485,7 +462,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Remove pool from staked pools and delete */ stakedPoolIds.remove(0); delete pools[poolId]; - + emit PoolRemoved(poolId); } @@ -508,7 +485,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { bytes calldata signature, bytes calldata withdrawalCredentials ) external /**onlyUpkeep*/ { - /** Create validator and add to ready state */ validators[publicKey] = Validator( depositDataRoot, @@ -523,18 +499,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { emit ValidatorAdded(publicKey); } - function exitValidator( - uint index - ) external /**onlyUpkeep*/ { - + function exitValidator(uint index) external /**onlyUpkeep*/ { /** Get validator public key */ bytes memory publicKey = stakedValidatorPublicKeys[index]; - /** Todo remove validator from Beacon */ - - /** Remove validator from SSV */ - ssvNetwork.removeValidator(publicKey); - /** Move validator from staked to exiting state */ stakedValidatorPublicKeys.remove(index); exitingValidatorPublicKeys.push(publicKey); @@ -546,10 +514,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @dev Remove a validator from the pool manager * @param index The validator index */ - function removeValidator( - uint index - ) private /**onlyUpkeep*/ { - + function removeValidator(uint index) private /**onlyUpkeep*/ { /** Get public key */ bytes memory publicKey = exitingValidatorPublicKeys[index]; @@ -557,9 +522,36 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { exitingValidatorPublicKeys.remove(index); delete validators[publicKey]; + /** Remove validator from SSV */ + ssvNetwork.removeValidator(publicKey); + emit ValidatorRemoved(publicKey); } + /** + * @notice Get the current token fees as percentages + * @return The current token fees as percentages + */ + function getFees() public view returns (Fees memory) { + return Fees(getLINKFee(), getSSVFee()); + } + + /** + * @notice Get the LINK fee percentage to charge on each deposit + * @return The LINK fee percentage to charge on each deposit + */ + function getLINKFee() public view returns (uint32) { + return linkFee; + } + + /** + * @notice Get the SSV fee percentage to charge on each deposit + * @return The SSV fee percentage to charge on each deposit + */ + function getSSVFee() public view returns (uint32) { + return ssvFee; + } + /** * @notice Get staked validator public keys * @return A list of active validator public keys @@ -613,7 +605,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @return The total manager stake */ function getStake() public view returns (uint256) { - /** Total manager execution stake */ int256 executionStake = getExecutionStake(); @@ -685,7 +676,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param poolId The pool ID * @return The pool details */ - function getPoolDetails(uint32 poolId) external view returns (PoolDetails memory) { + function getPoolDetails( + uint32 poolId + ) external view returns (PoolDetails memory) { Pool memory pool = pools[poolId]; /** Will return invalid data if pool is still in ready state */ @@ -695,11 +688,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { bytes memory publicKey = stakedValidatorPublicKeys[pool.validatorIndex]; Validator memory validator = validators[publicKey]; - return PoolDetails( - pool.deposits, - publicKey, - validator.operatorIds - ); + return PoolDetails(pool.deposits, publicKey, validator.operatorIds); } /** diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 42a9b7030..b9ed31379 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -12,7 +12,7 @@ const rewardPerValidator = 0.1 export async function deploymentFixture() { let casimirManager: CasimirManager | undefined let mockAggregator: MockAggregator | undefined - const [owner, , , , distributor] = await ethers.getSigners() + const [owner, , , , , distributor] = await ethers.getSigners() let config: DeploymentConfig = { CasimirManager: { address: '', @@ -89,7 +89,7 @@ export async function deploymentFixture() { export async function addValidatorsFixture() { const { casimirManager, casimirAutomation, mockAggregator, owner, distributor } = await loadFixture(deploymentFixture) - const validators = Object.keys(validatorStore).map((key) => validatorStore[key]).slice(0, 2) as Validator[] + const validators = Object.keys(validatorStore).map((key) => validatorStore[key]) as Validator[] for (const validator of validators) { const { depositDataRoot, @@ -135,7 +135,7 @@ export async function firstUserDepositFixture() { await performUpkeep.wait() } - return { casimirManager, casimirAutomation, mockAggregator, owner, distributor, firstUser} + return { casimirManager, casimirAutomation, mockAggregator, owner, distributor, firstUser } } /** Fixture to stake 24 ETH for the second user */ @@ -254,19 +254,63 @@ export async function firstUserPartialWithdrawalFixture() { const readyDeposits = await casimirManager?.getOpenDeposits() const withdrawal = await casimirManager.connect(firstUser).withdraw(readyDeposits) await withdrawal.wait() + + /** Perform upkeep (todo add bounds to check data) */ + const checkData = ethers.utils.defaultAbiCoder.encode(['string'], ['']) + const { ...check } = await casimirAutomation.checkUpkeep(checkData) + const { upkeepNeeded, performData } = check + if (upkeepNeeded) { + const performUpkeep = await casimirAutomation.performUpkeep(performData) + await performUpkeep.wait() + } + return { casimirManager, casimirAutomation, mockAggregator, distributor, firstUser, secondUser, thirdUser } } +/** Fixture to stake 72 ETH for the fourth user */ +export async function fourthUserDepositFixture() { + const { casimirManager, casimirAutomation, mockAggregator, distributor, firstUser, secondUser, thirdUser } = await loadFixture(firstUserPartialWithdrawalFixture) + const [, , , , fourthUser] = await ethers.getSigners() + const stakeAmount = 72.0 + const fees = { ...await casimirManager.getFees() } + const feePercent = fees.LINK + fees.SSV + const depositAmount = stakeAmount * ((100 + feePercent) / 100) + const value = ethers.utils.parseEther(depositAmount.toString()) + const deposit = await casimirManager.connect(fourthUser).deposit({ value }) + await deposit.wait() + + /** Perform upkeep (todo add bounds to check data) */ + const checkData = ethers.utils.defaultAbiCoder.encode(['string'], ['']) + const { ...check } = await casimirAutomation.checkUpkeep(checkData) + const { upkeepNeeded, performData } = check + if (upkeepNeeded) { + const performUpkeep = await casimirAutomation.performUpkeep(performData) + await performUpkeep.wait() + } + + /** Increase PoR mock aggregator answer */ + if (mockAggregator) { + const { ...feed } = await mockAggregator.latestRoundData() + const { answer } = feed + const consensusStakeIncrease = ethers.utils.parseEther('64') + const newAnswer = answer.add(consensusStakeIncrease) + const update = await mockAggregator.updateAnswer(newAnswer) + await update.wait() + } + + return { casimirManager, casimirAutomation, mockAggregator, distributor, firstUser, secondUser, thirdUser, fourthUser } +} + /** Fixture to simulate stakes and rewards */ export async function simulationFixture() { - const { casimirManager, casimirAutomation, mockAggregator, distributor, firstUser, secondUser, thirdUser } = await loadFixture(firstUserPartialWithdrawalFixture) + const { casimirManager, casimirAutomation, mockAggregator, distributor, firstUser, secondUser, thirdUser, fourthUser } = await loadFixture(fourthUserDepositFixture) for (let i = 0; i < 5; i++) { const stakedValidatorCount = (await casimirManager?.getStakedValidatorPublicKeys())?.length if (stakedValidatorCount) { const rewardAmount = (rewardPerValidator * stakedValidatorCount).toString() const reward = await distributor.sendTransaction({ to: casimirManager?.address, value: ethers.utils.parseEther(rewardAmount) }) await reward.wait() - + /** Perform upkeep (todo add bounds to check data) */ const checkData = ethers.utils.defaultAbiCoder.encode(['string'], ['']) const { ...check } = await casimirAutomation.checkUpkeep(checkData) @@ -277,5 +321,5 @@ export async function simulationFixture() { } } } - return { casimirManager, casimirAutomation, mockAggregator, distributor, firstUser, secondUser, thirdUser } + return { casimirManager, casimirAutomation, mockAggregator, distributor, firstUser, secondUser, thirdUser, fourthUser } } \ No newline at end of file diff --git a/contracts/ethereum/test/integration.ts b/contracts/ethereum/test/integration.ts index 0f9f2ea8f..388aa12c8 100644 --- a/contracts/ethereum/test/integration.ts +++ b/contracts/ethereum/test/integration.ts @@ -1,13 +1,13 @@ import { ethers } from 'hardhat' import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' import { expect } from 'chai' -import { addValidatorsFixture, firstUserDepositFixture, rewardPostSecondUserDepositFixture, secondUserDepositFixture, thirdUserDepositFixture, rewardPostThirdUserDepositFixture, simulationFixture, firstUserPartialWithdrawalFixture } from './fixtures/shared' +import { addValidatorsFixture, firstUserDepositFixture, rewardPostSecondUserDepositFixture, secondUserDepositFixture, thirdUserDepositFixture, rewardPostThirdUserDepositFixture, simulationFixture, firstUserPartialWithdrawalFixture, fourthUserDepositFixture } from './fixtures/shared' describe('Casimir manager', async function () { - it('Registration adds 2 validators with 4 operators each', async function () { + it('Registration adds 5 validators with 4 operators each', async function () { const { validators } = await loadFixture(addValidatorsFixture) - expect(validators.length).equal(2) + expect(validators.length).equal(5) const operators = validators.map((v) => v.operatorIds).flat() expect(operators.length).equal(4 * validators.length) @@ -144,12 +144,31 @@ describe('Casimir manager', async function () { expect(ethers.utils.formatEther(thirdStake)).equal('24.074882995319812792') }) + it('Fourth user\'s 72 stake completes the third and fourth pool with 72', async function () { + const { casimirManager } = await loadFixture(fourthUserDepositFixture) + const stakedPools = await casimirManager.getStakedPoolIds() + expect(stakedPools.length).equal(4) + + const thirdPoolId = stakedPools[2] + const thirdPool = await casimirManager.getPoolDetails(thirdPoolId) + expect(ethers.utils.formatEther(thirdPool.deposits)).equal('32.0') + expect(thirdPool.publicKey).not.equal('0x') + expect(thirdPool.operatorIds.length).equal(4) + + const fourthPoolId = stakedPools[3] + const fourthPool = await casimirManager.getPoolDetails(fourthPoolId) + expect(ethers.utils.formatEther(fourthPool.deposits)).equal('32.0') + expect(fourthPool.publicKey).not.equal('0x') + expect(fourthPool.operatorIds.length).equal(4) + }) + it('Check more rewards and dust', async function () { - const { casimirManager, firstUser, secondUser, thirdUser } = await loadFixture(simulationFixture) + const { casimirManager, firstUser, secondUser, thirdUser, fourthUser } = await loadFixture(simulationFixture) const stake = await casimirManager.getStake() const firstStake = await casimirManager.getUserStake(firstUser.address) const secondStake = await casimirManager.getUserStake(secondUser.address) const thirdStake = await casimirManager.getUserStake(thirdUser.address) + const fourthStake = await casimirManager.getUserStake(fourthUser.address) const line = '----------------------------------------' console.log(`${line}\n💿 Post testing simulation results\n${line}`) @@ -157,9 +176,10 @@ describe('Casimir manager', async function () { console.log('👤 First user updated balance', ethers.utils.formatEther(firstStake)) console.log('👤 Second user updated balance', ethers.utils.formatEther(secondStake)) console.log('👤 Third user updated balance', ethers.utils.formatEther(thirdStake)) + console.log('👤 Fourth user updated balance', ethers.utils.formatEther(fourthStake)) const openDeposits = await casimirManager.getOpenDeposits() console.log('📦 Open deposits', ethers.utils.formatEther(openDeposits)) - const dust = stake.sub(firstStake.add(secondStake).add(thirdStake)) + const dust = stake.sub(firstStake.add(secondStake).add(thirdStake).add(fourthStake)) if (dust !== ethers.utils.parseEther('0.0')) { console.log('🧹 Dust', ethers.utils.formatEther(dust)) } diff --git a/services/keys/scripts/dev.ts b/services/keys/scripts/dev.ts index 11060f947..3362d1d42 100644 --- a/services/keys/scripts/dev.ts +++ b/services/keys/scripts/dev.ts @@ -7,7 +7,7 @@ void async function () { process.env.USE_HARDCODED_OPERATORS='true' const dkgServiceUrl = 'http://0.0.0.0:3000' - const groups = [[1, 2, 3, 4], [5, 6, 7, 8]] + const groups = [[1, 2, 3, 4]/*, [1, 2, 3, 4]*/] for (const group of groups) { console.log(`Starting ceremony for operators: ${group.join(',')}`) await $`npx esno -r dotenv/config src/index.ts create-validator --dkgServiceUrl ${dkgServiceUrl} --operatorIds ${group.join(',')}` diff --git a/services/keys/src/interfaces/ReshareValidatorOptions.ts b/services/keys/src/interfaces/ReshareValidatorOptions.ts index 5b9e8533d..6b513459b 100644 --- a/services/keys/src/interfaces/ReshareValidatorOptions.ts +++ b/services/keys/src/interfaces/ReshareValidatorOptions.ts @@ -5,4 +5,6 @@ export interface ReshareValidatorOptions { validatorPublicKey: string; /** Old operator registry IDs */ oldOperatorIds: number[]; + /** Validator withdrawal address */ + withdrawalAddress?: string } \ No newline at end of file diff --git a/services/keys/src/interfaces/Share.ts b/services/keys/src/interfaces/Share.ts deleted file mode 100644 index 6f048f6c1..000000000 --- a/services/keys/src/interfaces/Share.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface Share { - /** Encrypted share of the key */ - encryptedShare: string - /** Public key of the operator */ - publicKey: string -} \ No newline at end of file diff --git a/services/keys/src/interfaces/Shares.ts b/services/keys/src/interfaces/Shares.ts new file mode 100644 index 000000000..60b17564c --- /dev/null +++ b/services/keys/src/interfaces/Shares.ts @@ -0,0 +1,6 @@ +export interface Shares { + /** Encrypted operator shares */ + encryptedKeys: string[] + /** Public keys of the operator shares */ + publicKeys: string[] +} \ No newline at end of file diff --git a/services/keys/src/providers/dkg.ts b/services/keys/src/providers/dkg.ts index cf371183f..fa9c9f123 100644 --- a/services/keys/src/providers/dkg.ts +++ b/services/keys/src/providers/dkg.ts @@ -1,9 +1,10 @@ import { KeyGenerationInput } from '../interfaces/KeyGenerationInput' -import { Share } from '../interfaces/Share' import { DepositData } from '../interfaces/DepositData' +import { Shares } from '../interfaces/Shares' import { DKGOptions } from '../interfaces/DKGOptions' import { ReshareInput } from '../interfaces/ReshareInput' -import { retry, run } from '@casimir/helpers' +import { retry, run, getWithdrawalCredentials } from '@casimir/helpers' +import fs from 'fs' export class DKG { /** Key generation service URL */ @@ -32,19 +33,12 @@ export class DKG { */ async startKeyGeneration(input: KeyGenerationInput): Promise { const { operators, withdrawalAddress } = input - const withdrawalCredentials = `01${'0'.repeat(22)}${withdrawalAddress.split('0x')[1]}` - const startKeyGeneration = await retry(`${this.serviceUrl}/keygen`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - operators, - threshold: Object.keys(operators).length - 1, - withdrawal_credentials: withdrawalCredentials, - fork_version: 'prater' - }) - }) - const { request_id: ceremonyId } = await startKeyGeneration.json() - return ceremonyId + const operatorFlags = Object.entries(operators).map(([id, url]) => `--operator ${id}=${url}`).join(' ') + const thresholdFlag = `--threshold ${Object.keys(operators).length - 1}` + const withdrawalCredentialsFlag = `--withdrawal-credentials ${getWithdrawalCredentials(withdrawalAddress)}` + const forkVersionFlag = '--fork-version prater' + const startKeyGeneration = await run(`rockx-dkg-cli keygen ${operatorFlags} ${thresholdFlag} ${withdrawalCredentialsFlag} ${forkVersionFlag}`) as string + return startKeyGeneration.split(':')[1].trim() } /** @@ -71,48 +65,37 @@ export class DKG { */ async startReshare(input: ReshareInput): Promise { const { operators, validatorPublicKey, oldOperators } = input - const startReshare = await retry(`${this.serviceUrl}/keygen`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - operators, - threshold: Object.keys(operators).length - 1, - validator_pk: validatorPublicKey.split('0x')[1], - operators_old: oldOperators - }) - }) - const { request_id: ceremonyId } = await startReshare.json() - return ceremonyId + const operatorFlags = Object.entries(operators).map(([id, url]) => `--operator ${id}=${url}`).join(' ') + const thresholdFlag = `--threshold ${Object.keys(operators).length - 1}` + const validatorPublicKeyFlag = `--validator-public-key ${validatorPublicKey}` + const oldOperatorFlags = Object.entries(oldOperators).map(([id, url]) => `--old-operator ${id}=${url}`).join(' ') + const startReshare = await run(`rockx-dkg-cli reshare ${operatorFlags} ${thresholdFlag} ${validatorPublicKeyFlag} ${oldOperatorFlags}`) as string + return startReshare.split(':')[1].trim() } /** * Get key generation shares and public keys * @param {string} ceremonyId - Ceremony ID - * @returns {Promise} Array of shares and public keys + * @returns {Promise} Arrays of shares and public keys * @example * const shares = await getShares('b7e8b0e0-5c1a-4b1e-9b1e-8c1c1c1c1c1c') * console.log(shares) - * // => [ - * // { - * // encryptedShare: "0x000000...", - * // publicKey: "0x000000..." - * // }, - * // ... - * // ] + * // => { + * // encryptedKeys: ["0x000000...", ...], + * // publicKeys: ["0x000000...", ...] + * // } */ - async getShares(ceremonyId: string): Promise { - const getKeyData = await retry(`${this.serviceUrl}/data/${ceremonyId}`) - const { output: keyData } = await getKeyData.json() - const shares = [] - for (const id in keyData) { - const { Data: shareData } = keyData[id] - const { EncryptedShare: encryptedShare, SharePubKey: sharePublicKey } = shareData - shares.push({ - encryptedShare: `0x${encryptedShare}`, - publicKey: `0x${sharePublicKey}` - }) + async getShares(ceremonyId: string): Promise { + const requestIdFlag = `--request-id ${ceremonyId}` + const getShares = await run(`rockx-dkg-cli get-keyshares ${requestIdFlag}`) as string + const sharesFile = getShares.split(':')[1].trim() + const sharesJSON = JSON.parse(fs.readFileSync(sharesFile, 'utf8')) + fs.rmSync(sharesFile) + return { + encryptedKeys: sharesJSON.data.shares.encryptedKeys.map((key: string) => '0x' + key), + publicKeys: sharesJSON.data.shares.publicKeys } - return shares + } /** @@ -129,9 +112,14 @@ export class DKG { * // withdrawalCredentials: "0x000000..." * // } */ - async getDepositData(ceremonyId: string): Promise { - const getDepositData = await retry(`${this.serviceUrl}/deposit_data/${ceremonyId}`) - const [depositData] = await getDepositData.json() + async getDepositData(ceremonyId: string, withdrawalAddress: string): Promise { + const requestIdFlag = `--request-id ${ceremonyId}` + const withdrawalCredentialsFlag = `--withdrawal-credentials 01${'0'.repeat(22)}${withdrawalAddress.split('0x')[1]}` + const forkVersionFlag = '--fork-version prater' + const getDepositData = await run(`rockx-dkg-cli generate-deposit-data ${requestIdFlag} ${withdrawalCredentialsFlag} ${forkVersionFlag}`) as string + const depositDataFile = getDepositData.split('file ')[1].trim() + const depositData = JSON.parse(fs.readFileSync(depositDataFile, 'utf8')) + fs.rmSync(depositDataFile) const { deposit_data_root: depositDataRoot, pubkey: publicKey, @@ -152,7 +140,7 @@ export class DKG { */ async start(): Promise { - run('cd scripts/resources/dkg && docker compose up -d') + await run('docker compose -f scripts/resources/rockx-dkg-cli/docker-compose.yaml up -d') /** Wait for the success */ let pong = false @@ -167,15 +155,7 @@ export class DKG { * @returns {Promise} */ async stop(): Promise { - - run('cd scripts/resources/dkg && docker compose down') - - /** Wait for the failure */ - let pong = true - while (pong) { - pong = await this.ping() - await new Promise(resolve => setTimeout(resolve, 500)) - } + await run('docker compose -f scripts/resources/rockx-dkg-cli/docker-compose.yaml down') } /** diff --git a/services/keys/src/providers/ssv.ts b/services/keys/src/providers/ssv.ts index 72d46d2e6..66a085091 100644 --- a/services/keys/src/providers/ssv.ts +++ b/services/keys/src/providers/ssv.ts @@ -2,7 +2,6 @@ import { Validator } from '@casimir/types' import { operatorStore } from '@casimir/data' import { DKG } from './dkg' import { SSVOptions } from '../interfaces/SSVOptions' -import { Share } from '../interfaces/Share' import { CreateValidatorOptions } from '../interfaces/CreateValidatorOptions' import { ReshareValidatorOptions } from '../interfaces/ReshareValidatorOptions' @@ -44,19 +43,22 @@ export class SSV { const ceremonyId = await this.dkgService.startKeyGeneration({ operators, withdrawalAddress }) console.log(`Started ceremony with ID ${ceremonyId}`) + /** Wait for ceremony to complete */ + await new Promise(resolve => setTimeout(resolve, 2000)) + /** Get operator key shares */ - const dkgShares = await this.dkgService.getShares(ceremonyId) + const { encryptedKeys, publicKeys } = await this.dkgService.getShares(ceremonyId) /** Get validator deposit data */ - const { depositDataRoot, publicKey, signature, withdrawalCredentials } = await this.dkgService.getDepositData(ceremonyId) + const { depositDataRoot, publicKey, signature, withdrawalCredentials } = await this.dkgService.getDepositData(ceremonyId, withdrawalAddress) /** Create validator */ const validator: Validator = { depositDataRoot, publicKey, operatorIds, - sharesEncrypted: dkgShares.map((share: Share) => share.encryptedShare), - sharesPublicKeys: dkgShares.map((share: Share) => share.publicKey), + sharesEncrypted: encryptedKeys, + sharesPublicKeys: publicKeys, signature, withdrawalCredentials } @@ -73,9 +75,9 @@ export class SSV { * operatorIds: [1, 2, 3, 4], * validatorPublicKey: '0x8eb0f05adc697cdcbdf8848f7f1e8c2277f4fc7b0efc97ceb87ce75286e4328db7259fc0c1b39ced0c594855a30d415c', * oldOperators: { - * "2": "http://host.docker.internal:8082", - * "3": "http://host.docker.internal:8083", - * "4": "http://host.docker.internal:8084" + * "2": "http://0.0.0.0:8082", + * "3": "http://0.0.0.0:8083", + * "4": "http://0.0.0.0:8084" * } * }) */ @@ -86,24 +88,25 @@ export class SSV { const oldOperatorIds = options?.oldOperatorIds || process.env.OLD_OPERATOR_IDS?.split(',').map(id => parseInt(id)) || [2, 3, 4] const operators = this.getOperatorGroup(operatorIds) const oldOperators = this.getOperatorGroup(oldOperatorIds) + const withdrawalAddress = options?.withdrawalAddress || process.env.WITHDRAWAL_ADDRESS || '0x07e05700cb4e946ba50244e27f01805354cd8ef0' /** Start a key generation ceremony with the given operators */ const ceremonyId = await this.dkgService.startReshare({ operators, validatorPublicKey, oldOperators }) console.log(`Started ceremony with ID ${ceremonyId}`) /** Get operator key shares */ - const dkgShares = await this.dkgService.getShares(ceremonyId) + const { encryptedKeys, publicKeys } = await this.dkgService.getShares(ceremonyId) /** Get validator deposit data */ - const { depositDataRoot, publicKey, signature, withdrawalCredentials } = await this.dkgService.getDepositData(ceremonyId) + const { depositDataRoot, publicKey, signature, withdrawalCredentials } = await this.dkgService.getDepositData(ceremonyId, withdrawalAddress) /** Create validator */ const validator: Validator = { depositDataRoot, publicKey, operatorIds, - sharesEncrypted: dkgShares.map((share: Share) => share.encryptedShare), - sharesPublicKeys: dkgShares.map((share: Share) => share.publicKey), + sharesEncrypted: encryptedKeys, + sharesPublicKeys: publicKeys, signature, withdrawalCredentials } @@ -119,10 +122,10 @@ export class SSV { * const group = getOperatorGroup([1, 2, 3, 4]) * console.log(group) * // => { - * // "1": "http://host.docker.internal:8081", - * // "2": "http://host.docker.internal:8082", - * // "3": "http://host.docker.internal:8083", - * // "4": "http://host.docker.internal:8084" + * // "1": "http://0.0.0.0:8081", + * // "2": "http://0.0.0.0:8082", + * // "3": "http://0.0.0.0:8083", + * // "4": "http://0.0.0.0:8084" * // } */ getOperatorGroup(operatorIds: number[]): Record { From 995408c1a89a6a8440a8ca1777edaa2f2b120b61 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Fri, 21 Apr 2023 16:52:01 -0400 Subject: [PATCH 09/78] Add pool exit request initializer and completion handler --- contracts/ethereum/docs/index.md | 672 +++++++++--------- contracts/ethereum/src/CasimirAutomation.sol | 35 +- contracts/ethereum/src/CasimirManager.sol | 260 ++++--- contracts/ethereum/src/CasimirPoR.sol | 4 +- .../src/interfaces/ICasimirAutomation.sol | 6 + .../src/interfaces/ICasimirManager.sol | 35 +- contracts/ethereum/test/integration.ts | 20 +- 7 files changed, 537 insertions(+), 495 deletions(-) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 4c740c8b7..119431e63 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -188,115 +188,115 @@ function deposit() external payable Deposit user stake to the pool manager -### withdraw +### stakePool ```solidity -function withdraw(uint256 amount) external +function stakePool(uint32 poolId) external ``` -Withdraw user stake from the pool manager +_Stake a pool validator and register with SSV_ #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| amount | uint256 | The amount of ETH to withdraw | +| poolId | uint32 | The pool ID | -### getFees +### withdraw ```solidity -function getFees() public view returns (struct ICasimirManager.Fees) +function withdraw(uint256 amount) external ``` -Get the current token fees as percentages +Withdraw user stake from the pool manager -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | struct ICasimirManager.Fees | The current token fees as percentages | +| amount | uint256 | The amount of ETH to withdraw | -### getLINKFee +### removePool ```solidity -function getLINKFee() public view returns (uint32) +function removePool(uint32 poolId) external ``` -Get the LINK fee percentage to charge on each deposit +_Remove a pool_ -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32 | The LINK fee percentage to charge on each deposit | +| poolId | uint32 | The pool ID | -### getSSVFee +### addValidator ```solidity -function getSSVFee() public view returns (uint32) +function addValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external ``` -Get the SSV fee percentage to charge on each deposit +_Add a validator to the pool manager_ -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32 | The SSV fee percentage to charge on each deposit | +| depositDataRoot | bytes32 | The deposit data root | +| publicKey | bytes | The validator public key | +| operatorIds | uint32[] | The operator IDs | +| sharesEncrypted | bytes[] | The encrypted shares | +| sharesPublicKeys | bytes[] | The public keys of the shares | +| signature | bytes | The signature | +| withdrawalCredentials | bytes | The withdrawal credentials | -### stakePool +### exitValidator ```solidity -function stakePool(uint32 poolId) external +function exitValidator(uint256 index) external ``` -_Stake a pool validator and register with SSV_ +### getFees -#### Parameters +```solidity +function getFees() public view returns (struct ICasimirManager.Fees) +``` + +Get the current token fees as percentages + +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | +| [0] | struct ICasimirManager.Fees | The current token fees as percentages | -### removePool +### getLINKFee ```solidity -function removePool(uint32 poolId) external +function getLINKFee() public view returns (uint32) ``` -_Remove a pool_ +Get the LINK fee percentage to charge on each deposit -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | +| [0] | uint32 | The LINK fee percentage to charge on each deposit | -### addValidator +### getSSVFee ```solidity -function addValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external +function getSSVFee() public view returns (uint32) ``` -_Add a validator to the pool manager_ +Get the SSV fee percentage to charge on each deposit -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| depositDataRoot | bytes32 | The deposit data root | -| publicKey | bytes | The validator public key | -| operatorIds | uint32[] | The operator IDs | -| sharesEncrypted | bytes[] | The encrypted shares | -| sharesPublicKeys | bytes[] | The public keys of the shares | -| signature | bytes | The signature | -| withdrawalCredentials | bytes | The withdrawal credentials | - -### exitValidator - -```solidity -function exitValidator(uint256 index) external -``` +| [0] | uint32 | The SSV fee percentage to charge on each deposit | ### getStakedValidatorPublicKeys @@ -917,100 +917,6 @@ function remove(uint32[] arr, uint256 index) internal function remove(bytes[] arr, uint256 index) internal ``` -## MockAggregator - -### version - -```solidity -uint256 version -``` - -### description - -```solidity -string description -``` - -### decimals - -```solidity -uint8 decimals -``` - -### latestAnswer - -```solidity -int256 latestAnswer -``` - -### latestTimestamp - -```solidity -uint256 latestTimestamp -``` - -### latestRound - -```solidity -uint256 latestRound -``` - -### getAnswer - -```solidity -mapping(uint256 => int256) getAnswer -``` - -### getTimestamp - -```solidity -mapping(uint256 => uint256) getTimestamp -``` - -### constructor - -```solidity -constructor(uint8 _decimals, int256 _initialAnswer) public -``` - -### updateAnswer - -```solidity -function updateAnswer(int256 _answer) public -``` - -### updateRoundData - -```solidity -function updateRoundData(uint80 _roundId, int256 _answer, uint256 _timestamp, uint256 _startedAt) public -``` - -### getRoundData - -```solidity -function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) -``` - -### latestRoundData - -```solidity -function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) -``` - -## MockKeeperRegistry - -### registerUpkeep - -```solidity -function registerUpkeep(address target, uint32 gasLimit, address admin, bytes checkData, bytes offchainConfig) external view returns (uint256 id) -``` - -### getState - -```solidity -function getState() external pure returns (struct State state, struct OnchainConfig config, address[] signers, address[] transmitters, uint8 f) -``` - ## Functions ### DEFAULT_BUFFER_SIZE @@ -1800,214 +1706,40 @@ Query the current deposit count. | ---- | ---- | ----------- | | [0] | bytes | The deposit count encoded as a little endian 64-bit number. | -## OnchainConfig +## ISSVToken + +### mint ```solidity -struct OnchainConfig { - uint32 paymentPremiumPPB; - uint32 flatFeeMicroLink; - uint32 checkGasLimit; - uint24 stalenessSeconds; - uint16 gasCeilingMultiplier; - uint96 minUpkeepSpend; - uint32 maxPerformGas; - uint32 maxCheckDataSize; - uint32 maxPerformDataSize; - uint256 fallbackGasPrice; - uint256 fallbackLinkPrice; - address transcoder; - address registrar; -} +function mint(address to, uint256 amount) external ``` -## State +Mint tokens + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| to | address | The target address | +| amount | uint256 | The amount of token to mint | + +## IWETH9 + +### deposit ```solidity -struct State { - uint32 nonce; - uint96 ownerLinkBalance; - uint256 expectedLinkBalance; - uint96 totalPremium; - uint256 numUpkeeps; - uint32 configCount; - uint32 latestConfigBlockNumber; - bytes32 latestConfigDigest; - uint32 latestEpoch; - bool paused; -} +function deposit() external payable ``` -## UpkeepInfo +Deposit ether to get wrapped ether + +### withdraw ```solidity -struct UpkeepInfo { - address target; - uint32 executeGas; - bytes checkData; - uint96 balance; - address admin; - uint64 maxValidBlocknumber; - uint32 lastPerformBlockNumber; - uint96 amountSpent; - bool paused; - bytes offchainConfig; -} +function withdraw(uint256) external ``` -## UpkeepFailureReason - -```solidity -enum UpkeepFailureReason { - NONE, - UPKEEP_CANCELLED, - UPKEEP_PAUSED, - TARGET_CHECK_REVERTED, - UPKEEP_NOT_NEEDED, - PERFORM_DATA_EXCEEDS_LIMIT, - INSUFFICIENT_BALANCE -} -``` - -## KeeperRegistryBaseInterface - -### registerUpkeep - -```solidity -function registerUpkeep(address target, uint32 gasLimit, address admin, bytes checkData, bytes offchainConfig) external returns (uint256 id) -``` - -### cancelUpkeep - -```solidity -function cancelUpkeep(uint256 id) external -``` - -### pauseUpkeep - -```solidity -function pauseUpkeep(uint256 id) external -``` - -### unpauseUpkeep - -```solidity -function unpauseUpkeep(uint256 id) external -``` - -### transferUpkeepAdmin - -```solidity -function transferUpkeepAdmin(uint256 id, address proposed) external -``` - -### acceptUpkeepAdmin - -```solidity -function acceptUpkeepAdmin(uint256 id) external -``` - -### updateCheckData - -```solidity -function updateCheckData(uint256 id, bytes newCheckData) external -``` - -### addFunds - -```solidity -function addFunds(uint256 id, uint96 amount) external -``` - -### setUpkeepGasLimit - -```solidity -function setUpkeepGasLimit(uint256 id, uint32 gasLimit) external -``` - -### setUpkeepOffchainConfig - -```solidity -function setUpkeepOffchainConfig(uint256 id, bytes config) external -``` - -### getUpkeep - -```solidity -function getUpkeep(uint256 id) external view returns (struct UpkeepInfo upkeepInfo) -``` - -### getActiveUpkeepIDs - -```solidity -function getActiveUpkeepIDs(uint256 startIndex, uint256 maxCount) external view returns (uint256[]) -``` - -### getTransmitterInfo - -```solidity -function getTransmitterInfo(address query) external view returns (bool active, uint8 index, uint96 balance, uint96 lastCollected, address payee) -``` - -### getState - -```solidity -function getState() external view returns (struct State state, struct OnchainConfig config, address[] signers, address[] transmitters, uint8 f) -``` - -## IKeeperRegistry - -_The view methods are not actually marked as view in the implementation -but we want them to be easily queried off-chain. Solidity will not compile -if we actually inherit from this interface, so we document it here._ - -### checkUpkeep - -```solidity -function checkUpkeep(uint256 upkeepId) external view returns (bool upkeepNeeded, bytes performData, enum UpkeepFailureReason upkeepFailureReason, uint256 gasUsed, uint256 fastGasWei, uint256 linkNative) -``` - -## KeeperRegistryExecutableInterface - -### checkUpkeep - -```solidity -function checkUpkeep(uint256 upkeepId) external returns (bool upkeepNeeded, bytes performData, enum UpkeepFailureReason upkeepFailureReason, uint256 gasUsed, uint256 fastGasWei, uint256 linkNative) -``` - -## ISSVToken - -### mint - -```solidity -function mint(address to, uint256 amount) external -``` - -Mint tokens - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| to | address | The target address | -| amount | uint256 | The amount of token to mint | - -## IWETH9 - -### deposit - -```solidity -function deposit() external payable -``` - -Deposit ether to get wrapped ether - -### withdraw - -```solidity -function withdraw(uint256) external -``` - -Withdraw wrapped ether to get ether +Withdraw wrapped ether to get ether ## Buffer @@ -2407,3 +2139,271 @@ function writeKVMap(struct CBOR.CBORBuffer buf, string key) internal pure function writeKVArray(struct CBOR.CBORBuffer buf, string key) internal pure ``` +## MockAggregator + +### version + +```solidity +uint256 version +``` + +### description + +```solidity +string description +``` + +### decimals + +```solidity +uint8 decimals +``` + +### latestAnswer + +```solidity +int256 latestAnswer +``` + +### latestTimestamp + +```solidity +uint256 latestTimestamp +``` + +### latestRound + +```solidity +uint256 latestRound +``` + +### getAnswer + +```solidity +mapping(uint256 => int256) getAnswer +``` + +### getTimestamp + +```solidity +mapping(uint256 => uint256) getTimestamp +``` + +### constructor + +```solidity +constructor(uint8 _decimals, int256 _initialAnswer) public +``` + +### updateAnswer + +```solidity +function updateAnswer(int256 _answer) public +``` + +### updateRoundData + +```solidity +function updateRoundData(uint80 _roundId, int256 _answer, uint256 _timestamp, uint256 _startedAt) public +``` + +### getRoundData + +```solidity +function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +### latestRoundData + +```solidity +function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +## MockKeeperRegistry + +### registerUpkeep + +```solidity +function registerUpkeep(address target, uint32 gasLimit, address admin, bytes checkData, bytes offchainConfig) external view returns (uint256 id) +``` + +### getState + +```solidity +function getState() external pure returns (struct State state, struct OnchainConfig config, address[] signers, address[] transmitters, uint8 f) +``` + +## OnchainConfig + +```solidity +struct OnchainConfig { + uint32 paymentPremiumPPB; + uint32 flatFeeMicroLink; + uint32 checkGasLimit; + uint24 stalenessSeconds; + uint16 gasCeilingMultiplier; + uint96 minUpkeepSpend; + uint32 maxPerformGas; + uint32 maxCheckDataSize; + uint32 maxPerformDataSize; + uint256 fallbackGasPrice; + uint256 fallbackLinkPrice; + address transcoder; + address registrar; +} +``` + +## State + +```solidity +struct State { + uint32 nonce; + uint96 ownerLinkBalance; + uint256 expectedLinkBalance; + uint96 totalPremium; + uint256 numUpkeeps; + uint32 configCount; + uint32 latestConfigBlockNumber; + bytes32 latestConfigDigest; + uint32 latestEpoch; + bool paused; +} +``` + +## UpkeepInfo + +```solidity +struct UpkeepInfo { + address target; + uint32 executeGas; + bytes checkData; + uint96 balance; + address admin; + uint64 maxValidBlocknumber; + uint32 lastPerformBlockNumber; + uint96 amountSpent; + bool paused; + bytes offchainConfig; +} +``` + +## UpkeepFailureReason + +```solidity +enum UpkeepFailureReason { + NONE, + UPKEEP_CANCELLED, + UPKEEP_PAUSED, + TARGET_CHECK_REVERTED, + UPKEEP_NOT_NEEDED, + PERFORM_DATA_EXCEEDS_LIMIT, + INSUFFICIENT_BALANCE +} +``` + +## KeeperRegistryBaseInterface + +### registerUpkeep + +```solidity +function registerUpkeep(address target, uint32 gasLimit, address admin, bytes checkData, bytes offchainConfig) external returns (uint256 id) +``` + +### cancelUpkeep + +```solidity +function cancelUpkeep(uint256 id) external +``` + +### pauseUpkeep + +```solidity +function pauseUpkeep(uint256 id) external +``` + +### unpauseUpkeep + +```solidity +function unpauseUpkeep(uint256 id) external +``` + +### transferUpkeepAdmin + +```solidity +function transferUpkeepAdmin(uint256 id, address proposed) external +``` + +### acceptUpkeepAdmin + +```solidity +function acceptUpkeepAdmin(uint256 id) external +``` + +### updateCheckData + +```solidity +function updateCheckData(uint256 id, bytes newCheckData) external +``` + +### addFunds + +```solidity +function addFunds(uint256 id, uint96 amount) external +``` + +### setUpkeepGasLimit + +```solidity +function setUpkeepGasLimit(uint256 id, uint32 gasLimit) external +``` + +### setUpkeepOffchainConfig + +```solidity +function setUpkeepOffchainConfig(uint256 id, bytes config) external +``` + +### getUpkeep + +```solidity +function getUpkeep(uint256 id) external view returns (struct UpkeepInfo upkeepInfo) +``` + +### getActiveUpkeepIDs + +```solidity +function getActiveUpkeepIDs(uint256 startIndex, uint256 maxCount) external view returns (uint256[]) +``` + +### getTransmitterInfo + +```solidity +function getTransmitterInfo(address query) external view returns (bool active, uint8 index, uint96 balance, uint96 lastCollected, address payee) +``` + +### getState + +```solidity +function getState() external view returns (struct State state, struct OnchainConfig config, address[] signers, address[] transmitters, uint8 f) +``` + +## IKeeperRegistry + +_The view methods are not actually marked as view in the implementation +but we want them to be easily queried off-chain. Solidity will not compile +if we actually inherit from this interface, so we document it here._ + +### checkUpkeep + +```solidity +function checkUpkeep(uint256 upkeepId) external view returns (bool upkeepNeeded, bytes performData, enum UpkeepFailureReason upkeepFailureReason, uint256 gasUsed, uint256 fastGasWei, uint256 linkNative) +``` + +## KeeperRegistryExecutableInterface + +### checkUpkeep + +```solidity +function checkUpkeep(uint256 upkeepId) external returns (bool upkeepNeeded, bytes performData, enum UpkeepFailureReason upkeepFailureReason, uint256 gasUsed, uint256 fastGasWei, uint256 linkNative) +``` + diff --git a/contracts/ethereum/src/CasimirAutomation.sol b/contracts/ethereum/src/CasimirAutomation.sol index 36355ff22..2cb9a916c 100644 --- a/contracts/ethereum/src/CasimirAutomation.sol +++ b/contracts/ethereum/src/CasimirAutomation.sol @@ -6,6 +6,7 @@ import "./interfaces/ICasimirManager.sol"; import "./interfaces/ICasimirPoR.sol"; import {Functions, FunctionsClient} from "./vendor/FunctionsClient.sol"; // import "@chainlink/contracts/src/v0.8/dev/functions/FunctionsClient.sol"; // Once published +import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/math/SafeCast.sol"; import "hardhat/console.sol"; @@ -18,7 +19,10 @@ import "hardhat/console.sol"; /** * @title Oracle contract that triggers and handles actions */ -contract CasimirAutomation is ICasimirAutomation { +contract CasimirAutomation is ICasimirAutomation, Ownable { + + // Todo add FunctionsClient before Ownable + /*************/ /* Constants */ /*************/ @@ -48,8 +52,10 @@ contract CasimirAutomation is ICasimirAutomation { * Constructor * @param casimirManagerAddress The manager contract address */ - constructor(address casimirManagerAddress) { + constructor(address casimirManagerAddress/*, address linkFunctionsAddress*/) { casimirManager = ICasimirManager(casimirManagerAddress); + + // Todo add FunctionsClient(linkFunctionsAddress) after constructor params } /** @@ -97,7 +103,7 @@ contract CasimirAutomation is ICasimirAutomation { (uint32[] memory readyPoolIds, uint256 executionSwept) = abi.decode(performData, (uint32[], uint256)); /** Stake ready pools */ - for (uint i = 0; i < readyPoolIds.length; i++) { + for (uint256 i = 0; i < readyPoolIds.length; i++) { casimirManager.stakePool(readyPoolIds[i]); } @@ -107,6 +113,29 @@ contract CasimirAutomation is ICasimirAutomation { } } + // /** + // * @notice Callback that is invoked once the DON has resolved the request or hit an error + // * + // * @param requestId The request ID, returned by sendRequest() + // * @param response Aggregated response from the user code + // * @param err Aggregated error from the user code or from the execution pipeline + // * Either response or error parameter will be set, but never both + // */ + // function fulfillRequest(bytes32 requestId, bytes memory response, bytes memory err) internal override { + // latestResponse = response; + // latestError = err; + // responseCounter = responseCounter + 1; + // emit OCRResponse(requestId, response, err); + // } + + // /** + // * @notice Update the Functions oracle address + // * @param oracle New oracle address + // */ + // function updateOracleAddress(address oracle) public onlyOwner { + // setOracle(oracle); + // } + /** * @notice Get the total manager stake * @return The total manager stake diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index 17a6a67f0..4bfeae430 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -88,11 +88,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Last pool ID generated for a new pool */ Counters.Counter lastPoolId; /** Token addresses */ - mapping(Token => address) private tokens; - /** Unswapped LINK fees */ - uint256 private unswappedLINKFees; - /** Unswapped SSV fees */ - uint256 private unswappedSSVFees; + mapping(Token => address) private tokenAddresses; + /** Unswapped tokens by address */ + mapping(address => uint256) private unswappedTokens; /** All users */ mapping(address => User) private users; /** All pools (open, ready, or staked) */ @@ -109,7 +107,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { mapping(bytes => Validator) private validators; /** Public keys of ready validators */ bytes[] private readyValidatorPublicKeys; - /** Public keys of staked validators */ + /** Public keys of staked validators */ bytes[] private stakedValidatorPublicKeys; /** Public keys of exiting validators */ bytes[] private exitingValidatorPublicKeys; @@ -143,13 +141,13 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ) { beaconDeposit = IDepositContract(beaconDepositAddress); linkToken = IERC20(linkTokenAddress); - tokens[Token.LINK] = linkTokenAddress; + tokenAddresses[Token.LINK] = linkTokenAddress; ssvNetwork = ISSVNetwork(ssvNetworkAddress); - tokens[Token.SSV] = ssvTokenAddress; + tokenAddresses[Token.SSV] = ssvTokenAddress; ssvToken = ISSVToken(ssvTokenAddress); swapFactory = IUniswapV3Factory(swapFactoryAddress); swapRouter = ISwapRouter(swapRouterAddress); - tokens[Token.WETH] = wethTokenAddress; + tokenAddresses[Token.WETH] = wethTokenAddress; /** Create automation and PoR contracts */ casimirAutomation = new CasimirAutomation(address(this)); @@ -261,27 +259,56 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } } - /** - * Handle SSV fee distribution in stakePool - */ - /** Distribute LINK fees to automation contract */ linkToken.transfer(getAutomationAddress(), processedDeposit.linkAmount); } + /** + * @notice Withdraw user stake from the pool manager + * @param amount The amount of ETH to withdraw + */ + function withdraw(uint256 amount) external nonReentrant { + require(openDeposits >= amount, "Withdrawing more than open deposits"); + require(users[msg.sender].stake0 > 0, "User does not have a stake"); + + /** Settle user's compounded stake */ + users[msg.sender].stake0 = getUserStake(msg.sender); + + require( + users[msg.sender].stake0 >= amount, + "Withdrawing more than user stake" + ); + + /** Update user account state */ + users[msg.sender].distributionSum0 = distributionSum; + users[msg.sender].stake0 -= amount; + + /** Update balance state */ + Pool storage pool = pools[openPoolIds[0]]; + pool.deposits -= amount; + openDeposits -= amount; + + /** Send ETH from manager to user */ + (bool success, ) = msg.sender.call{value: amount}(""); + require(success, "Transfer failed"); + + emit UserWithdrawed(msg.sender, amount); + } + /** * @dev Stake a pool validator and register with SSV * @param poolId The pool ID */ - function stakePool(uint32 poolId) external { + function stakePool(uint32 poolId) public { require(readyValidatorPublicKeys.length > 0, "No ready validators"); /** Get next ready validator */ - bytes memory publicKey = readyValidatorPublicKeys[0]; - Validator memory validator = validators[publicKey]; + bytes memory validatorPublicKey = readyValidatorPublicKeys[0]; + Validator memory validator = validators[validatorPublicKey]; /** Get the pool */ Pool storage pool = pools[poolId]; + pool.validatorPublicKey = validatorPublicKey; /** Move pool from ready to staked state */ readyPoolIds.remove(0); @@ -289,12 +316,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Move validator from inactive to active state and add to pool */ readyValidatorPublicKeys.remove(0); - stakedValidatorPublicKeys.push(publicKey); - pool.validatorIndex = stakedValidatorPublicKeys.length - 1; + stakedValidatorPublicKeys.push(validatorPublicKey); /** Deposit validator */ beaconDeposit.deposit{value: pool.deposits}( - publicKey, // bytes + validatorPublicKey, // bytes validator.withdrawalCredentials, // bytes validator.signature, // bytes validator.depositDataRoot // bytes32 @@ -305,7 +331,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint256 mockSSVFee = 5 ether; ssvToken.approve(address(ssvNetwork), mockSSVFee); ssvNetwork.registerValidator( - publicKey, // bytes + validatorPublicKey, // bytes validator.operatorIds, // uint32[] validator.sharesPublicKeys, // bytes[] validator.sharesEncrypted, // bytes[], @@ -315,38 +341,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { emit PoolStaked(poolId); } - /** - * @notice Withdraw user stake from the pool manager - * @param amount The amount of ETH to withdraw - */ - function withdraw(uint256 amount) external nonReentrant { - require(openDeposits >= amount, "Withdrawing more than open deposits"); - require(users[msg.sender].stake0 > 0, "User does not have a stake"); - - /** Settle user's compounded stake */ - users[msg.sender].stake0 = getUserStake(msg.sender); - - require( - users[msg.sender].stake0 >= amount, - "Withdrawing more than user stake" - ); - - /** Update user account state */ - users[msg.sender].distributionSum0 = distributionSum; - users[msg.sender].stake0 -= amount; - - /** Update balance state */ - Pool storage pool = pools[openPoolIds[0]]; - pool.deposits -= amount; - openDeposits -= amount; - - /** Send ETH from manager to user */ - (bool success, ) = msg.sender.call{value: amount}(""); - require(success, "Transfer failed"); - - emit UserWithdrawed(msg.sender, amount); - } - /** * @dev Process fees from a deposit * @param depositAmount The amount of ETH to deposit @@ -373,14 +367,14 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { wrap(feeAmount); linkAmount = swap( - tokens[Token.WETH], - tokens[Token.LINK], + tokenAddresses[Token.WETH], + tokenAddresses[Token.LINK], (feeAmount * fees.LINK) / feePercent ); ssvAmount = swap( - tokens[Token.WETH], - tokens[Token.SSV], + tokenAddresses[Token.WETH], + tokenAddresses[Token.SSV], (feeAmount * fees.SSV) / feePercent ); } @@ -392,7 +386,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param amount The amount of ETH to deposit */ function wrap(uint256 amount) private { - IWETH9 wethToken = IWETH9(tokens[Token.WETH]); + IWETH9 wethToken = IWETH9(tokenAddresses[Token.WETH]); wethToken.deposit{value: amount}(); wethToken.approve(address(swapRouter), amount); } @@ -402,68 +396,99 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param tokenIn The token-in address * @param tokenOut The token-out address * @param amountIn The amount of token-in to input - * @return The amount of token-out + * @return amountOut The amount of token-out */ function swap( address tokenIn, address tokenOut, uint256 amountIn - ) private returns (uint256) { + ) private returns (uint256 amountOut) { /** Temporarily handle unswappable fees due to liquidity */ address swapPool = swapFactory.getPool( tokenIn, tokenOut, uniswapFeeTier ); - uint128 liquidity = IUniswapV3PoolState(swapPool).liquidity(); - if (liquidity == 0) { - if (tokenOut == tokens[Token.LINK]) { - unswappedLINKFees += amountIn; - } else if (tokenOut == tokens[Token.SSV]) { - unswappedSSVFees += amountIn; - } - return 0; + uint256 liquidity = IUniswapV3PoolState(swapPool).liquidity(); + uint256 desiredAmountIn = amountIn + unswappedTokens[tokenIn]; + uint256 realAmountIn; + + if (liquidity < desiredAmountIn) { + realAmountIn = liquidity; + unswappedTokens[tokenIn] = desiredAmountIn - liquidity; + } else { + realAmountIn = desiredAmountIn; + unswappedTokens[tokenIn] = 0; } - if (tokenOut == tokens[Token.LINK]) { - amountIn += unswappedLINKFees; - unswappedLINKFees = 0; - } else if (tokenOut == tokens[Token.SSV]) { - amountIn += unswappedSSVFees; - unswappedSSVFees = 0; + + if (realAmountIn > 0) { + /** Get swap params */ + ISwapRouter.ExactInputSingleParams memory params = ISwapRouter + .ExactInputSingleParams({ + tokenIn: tokenIn, + tokenOut: tokenOut, + fee: uniswapFeeTier, + recipient: address(this), + deadline: block.timestamp, + amountIn: realAmountIn, + amountOutMinimum: 0, + sqrtPriceLimitX96: 0 + }); + + /** Swap token */ + amountOut = swapRouter.exactInputSingle(params); } + } + + /** + * @dev Request a pool exit + * @param poolId The staked pool ID + */ + function requestPoolExit(uint32 poolId) public { + require(msg.sender == getAutomationAddress(), "Only automation can request pool exits"); + + Pool storage pool = pools[poolId]; + pool.exiting = true; - /** Get swap params */ - ISwapRouter.ExactInputSingleParams memory params = ISwapRouter - .ExactInputSingleParams({ - tokenIn: tokenIn, - tokenOut: tokenOut, - fee: uniswapFeeTier, - recipient: address(this), - deadline: block.timestamp, - amountIn: amountIn, - amountOutMinimum: 0, - sqrtPriceLimitX96: 0 - }); - - /** Swap tokens */ - return swapRouter.exactInputSingle(params); + /** Record validator as exiting for automation */ + exitingValidatorPublicKeys.push(pool.validatorPublicKey); + + emit PoolExitRequested(poolId); } /** - * @dev Remove a pool - * @param poolId The pool ID + * @dev Complete a pool exit + * @param poolIndex The staked pool index + * @param stakedValidatorIndex The staked validator index + * @param exitingValidatorIndex The exiting validator index */ - function removePool(uint32 poolId) external /**onlyUpkeep*/ { + function completePoolExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) public { + require(msg.sender == getAutomationAddress(), "Only automation can complete pool exits"); + + uint32 poolId = stakedPoolIds[poolIndex]; Pool storage pool = pools[poolId]; - /** Remove pool validator from Beacon and SSV */ - removeValidator(pool.validatorIndex); + require(pool.exiting, "Pool is not exiting"); + + bytes memory validatorPublicKey = pool.validatorPublicKey; + bytes memory stakedValidatorPublicKey = stakedValidatorPublicKeys[stakedValidatorIndex]; + bytes memory exitingValidatorPublicKey = exitingValidatorPublicKeys[exitingValidatorIndex]; + + require(keccak256(validatorPublicKey) == keccak256(stakedValidatorPublicKey) && keccak256(validatorPublicKey) == keccak256(exitingValidatorPublicKey), "Pool validator does not match staked and exiting validator"); /** Remove pool from staked pools and delete */ - stakedPoolIds.remove(0); + stakedPoolIds.remove(poolIndex); delete pools[poolId]; - emit PoolRemoved(poolId); + /** Remove validator from staked and exiting states and delete */ + stakedValidatorPublicKeys.remove(stakedValidatorIndex); + exitingValidatorPublicKeys.remove(exitingValidatorIndex); + delete validators[validatorPublicKey]; + + /** Remove validator from SSV */ + ssvNetwork.removeValidator(validatorPublicKey); + + emit PoolExitCompleted(poolId); } /** @@ -484,7 +509,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { bytes[] memory sharesPublicKeys, bytes calldata signature, bytes calldata withdrawalCredentials - ) external /**onlyUpkeep*/ { + ) public onlyOwner { /** Create validator and add to ready state */ validators[publicKey] = Validator( depositDataRoot, @@ -499,35 +524,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { emit ValidatorAdded(publicKey); } - function exitValidator(uint index) external /**onlyUpkeep*/ { - /** Get validator public key */ - bytes memory publicKey = stakedValidatorPublicKeys[index]; - - /** Move validator from staked to exiting state */ - stakedValidatorPublicKeys.remove(index); - exitingValidatorPublicKeys.push(publicKey); - - emit ValidatorExited(publicKey); - } - - /** - * @dev Remove a validator from the pool manager - * @param index The validator index - */ - function removeValidator(uint index) private /**onlyUpkeep*/ { - /** Get public key */ - bytes memory publicKey = exitingValidatorPublicKeys[index]; - - /** Remove validator from exiting state and delete */ - exitingValidatorPublicKeys.remove(index); - delete validators[publicKey]; - - /** Remove validator from SSV */ - ssvNetwork.removeValidator(publicKey); - - emit ValidatorRemoved(publicKey); - } - /** * @notice Get the current token fees as percentages * @return The current token fees as percentages @@ -681,14 +677,14 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ) external view returns (PoolDetails memory) { Pool memory pool = pools[poolId]; - /** Will return invalid data if pool is still in ready state */ - if (pool.deposits < poolCapacity) { - return PoolDetails(pool.deposits, new bytes(0), new uint32[](0)); + /** Pool will not have validator or operators if still in ready state */ + bytes memory emptyBytes = new bytes(0); + if (keccak256(pool.validatorPublicKey) == keccak256(emptyBytes)) { + return PoolDetails(pool.deposits, emptyBytes, new uint32[](0), pool.exiting); + } else { + Validator memory validator = validators[pool.validatorPublicKey]; + return PoolDetails(pool.deposits, pool.validatorPublicKey, validator.operatorIds, pool.exiting); } - - bytes memory publicKey = stakedValidatorPublicKeys[pool.validatorIndex]; - Validator memory validator = validators[publicKey]; - return PoolDetails(pool.deposits, publicKey, validator.operatorIds); } /** diff --git a/contracts/ethereum/src/CasimirPoR.sol b/contracts/ethereum/src/CasimirPoR.sol index 60acb380b..ea79600b7 100644 --- a/contracts/ethereum/src/CasimirPoR.sol +++ b/contracts/ethereum/src/CasimirPoR.sol @@ -15,7 +15,7 @@ contract CasimirPoR is ICasimirPoR { /* Manager contract */ ICasimirManager private immutable casimirManager; - /** Chainlink feed contract */ + /** Chainlink PoR feed contract */ AggregatorV3Interface private immutable linkFeed; /***************/ @@ -25,7 +25,7 @@ contract CasimirPoR is ICasimirPoR { /** * Constructor * @param casimirManagerAddress The manager contract address - * @param linkFeedAddress The chainlink feed contract address + * @param linkFeedAddress The chainlink PoR feed contract address */ constructor(address casimirManagerAddress, address linkFeedAddress) { casimirManager = ICasimirManager(casimirManagerAddress); diff --git a/contracts/ethereum/src/interfaces/ICasimirAutomation.sol b/contracts/ethereum/src/interfaces/ICasimirAutomation.sol index a66c4811e..5d254d2e6 100644 --- a/contracts/ethereum/src/interfaces/ICasimirAutomation.sol +++ b/contracts/ethereum/src/interfaces/ICasimirAutomation.sol @@ -4,6 +4,12 @@ pragma solidity ^0.8.7; import "@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol"; interface ICasimirAutomation is AutomationCompatibleInterface { + /**********/ + /* Events */ + /**********/ + + event OCRResponse(bytes32 indexed requestId, bytes result, bytes err); + /*************/ /* Functions */ /*************/ diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index 4971b6738..2766a50e5 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -20,13 +20,15 @@ interface ICasimirManager { /** Pool used for running a validator */ struct Pool { uint256 deposits; - uint validatorIndex; + bytes validatorPublicKey; + bool exiting; } /** Pool with details */ struct PoolDetails { uint256 deposits; - bytes publicKey; + bytes validatorPublicKey; uint32[] operatorIds; + bool exiting; } /** User staking account */ struct User { @@ -58,18 +60,13 @@ interface ICasimirManager { uint32 poolId, uint256 amount ); - event PoolStaked( - uint32 indexed poolId - ); - event PoolRemoved( - uint32 indexed poolId - ); - event ValidatorAdded(bytes publicKey); - event ValidatorExited(bytes publicKey); - event ValidatorRemoved(bytes publicKey); + event PoolStaked(uint32 indexed poolId); + event PoolExitRequested(uint32 indexed poolId); + event PoolExitCompleted(uint32 indexed poolId); + event ValidatorAdded(bytes indexed publicKey); event UserWithdrawed( address indexed sender, - uint256 ethAmount + uint256 amount ); /*************/ @@ -84,6 +81,20 @@ interface ICasimirManager { function stakePool(uint32 poolId) external; + function requestPoolExit(uint32 poolId) external; + + function completePoolExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) external; + + function addValidator( + bytes32 depositDataRoot, + bytes calldata publicKey, + uint32[] memory operatorIds, + bytes[] memory sharesEncrypted, + bytes[] memory sharesPublicKeys, + bytes calldata signature, + bytes calldata withdrawalCredentials + ) external; + function getFees() external view returns (Fees memory); function getLINKFee() external view returns (uint32); diff --git a/contracts/ethereum/test/integration.ts b/contracts/ethereum/test/integration.ts index 388aa12c8..7951a2515 100644 --- a/contracts/ethereum/test/integration.ts +++ b/contracts/ethereum/test/integration.ts @@ -46,7 +46,7 @@ describe('Casimir manager', async function () { const firstPoolId = stakedPools[0] const pool = await casimirManager.getPoolDetails(firstPoolId) expect(ethers.utils.formatEther(pool.deposits)).equal('32.0') - expect(pool.publicKey).not.equal('0x') + expect(pool.validatorPublicKey).not.equal('0x') expect(pool.operatorIds.length).equal(4) }) @@ -94,7 +94,7 @@ describe('Casimir manager', async function () { const secondPoolId = stakedPools[1] const pool = await casimirManager.getPoolDetails(secondPoolId) expect(ethers.utils.formatEther(pool.deposits)).equal('32.0') - expect(pool.publicKey).not.equal('0x') + expect(pool.validatorPublicKey).not.equal('0x') expect(pool.operatorIds.length).equal(4) }) @@ -152,13 +152,13 @@ describe('Casimir manager', async function () { const thirdPoolId = stakedPools[2] const thirdPool = await casimirManager.getPoolDetails(thirdPoolId) expect(ethers.utils.formatEther(thirdPool.deposits)).equal('32.0') - expect(thirdPool.publicKey).not.equal('0x') + expect(thirdPool.validatorPublicKey).not.equal('0x') expect(thirdPool.operatorIds.length).equal(4) const fourthPoolId = stakedPools[3] const fourthPool = await casimirManager.getPoolDetails(fourthPoolId) expect(ethers.utils.formatEther(fourthPool.deposits)).equal('32.0') - expect(fourthPool.publicKey).not.equal('0x') + expect(fourthPool.validatorPublicKey).not.equal('0x') expect(fourthPool.operatorIds.length).equal(4) }) @@ -171,12 +171,12 @@ describe('Casimir manager', async function () { const fourthStake = await casimirManager.getUserStake(fourthUser.address) const line = '----------------------------------------' - console.log(`${line}\n💿 Post testing simulation results\n${line}`) - console.log('🏦 Manager updated balance', ethers.utils.formatEther(stake)) - console.log('👤 First user updated balance', ethers.utils.formatEther(firstStake)) - console.log('👤 Second user updated balance', ethers.utils.formatEther(secondStake)) - console.log('👤 Third user updated balance', ethers.utils.formatEther(thirdStake)) - console.log('👤 Fourth user updated balance', ethers.utils.formatEther(fourthStake)) + console.log(`${line}\n💿 Simulation results\n${line}`) + console.log('🏦 Manager stake', ethers.utils.formatEther(stake)) + console.log('👤 First user stake', ethers.utils.formatEther(firstStake)) + console.log('👤 Second user stake', ethers.utils.formatEther(secondStake)) + console.log('👤 Third user stake', ethers.utils.formatEther(thirdStake)) + console.log('👤 Fourth user stake', ethers.utils.formatEther(fourthStake)) const openDeposits = await casimirManager.getOpenDeposits() console.log('📦 Open deposits', ethers.utils.formatEther(openDeposits)) const dust = stake.sub(firstStake.add(secondStake).add(thirdStake).add(fourthStake)) From bd0137d3cc8063c14c257d68406dcd06b01f8c57 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Fri, 21 Apr 2023 23:43:04 -0400 Subject: [PATCH 10/78] Add withdrawal handlers --- contracts/ethereum/docs/index.md | 94 +++++--- contracts/ethereum/src/CasimirAutomation.sol | 2 +- contracts/ethereum/src/CasimirManager.sol | 203 +++++++++++++----- .../src/interfaces/ICasimirManager.sol | 26 ++- 4 files changed, 235 insertions(+), 90 deletions(-) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 119431e63..5601c82a8 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -188,10 +188,24 @@ function deposit() external payable Deposit user stake to the pool manager +### withdraw + +```solidity +function withdraw(uint256 amount) external +``` + +Withdraw user stake from the pool manager + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| amount | uint256 | The amount of ETH to withdraw | + ### stakePool ```solidity -function stakePool(uint32 poolId) external +function stakePool(uint32 poolId) public ``` _Stake a pool validator and register with SSV_ @@ -202,38 +216,40 @@ _Stake a pool validator and register with SSV_ | ---- | ---- | ----------- | | poolId | uint32 | The pool ID | -### withdraw +### requestPoolExit ```solidity -function withdraw(uint256 amount) external +function requestPoolExit(uint32 poolId) public ``` -Withdraw user stake from the pool manager +_Request a pool exit_ #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| amount | uint256 | The amount of ETH to withdraw | +| poolId | uint32 | The staked pool ID | -### removePool +### completePoolExit ```solidity -function removePool(uint32 poolId) external +function completePoolExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) public ``` -_Remove a pool_ +_Complete a pool exit_ #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | +| poolIndex | uint256 | The staked pool index | +| stakedValidatorIndex | uint256 | The staked validator index | +| exitingValidatorIndex | uint256 | The exiting validator index | ### addValidator ```solidity -function addValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external +function addValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) public ``` _Add a validator to the pool manager_ @@ -250,12 +266,6 @@ _Add a validator to the pool manager_ | signature | bytes | The signature | | withdrawalCredentials | bytes | The withdrawal credentials | -### exitValidator - -```solidity -function exitValidator(uint256 index) external -``` - ### getFees ```solidity @@ -537,7 +547,7 @@ Constructor | Name | Type | Description | | ---- | ---- | ----------- | | casimirManagerAddress | address | The manager contract address | -| linkFeedAddress | address | The chainlink feed contract address | +| linkFeedAddress | address | The chainlink PoR feed contract address | ### getPoRAddressListLength @@ -590,6 +600,12 @@ Get the total manager consensus stake ## ICasimirAutomation +### OCRResponse + +```solidity +event OCRResponse(bytes32 requestId, bytes result, bytes err) +``` + ### checkUpkeep ```solidity @@ -667,7 +683,8 @@ struct Fees { ```solidity struct Pool { uint256 deposits; - uint256 validatorIndex; + bytes validatorPublicKey; + bool exiting; } ``` @@ -676,8 +693,9 @@ struct Pool { ```solidity struct PoolDetails { uint256 deposits; - bytes publicKey; + bytes validatorPublicKey; uint32[] operatorIds; + bool exiting; } ``` @@ -721,34 +739,28 @@ event PoolDeposit(address sender, uint32 poolId, uint256 amount) event PoolStaked(uint32 poolId) ``` -### PoolRemoved +### PoolExitRequested ```solidity -event PoolRemoved(uint32 poolId) +event PoolExitRequested(uint32 poolId) ``` -### ValidatorAdded +### PoolExitCompleted ```solidity -event ValidatorAdded(bytes publicKey) +event PoolExitCompleted(uint32 poolId) ``` -### ValidatorExited - -```solidity -event ValidatorExited(bytes publicKey) -``` - -### ValidatorRemoved +### ValidatorAdded ```solidity -event ValidatorRemoved(bytes publicKey) +event ValidatorAdded(bytes publicKey) ``` ### UserWithdrawed ```solidity -event UserWithdrawed(address sender, uint256 ethAmount) +event UserWithdrawed(address sender, uint256 amount) ``` ### deposit @@ -775,6 +787,24 @@ function withdraw(uint256 amount) external function stakePool(uint32 poolId) external ``` +### requestPoolExit + +```solidity +function requestPoolExit(uint32 poolId) external +``` + +### completePoolExit + +```solidity +function completePoolExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) external +``` + +### addValidator + +```solidity +function addValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external +``` + ### getFees ```solidity diff --git a/contracts/ethereum/src/CasimirAutomation.sol b/contracts/ethereum/src/CasimirAutomation.sol index 2cb9a916c..6b49ea937 100644 --- a/contracts/ethereum/src/CasimirAutomation.sol +++ b/contracts/ethereum/src/CasimirAutomation.sol @@ -104,7 +104,7 @@ contract CasimirAutomation is ICasimirAutomation, Ownable { /** Stake ready pools */ for (uint256 i = 0; i < readyPoolIds.length; i++) { - casimirManager.stakePool(readyPoolIds[i]); + casimirManager.stake(readyPoolIds[i]); } /** Compound rewards */ diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index 4bfeae430..ab3b14cdd 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -149,7 +149,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { swapRouter = ISwapRouter(swapRouterAddress); tokenAddresses[Token.WETH] = wethTokenAddress; - /** Create automation and PoR contracts */ + /** Deploy automation and PoR contracts */ casimirAutomation = new CasimirAutomation(address(this)); casimirPoR = new CasimirPoR(address(this), linkFeedAddress); } @@ -163,7 +163,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @dev Distribute ETH rewards * @param amount The amount of ETH to reward */ - function reward(uint256 amount) public { + function reward(uint256 amount) external { + require( + msg.sender == address(casimirAutomation), + "Only automation contract can distribute rewards" + ); require( amount >= rewardThreshold, "Reward amount must be equal or greater than reward threshold" @@ -180,7 +184,15 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { processedDeposit.ethAmount, getStake() ); + distribute(address(this), processedDeposit); + + emit RewardDistributed( + msg.sender, + processedDeposit.ethAmount, + processedDeposit.linkAmount, + processedDeposit.ssvAmount + ); } /** @@ -203,6 +215,13 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { users[msg.sender].stake0 += processedDeposit.ethAmount; distribute(msg.sender, processedDeposit); + + emit UserDeposited( + msg.sender, + processedDeposit.ethAmount, + processedDeposit.linkAmount, + processedDeposit.ssvAmount + ); } /** @@ -214,14 +233,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { address sender, ProcessedDeposit memory processedDeposit ) private { - emit ManagerDistribution( - sender, - processedDeposit.ethAmount, - processedDeposit.linkAmount, - processedDeposit.ssvAmount - ); + /** Approve LINK fees for automation contract */ + linkToken.approve(getAutomationAddress(), processedDeposit.linkAmount); - /** Distribute to open pools */ + /** Distribute ETH to open pools */ while (processedDeposit.ethAmount > 0) { /** Get the next open pool */ uint32 poolId; @@ -237,7 +252,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint256 remainingCapacity = poolCapacity - pool.deposits; if (remainingCapacity > processedDeposit.ethAmount) { /** Emit event before updating values */ - emit PoolDeposit(sender, poolId, processedDeposit.ethAmount); + emit PoolIncreased(sender, poolId, processedDeposit.ethAmount); /** Update pool state */ openDeposits += processedDeposit.ethAmount; @@ -246,7 +261,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { processedDeposit.ethAmount = 0; } else { /** Emit event before updating values */ - emit PoolDeposit(sender, poolId, remainingCapacity); + emit PoolIncreased(sender, poolId, remainingCapacity); /** Move pool from open to ready state */ openDeposits -= pool.deposits; @@ -258,13 +273,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { processedDeposit.ethAmount -= remainingCapacity; } } - - /** Distribute LINK fees to automation contract */ - linkToken.transfer(getAutomationAddress(), processedDeposit.linkAmount); } /** - * @notice Withdraw user stake from the pool manager + * @notice Withdraw user stake * @param amount The amount of ETH to withdraw */ function withdraw(uint256 amount) external nonReentrant { @@ -279,6 +291,20 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { "Withdrawing more than user stake" ); + /** Instantly withdraw if full amount is available */ + if (amount <= openDeposits) { + withdrawInstantly(msg.sender, amount); + } else { + requestWithdrawal(msg.sender, amount); + } + } + + /** + * @dev Withdraw user stake instantly from open deposits + * @param user The user address + * @param amount The amount of ETH to withdraw + */ + function withdrawInstantly(address user, uint256 amount) private { /** Update user account state */ users[msg.sender].distributionSum0 = distributionSum; users[msg.sender].stake0 -= amount; @@ -288,18 +314,76 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { pool.deposits -= amount; openDeposits -= amount; - /** Send ETH from manager to user */ - (bool success, ) = msg.sender.call{value: amount}(""); - require(success, "Transfer failed"); + send(user, amount); + + emit UserWithdrawed(user, amount); + } + + /** + * @dev Request to withdraw user stake from exited deposits + * @param user The user address + * @param amount The amount of ETH to withdraw + */ + function requestWithdrawal(address user, uint256 amount) private { + /** Add withdrawal to queue */ + // Todo - emit UserWithdrawed(msg.sender, amount); + emit UserWithdrawalRequested(user, amount); } /** - * @dev Stake a pool validator and register with SSV + * @notice Initiate withdrawal of user stake from exited deposits + * @param user The user address + * @param amount The amount of ETH to withdraw + */ + function inititateWithdrawal(address user, uint256 amount) external { + require( + msg.sender == getAutomationAddress(), + "Only automation contract can initiate withdrawals" + ); + + /** Update user account state */ + users[user].distributionSum0 = distributionSum; + users[user].stake0 -= amount; + + emit UserWithdrawalInitiated(user, amount); + } + + /** + * @notice Withdraw user stake from exited deposits + * @param user The user address + * @param amount The amount of ETH to withdraw + */ + function completeWithdrawal(address user, uint256 amount) external { + require( + msg.sender == getAutomationAddress(), + "Only automation contract can complete withdrawals" + ); + + /** Remove from withdrawal queue */ + // Todo + + send(user, amount); + + emit UserWithdrawed(user, amount); + } + + /** + * @dev Send ETH to a recipient + * @param recipient The recipient address + * @param amount The amount of ETH to send + */ + function send(address recipient, uint256 amount) private { + (bool success, ) = recipient.call{value: amount}(""); + require(success, "Transfer failed"); + } + + /** + * @notice Stake a pool validator and register with SSV * @param poolId The pool ID */ - function stakePool(uint32 poolId) public { + function stake(uint32 poolId) external { + require(msg.sender == getAutomationAddress(), "Only automation contract can stake pools"); require(readyValidatorPublicKeys.length > 0, "No ready validators"); /** Get next ready validator */ @@ -441,10 +525,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @dev Request a pool exit + * @notice Request a pool exit * @param poolId The staked pool ID */ - function requestPoolExit(uint32 poolId) public { + function requestExit(uint32 poolId) external { require(msg.sender == getAutomationAddress(), "Only automation can request pool exits"); Pool storage pool = pools[poolId]; @@ -457,12 +541,12 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @dev Complete a pool exit + * @notice Complete a pool exit * @param poolIndex The staked pool index * @param stakedValidatorIndex The staked validator index * @param exitingValidatorIndex The exiting validator index */ - function completePoolExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) public { + function completeExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) external { require(msg.sender == getAutomationAddress(), "Only automation can complete pool exits"); uint32 poolId = stakedPoolIds[poolIndex]; @@ -488,11 +572,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Remove validator from SSV */ ssvNetwork.removeValidator(validatorPublicKey); - emit PoolExitCompleted(poolId); + emit PoolExited(poolId); } /** - * @dev Add a validator to the pool manager + * @notice Add a validator to the pool manager * @param depositDataRoot The deposit data root * @param publicKey The validator public key * @param operatorIds The operator IDs @@ -509,7 +593,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { bytes[] memory sharesPublicKeys, bytes calldata signature, bytes calldata withdrawalCredentials - ) public onlyOwner { + ) external onlyOwner { /** Create validator and add to ready state */ validators[publicKey] = Validator( depositDataRoot, @@ -524,12 +608,28 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { emit ValidatorAdded(publicKey); } + /** + * @dev Update link fee + * @param newFee The new fee + */ + function setLINKFee(uint32 newFee) public onlyOwner { + linkFee = newFee; + } + + /** + * @dev Update ssv fee + * @param newFee The new fee + */ + function setSSVFee(uint32 newFee) public onlyOwner { + ssvFee = newFee; + } + /** * @notice Get the current token fees as percentages - * @return The current token fees as percentages + * @return fees The current token fees as percentages */ - function getFees() public view returns (Fees memory) { - return Fees(getLINKFee(), getSSVFee()); + function getFees() public view returns (Fees memory fees) { + fees = Fees(getLINKFee(), getSSVFee()); } /** @@ -640,7 +740,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @return The the total manager expected consensus stake */ function getExpectedConsensusStake() public view returns (int256) { - return int256(getStakedPoolIds().length * poolCapacity); + + // Todo account for queued withdrawal amount + + return int256(stakedPoolIds.length * poolCapacity); } /** @@ -654,52 +757,50 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Get the total user stake for a given user address * @param userAddress The user address - * @return The total user stake + * @return userStake The total user stake */ - function getUserStake(address userAddress) public view returns (uint256) { + function getUserStake(address userAddress) public view returns (uint256 userStake) { require(users[userAddress].stake0 > 0, "User does not have a stake"); - - return - Math.mulDiv( - users[userAddress].stake0, - distributionSum, - users[userAddress].distributionSum0 - ); + userStake = Math.mulDiv( + users[userAddress].stake0, + distributionSum, + users[userAddress].distributionSum0 + ); } /** * @notice Get the pool details for a given pool ID * @param poolId The pool ID - * @return The pool details + * @return poolDetails The pool details */ function getPoolDetails( uint32 poolId - ) external view returns (PoolDetails memory) { + ) external view returns (PoolDetails memory poolDetails) { Pool memory pool = pools[poolId]; /** Pool will not have validator or operators if still in ready state */ bytes memory emptyBytes = new bytes(0); if (keccak256(pool.validatorPublicKey) == keccak256(emptyBytes)) { - return PoolDetails(pool.deposits, emptyBytes, new uint32[](0), pool.exiting); + poolDetails = PoolDetails(pool.deposits, emptyBytes, new uint32[](0), pool.exiting); } else { Validator memory validator = validators[pool.validatorPublicKey]; - return PoolDetails(pool.deposits, pool.validatorPublicKey, validator.operatorIds, pool.exiting); + poolDetails = PoolDetails(pool.deposits, pool.validatorPublicKey, validator.operatorIds, pool.exiting); } } /** * @notice Get the automation address - * @return The automation address + * @return automationAddress The automation address */ - function getAutomationAddress() public view returns (address) { - return address(casimirAutomation); + function getAutomationAddress() public view returns (address automationAddress) { + automationAddress = address(casimirAutomation); } /** * @notice Get the PoR address - * @return The PoR address + * @return porAddress The PoR address */ - function getPoRAddress() public view returns (address) { - return address(casimirPoR); + function getPoRAddress() public view returns (address porAddress) { + porAddress = address(casimirPoR); } } diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index 2766a50e5..5080aec9e 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -49,21 +49,35 @@ interface ICasimirManager { /* Events */ /**********/ - event ManagerDistribution( + event RewardDistributed( address indexed sender, uint256 ethAmount, uint256 linkAmount, uint256 ssvAmount ); - event PoolDeposit( + event UserDeposited( + address indexed sender, + uint256 ethAmount, + uint256 linkAmount, + uint256 ssvAmount + ); + event PoolIncreased( address indexed sender, uint32 poolId, uint256 amount ); event PoolStaked(uint32 indexed poolId); event PoolExitRequested(uint32 indexed poolId); - event PoolExitCompleted(uint32 indexed poolId); + event PoolExited(uint32 indexed poolId); event ValidatorAdded(bytes indexed publicKey); + event UserWithdrawalRequested( + address indexed sender, + uint256 amount + ); + event UserWithdrawalInitiated( + address indexed sender, + uint256 amount + ); event UserWithdrawed( address indexed sender, uint256 amount @@ -79,11 +93,11 @@ interface ICasimirManager { function withdraw(uint256 amount) external; - function stakePool(uint32 poolId) external; + function stake(uint32 poolId) external; - function requestPoolExit(uint32 poolId) external; + function requestExit(uint32 poolId) external; - function completePoolExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) external; + function completeExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) external; function addValidator( bytes32 depositDataRoot, From b5fdfa93143e1da9cd2a4fa168c18c4999aa6c8f Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Sat, 22 Apr 2023 14:08:26 -0400 Subject: [PATCH 11/78] Add safe requires to automation methods --- contracts/ethereum/docs/index.md | 146 +- contracts/ethereum/hardhat.config.ts | 1 - contracts/ethereum/package.json | 2 - contracts/ethereum/src/CasimirAutomation.sol | 2 +- contracts/ethereum/src/CasimirManager.sol | 223 +- .../src/interfaces/ICasimirManager.sol | 2 +- .../ethereum/src/mock/MockFunctionsOracle.sol | 31 + .../ethereum/src/mock/MockKeeperRegistry.sol | 2 +- package-lock.json | 34732 +++++++--------- 9 files changed, 15051 insertions(+), 20090 deletions(-) create mode 100644 contracts/ethereum/src/mock/MockFunctionsOracle.sol diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 5601c82a8..ffe6040b2 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -169,7 +169,7 @@ _Used for mocking sweeps from Beacon to the manager_ ### reward ```solidity -function reward(uint256 amount) public +function reward(uint256 amount) external ``` _Distribute ETH rewards_ @@ -194,21 +194,51 @@ Deposit user stake to the pool manager function withdraw(uint256 amount) external ``` -Withdraw user stake from the pool manager +Withdraw user stake + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| amount | uint256 | The amount of ETH to withdraw | + +### inititateWithdrawal + +```solidity +function inititateWithdrawal(address user, uint256 amount) external +``` + +Initiate withdrawal of user stake from exited deposits + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| user | address | The user address | +| amount | uint256 | The amount of ETH to withdraw | + +### completeWithdrawal + +```solidity +function completeWithdrawal(address user, uint256 amount) external +``` + +Withdraw user stake from exited deposits #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | +| user | address | The user address | | amount | uint256 | The amount of ETH to withdraw | -### stakePool +### stake ```solidity -function stakePool(uint32 poolId) public +function stake(uint32 poolId) external ``` -_Stake a pool validator and register with SSV_ +Stake a pool validator and register with SSV #### Parameters @@ -216,13 +246,13 @@ _Stake a pool validator and register with SSV_ | ---- | ---- | ----------- | | poolId | uint32 | The pool ID | -### requestPoolExit +### requestExit ```solidity -function requestPoolExit(uint32 poolId) public +function requestExit(uint32 poolId) external ``` -_Request a pool exit_ +Request a pool exit #### Parameters @@ -230,13 +260,13 @@ _Request a pool exit_ | ---- | ---- | ----------- | | poolId | uint32 | The staked pool ID | -### completePoolExit +### completeExit ```solidity -function completePoolExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) public +function completeExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) external ``` -_Complete a pool exit_ +Complete a pool exit #### Parameters @@ -249,10 +279,10 @@ _Complete a pool exit_ ### addValidator ```solidity -function addValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) public +function addValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external ``` -_Add a validator to the pool manager_ +Add a validator to the pool manager #### Parameters @@ -266,10 +296,38 @@ _Add a validator to the pool manager_ | signature | bytes | The signature | | withdrawalCredentials | bytes | The withdrawal credentials | +### setLINKFee + +```solidity +function setLINKFee(uint32 newFee) public +``` + +_Update link fee_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| newFee | uint32 | The new fee | + +### setSSVFee + +```solidity +function setSSVFee(uint32 newFee) public +``` + +_Update ssv fee_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| newFee | uint32 | The new fee | + ### getFees ```solidity -function getFees() public view returns (struct ICasimirManager.Fees) +function getFees() public view returns (struct ICasimirManager.Fees fees) ``` Get the current token fees as percentages @@ -278,7 +336,7 @@ Get the current token fees as percentages | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | struct ICasimirManager.Fees | The current token fees as percentages | +| fees | struct ICasimirManager.Fees | The current token fees as percentages | ### getLINKFee @@ -467,7 +525,7 @@ Get the total manager open deposits ### getUserStake ```solidity -function getUserStake(address userAddress) public view returns (uint256) +function getUserStake(address userAddress) public view returns (uint256 userStake) ``` Get the total user stake for a given user address @@ -482,12 +540,12 @@ Get the total user stake for a given user address | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | The total user stake | +| userStake | uint256 | The total user stake | ### getPoolDetails ```solidity -function getPoolDetails(uint32 poolId) external view returns (struct ICasimirManager.PoolDetails) +function getPoolDetails(uint32 poolId) external view returns (struct ICasimirManager.PoolDetails poolDetails) ``` Get the pool details for a given pool ID @@ -502,12 +560,12 @@ Get the pool details for a given pool ID | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | struct ICasimirManager.PoolDetails | The pool details | +| poolDetails | struct ICasimirManager.PoolDetails | The pool details | ### getAutomationAddress ```solidity -function getAutomationAddress() public view returns (address) +function getAutomationAddress() public view returns (address automationAddress) ``` Get the automation address @@ -516,12 +574,12 @@ Get the automation address | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | address | The automation address | +| automationAddress | address | The automation address | ### getPoRAddress ```solidity -function getPoRAddress() public view returns (address) +function getPoRAddress() public view returns (address porAddress) ``` Get the PoR address @@ -530,7 +588,7 @@ Get the PoR address | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | address | The PoR address | +| porAddress | address | The PoR address | ## CasimirPoR @@ -721,16 +779,22 @@ struct Validator { } ``` -### ManagerDistribution +### RewardDistributed ```solidity -event ManagerDistribution(address sender, uint256 ethAmount, uint256 linkAmount, uint256 ssvAmount) +event RewardDistributed(address sender, uint256 ethAmount, uint256 linkAmount, uint256 ssvAmount) ``` -### PoolDeposit +### UserDeposited ```solidity -event PoolDeposit(address sender, uint32 poolId, uint256 amount) +event UserDeposited(address sender, uint256 ethAmount, uint256 linkAmount, uint256 ssvAmount) +``` + +### PoolIncreased + +```solidity +event PoolIncreased(address sender, uint32 poolId, uint256 amount) ``` ### PoolStaked @@ -745,10 +809,10 @@ event PoolStaked(uint32 poolId) event PoolExitRequested(uint32 poolId) ``` -### PoolExitCompleted +### PoolExited ```solidity -event PoolExitCompleted(uint32 poolId) +event PoolExited(uint32 poolId) ``` ### ValidatorAdded @@ -757,6 +821,18 @@ event PoolExitCompleted(uint32 poolId) event ValidatorAdded(bytes publicKey) ``` +### UserWithdrawalRequested + +```solidity +event UserWithdrawalRequested(address sender, uint256 amount) +``` + +### UserWithdrawalInitiated + +```solidity +event UserWithdrawalInitiated(address sender, uint256 amount) +``` + ### UserWithdrawed ```solidity @@ -781,22 +857,22 @@ function reward(uint256 amount) external function withdraw(uint256 amount) external ``` -### stakePool +### stake ```solidity -function stakePool(uint32 poolId) external +function stake(uint32 poolId) external ``` -### requestPoolExit +### requestExit ```solidity -function requestPoolExit(uint32 poolId) external +function requestExit(uint32 poolId) external ``` -### completePoolExit +### completeExit ```solidity -function completePoolExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) external +function completeExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) external ``` ### addValidator diff --git a/contracts/ethereum/hardhat.config.ts b/contracts/ethereum/hardhat.config.ts index 3165151e9..36fb06064 100644 --- a/contracts/ethereum/hardhat.config.ts +++ b/contracts/ethereum/hardhat.config.ts @@ -2,7 +2,6 @@ import localtunnel from 'localtunnel' import os from 'os' import { HardhatUserConfig } from 'hardhat/config' import '@typechain/hardhat' -import '@nomiclabs/hardhat-waffle' import '@nomiclabs/hardhat-ethers' import 'solidity-docgen' import '@openzeppelin/hardhat-upgrades' diff --git a/contracts/ethereum/package.json b/contracts/ethereum/package.json index 9dcb3299e..4f4207eda 100644 --- a/contracts/ethereum/package.json +++ b/contracts/ethereum/package.json @@ -19,9 +19,7 @@ }, "devDependencies": { "@nomicfoundation/hardhat-network-helpers": "^1.0.6", - "@nomicfoundation/hardhat-toolbox": "^2.0.0", "@nomiclabs/hardhat-ethers": "^2.0.6", - "@nomiclabs/hardhat-waffle": "^2.0.3", "@openzeppelin/hardhat-upgrades": "^1.21.0", "@typechain/ethers-v5": "^10.1.0", "@typechain/hardhat": "^6.1.2", diff --git a/contracts/ethereum/src/CasimirAutomation.sol b/contracts/ethereum/src/CasimirAutomation.sol index 6b49ea937..2cb9a916c 100644 --- a/contracts/ethereum/src/CasimirAutomation.sol +++ b/contracts/ethereum/src/CasimirAutomation.sol @@ -104,7 +104,7 @@ contract CasimirAutomation is ICasimirAutomation, Ownable { /** Stake ready pools */ for (uint256 i = 0; i < readyPoolIds.length; i++) { - casimirManager.stake(readyPoolIds[i]); + casimirManager.stakePool(readyPoolIds[i]); } /** Compound rewards */ diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index ab3b14cdd..80e7ed20b 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -306,8 +306,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function withdrawInstantly(address user, uint256 amount) private { /** Update user account state */ - users[msg.sender].distributionSum0 = distributionSum; - users[msg.sender].stake0 -= amount; + users[user].distributionSum0 = distributionSum; + users[user].stake0 -= amount; /** Update balance state */ Pool storage pool = pools[openPoolIds[0]]; @@ -379,12 +379,16 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Stake a pool validator and register with SSV + * @notice Stake a pool * @param poolId The pool ID */ - function stake(uint32 poolId) external { - require(msg.sender == getAutomationAddress(), "Only automation contract can stake pools"); + function stakePool(uint32 poolId) external { + require( + msg.sender == getAutomationAddress(), + "Only automation contract can stake pools" + ); require(readyValidatorPublicKeys.length > 0, "No ready validators"); + require(readyPoolIds[0] == poolId, "Pool is not the next ready for stake"); /** Get next ready validator */ bytes memory validatorPublicKey = readyValidatorPublicKeys[0]; @@ -425,6 +429,99 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { emit PoolStaked(poolId); } + /** + * @notice Request a pool exit + * @param poolId The staked pool ID + */ + function requestExit(uint32 poolId) external { + require( + msg.sender == getAutomationAddress(), + "Only automation can request pool exits" + ); + + Pool storage pool = pools[poolId]; + + require(!pool.exiting, "Pool is already exiting"); + + pool.exiting = true; + + /** Record validator as exiting for automation */ + exitingValidatorPublicKeys.push(pool.validatorPublicKey); + + emit PoolExitRequested(poolId); + } + + /** + * @notice Complete a pool exit + * @param poolStakedIndex The pool's staked index + * @param validatorStakedIndex The validator's staked index + * @param validatorExitingIndex The validator's exiting index + */ + function completeExit(uint256 poolStakedIndex, uint256 validatorStakedIndex, uint256 validatorExitingIndex) external { + require( + msg.sender == getAutomationAddress(), + "Only automation can complete pool exits" + ); + + uint32 poolId = stakedPoolIds[poolStakedIndex]; + Pool storage pool = pools[poolId]; + + require(pool.exiting, "Pool is not exiting"); + + bytes memory validatorPublicKey = pool.validatorPublicKey; + bytes memory stakedValidatorPublicKey = stakedValidatorPublicKeys[validatorStakedIndex]; + bytes memory exitingValidatorPublicKey = exitingValidatorPublicKeys[validatorExitingIndex]; + + require(keccak256(validatorPublicKey) == keccak256(stakedValidatorPublicKey) && keccak256(validatorPublicKey) == keccak256(exitingValidatorPublicKey), "Pool validator does not match staked and exiting validator"); + + /** Remove pool from staked pools and delete */ + stakedPoolIds.remove(poolStakedIndex); + delete pools[poolId]; + + /** Remove validator from staked and exiting states and delete */ + stakedValidatorPublicKeys.remove(validatorStakedIndex); + exitingValidatorPublicKeys.remove(validatorExitingIndex); + delete validators[validatorPublicKey]; + + /** Remove validator from SSV */ + ssvNetwork.removeValidator(validatorPublicKey); + + emit PoolExited(poolId); + } + + /** + * @notice Add a validator to the pool manager + * @param depositDataRoot The deposit data root + * @param publicKey The validator public key + * @param operatorIds The operator IDs + * @param sharesEncrypted The encrypted shares + * @param sharesPublicKeys The public keys of the shares + * @param signature The signature + * @param withdrawalCredentials The withdrawal credentials + */ + function addValidator( + bytes32 depositDataRoot, + bytes calldata publicKey, + uint32[] memory operatorIds, + bytes[] memory sharesEncrypted, + bytes[] memory sharesPublicKeys, + bytes calldata signature, + bytes calldata withdrawalCredentials + ) external onlyOwner { + /** Create validator and add to ready state */ + validators[publicKey] = Validator( + depositDataRoot, + operatorIds, + sharesEncrypted, + sharesPublicKeys, + signature, + withdrawalCredentials + ); + readyValidatorPublicKeys.push(publicKey); + + emit ValidatorAdded(publicKey); + } + /** * @dev Process fees from a deposit * @param depositAmount The amount of ETH to deposit @@ -524,90 +621,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } } - /** - * @notice Request a pool exit - * @param poolId The staked pool ID - */ - function requestExit(uint32 poolId) external { - require(msg.sender == getAutomationAddress(), "Only automation can request pool exits"); - - Pool storage pool = pools[poolId]; - pool.exiting = true; - - /** Record validator as exiting for automation */ - exitingValidatorPublicKeys.push(pool.validatorPublicKey); - - emit PoolExitRequested(poolId); - } - - /** - * @notice Complete a pool exit - * @param poolIndex The staked pool index - * @param stakedValidatorIndex The staked validator index - * @param exitingValidatorIndex The exiting validator index - */ - function completeExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) external { - require(msg.sender == getAutomationAddress(), "Only automation can complete pool exits"); - - uint32 poolId = stakedPoolIds[poolIndex]; - Pool storage pool = pools[poolId]; - - require(pool.exiting, "Pool is not exiting"); - - bytes memory validatorPublicKey = pool.validatorPublicKey; - bytes memory stakedValidatorPublicKey = stakedValidatorPublicKeys[stakedValidatorIndex]; - bytes memory exitingValidatorPublicKey = exitingValidatorPublicKeys[exitingValidatorIndex]; - - require(keccak256(validatorPublicKey) == keccak256(stakedValidatorPublicKey) && keccak256(validatorPublicKey) == keccak256(exitingValidatorPublicKey), "Pool validator does not match staked and exiting validator"); - - /** Remove pool from staked pools and delete */ - stakedPoolIds.remove(poolIndex); - delete pools[poolId]; - - /** Remove validator from staked and exiting states and delete */ - stakedValidatorPublicKeys.remove(stakedValidatorIndex); - exitingValidatorPublicKeys.remove(exitingValidatorIndex); - delete validators[validatorPublicKey]; - - /** Remove validator from SSV */ - ssvNetwork.removeValidator(validatorPublicKey); - - emit PoolExited(poolId); - } - - /** - * @notice Add a validator to the pool manager - * @param depositDataRoot The deposit data root - * @param publicKey The validator public key - * @param operatorIds The operator IDs - * @param sharesEncrypted The encrypted shares - * @param sharesPublicKeys The public keys of the shares - * @param signature The signature - * @param withdrawalCredentials The withdrawal credentials - */ - function addValidator( - bytes32 depositDataRoot, - bytes calldata publicKey, - uint32[] memory operatorIds, - bytes[] memory sharesEncrypted, - bytes[] memory sharesPublicKeys, - bytes calldata signature, - bytes calldata withdrawalCredentials - ) external onlyOwner { - /** Create validator and add to ready state */ - validators[publicKey] = Validator( - depositDataRoot, - operatorIds, - sharesEncrypted, - sharesPublicKeys, - signature, - withdrawalCredentials - ); - readyValidatorPublicKeys.push(publicKey); - - emit ValidatorAdded(publicKey); - } - /** * @dev Update link fee * @param newFee The new fee @@ -698,52 +711,52 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Get the total manager stake - * @return The total manager stake + * @return stake The total manager stake */ - function getStake() public view returns (uint256) { + function getStake() public view returns (uint256 stake) { /** Total manager execution stake */ int256 executionStake = getExecutionStake(); /** Total manager consensus stake */ int256 consensusStake = getExpectedConsensusStake(); - return SafeCast.toUint256(executionStake + consensusStake); + stake = SafeCast.toUint256(executionStake + consensusStake); } /** * @notice Get the total manager execution stake - * @return The total manager execution stake + * @return executionStake The total manager execution stake */ - function getExecutionStake() public view returns (int256) { - return int256(readyPoolIds.length * poolCapacity + openDeposits); + function getExecutionStake() public view returns (int256 executionStake) { + executionStake = int256(readyPoolIds.length * poolCapacity + openDeposits); } /** * @notice Get the total manager execution swept amount - * @return The total manager execution swept amount + * @return executionSwept The total manager execution swept amount */ - function getExecutionSwept() public view returns (int256) { - return int256(address(this).balance) - getExecutionStake(); + function getExecutionSwept() public view returns (int256 executionSwept) { + executionSwept = int256(address(this).balance) - getExecutionStake(); } /** * @notice Get the total manager consensus stake - * @return The latest total manager consensus stake + * @return consensusStake The total manager consensus stake */ - function getConsensusStake() public view returns (int256) { - return casimirPoR.getConsensusStake(); + function getConsensusStake() public view returns (int256 consensusStake) { + consensusStake = casimirPoR.getConsensusStake(); } /** * @notice Get the total manager expected consensus stake * @dev The expected stake will be honored with slashing recovery in place - * @return The the total manager expected consensus stake + * @return expectedConsensusStake The total manager expected consensus stake */ - function getExpectedConsensusStake() public view returns (int256) { + function getExpectedConsensusStake() public view returns (int256 expectedConsensusStake) { - // Todo account for queued withdrawal amount + // Todo account for pending withdrawal amount - return int256(stakedPoolIds.length * poolCapacity); + expectedConsensusStake = int256(stakedPoolIds.length * poolCapacity); } /** diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index 5080aec9e..fd7557542 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -93,7 +93,7 @@ interface ICasimirManager { function withdraw(uint256 amount) external; - function stake(uint32 poolId) external; + function stakePool(uint32 poolId) external; function requestExit(uint32 poolId) external; diff --git a/contracts/ethereum/src/mock/MockFunctionsOracle.sol b/contracts/ethereum/src/mock/MockFunctionsOracle.sol new file mode 100644 index 000000000..a6ebb0f69 --- /dev/null +++ b/contracts/ethereum/src/mock/MockFunctionsOracle.sol @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "../vendor/interfaces/FunctionsOracleInterface.sol"; // Todo implement this interface +import "hardhat/console.sol"; + +/** + * @title MockFunctionsOracle + */ +contract MockFunctionsOracle { + + constructor() { + + } + + /** + * @notice Sends a request (encoded as data) using the provided subscriptionId + * @param subscriptionId A unique subscription ID allocated by billing system, + * a client can make requests from different contracts referencing the same subscription + * @param data Encoded Chainlink Functions request data, use FunctionsClient API to encode a request + * @param gasLimit Gas limit for the fulfillment callback + * @return requestId A unique request identifier (unique per DON) + */ + function sendRequest( + uint64 subscriptionId, + bytes calldata data, + uint32 gasLimit + ) external returns (bytes32) { + + } +} diff --git a/contracts/ethereum/src/mock/MockKeeperRegistry.sol b/contracts/ethereum/src/mock/MockKeeperRegistry.sol index 0a5d8a4df..34e2179e9 100644 --- a/contracts/ethereum/src/mock/MockKeeperRegistry.sol +++ b/contracts/ethereum/src/mock/MockKeeperRegistry.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "../vendor/interfaces/IKeeperRegistry.sol"; +import "../vendor/interfaces/IKeeperRegistry.sol"; // Todo implement this interface import "hardhat/console.sol"; contract MockKeeperRegistry { diff --git a/package-lock.json b/package-lock.json index 2f50f1bf7..7ef4ea0cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -250,9 +250,7 @@ }, "devDependencies": { "@nomicfoundation/hardhat-network-helpers": "^1.0.6", - "@nomicfoundation/hardhat-toolbox": "^2.0.0", "@nomiclabs/hardhat-ethers": "^2.0.6", - "@nomiclabs/hardhat-waffle": "^2.0.3", "@openzeppelin/hardhat-upgrades": "^1.21.0", "@typechain/ethers-v5": "^10.1.0", "@typechain/hardhat": "^6.1.2", @@ -2092,269 +2090,6 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@ensdomains/ens": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", - "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", - "deprecated": "Please use @ensdomains/ens-contracts", - "dev": true, - "peer": true, - "dependencies": { - "bluebird": "^3.5.2", - "eth-ens-namehash": "^2.0.8", - "solc": "^0.4.20", - "testrpc": "0.0.1", - "web3-utils": "^1.0.0-beta.31" - } - }, - "node_modules/@ensdomains/ens/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", - "dev": true, - "peer": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "node_modules/@ensdomains/ens/node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true, - "peer": true - }, - "node_modules/@ensdomains/ens/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "peer": true, - "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/@ensdomains/ens/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "peer": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "dev": true, - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@ensdomains/ens/node_modules/require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/@ensdomains/ens/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@ensdomains/ens/node_modules/solc": { - "version": "0.4.26", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", - "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", - "dev": true, - "peer": true, - "dependencies": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" - }, - "bin": { - "solcjs": "solcjs" - } - }, - "node_modules/@ensdomains/ens/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "peer": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", - "dev": true, - "peer": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true, - "peer": true - }, - "node_modules/@ensdomains/ens/node_modules/yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", - "dev": true, - "peer": true, - "dependencies": { - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.1", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.1" - } - }, - "node_modules/@ensdomains/ens/node_modules/yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", - "dev": true, - "peer": true, - "dependencies": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" - } - }, - "node_modules/@ensdomains/resolver": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", - "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", - "deprecated": "Please use @ensdomains/ens-contracts", - "dev": true, - "peer": true - }, "node_modules/@esbuild-kit/cjs-loader": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@esbuild-kit/cjs-loader/-/cjs-loader-2.4.2.tgz", @@ -2851,8012 +2586,2823 @@ "chai": "^4.3.4" } }, - "node_modules/@ethereum-waffle/chai": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-4.0.10.tgz", - "integrity": "sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw==", - "dev": true, - "peer": true, + "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", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethereum-waffle/provider": "4.0.5", - "debug": "^4.3.4", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=10.0" - }, - "peerDependencies": { - "ethers": "*" + "@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" } }, - "node_modules/@ethereum-waffle/compiler": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/compiler/-/compiler-4.0.3.tgz", - "integrity": "sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw==", - "dev": true, - "peer": true, + "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==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@resolver-engine/imports": "^0.3.3", - "@resolver-engine/imports-fs": "^0.3.3", - "@typechain/ethers-v5": "^10.0.0", - "@types/mkdirp": "^0.5.2", - "@types/node-fetch": "^2.6.1", - "mkdirp": "^0.5.1", - "node-fetch": "^2.6.7" - }, - "engines": { - "node": ">=10.0" - }, - "peerDependencies": { - "ethers": "*", - "solc": "*", - "typechain": "^8.0.0" + "@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" } }, - "node_modules/@ethereum-waffle/compiler/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==", - "dev": true, - "peer": true, + "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==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "@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/@ethereum-waffle/compiler/node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dev": true, - "peer": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true + "node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } - } - }, - "node_modules/@ethereum-waffle/ens": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/ens/-/ens-4.0.3.tgz", - "integrity": "sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10.0" - }, - "peerDependencies": { - "@ensdomains/ens": "^0.4.4", - "@ensdomains/resolver": "^0.2.4", - "ethers": "*" - } - }, - "node_modules/@ethereum-waffle/mock-contract": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4.tgz", - "integrity": "sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10.0" - }, - "peerDependencies": { - "ethers": "*" - } - }, - "node_modules/@ethereum-waffle/provider": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@ethereum-waffle/provider/-/provider-4.0.5.tgz", - "integrity": "sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw==", - "dev": true, - "peer": true, + ], "dependencies": { - "@ethereum-waffle/ens": "4.0.3", - "@ganache/ethereum-options": "0.1.4", - "debug": "^4.3.4", - "ganache": "7.4.3" - }, - "engines": { - "node": ">=10.0" - }, - "peerDependencies": { - "ethers": "*" + "@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" } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/ganache/-/ganache-7.4.3.tgz", - "integrity": "sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA==", - "bundleDependencies": [ - "@trufflesuite/bigint-buffer", - "emittery", - "keccak", - "leveldown", - "secp256k1", - "@types/bn.js", - "@types/lru-cache", - "@types/seedrandom" + "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==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } ], - "dev": true, - "hasShrinkwrap": true, - "peer": true, "dependencies": { - "@trufflesuite/bigint-buffer": "1.1.10", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "5.1.1", - "@types/seedrandom": "3.0.1", - "emittery": "0.10.0", - "keccak": "3.0.2", - "leveldown": "6.1.0", - "secp256k1": "4.0.3" - }, - "bin": { - "ganache": "dist/node/cli.js", - "ganache-cli": "dist/node/cli.js" - }, - "optionalDependencies": { - "bufferutil": "4.0.5", - "utf-8-validate": "5.0.7" + "@ethersproject/bytes": "^5.7.0" } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/@trufflesuite/bigint-buffer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz", - "integrity": "sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw==", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "Apache-2.0", - "peer": true, + "node_modules/@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "node-gyp-build": "4.4.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/@trufflesuite/bigint-buffer/node_modules/node-gyp-build": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", - "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, + "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==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@types/node": "*" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/@types/node": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", - "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/@types/seedrandom": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.1.tgz", - "integrity": "sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/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, + "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==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } ], - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/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, + "node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } ], - "inBundle": true, - "license": "MIT", - "peer": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "@ethersproject/bignumber": "^5.7.0" } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/bufferutil": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", - "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "peer": true, + "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==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "node-gyp-build": "^4.3.0" + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/catering": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.0.tgz", - "integrity": "sha512-M5imwzQn6y+ODBfgi+cfgZv2hIUI6oYU/0f35Mdb1ujGeqeoI5tOnl9Q13DTH7LW+7er+NYq8stNOKZD/Z3U/A==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, + "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==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "queue-tick": "^1.0.0" - }, - "engines": { - "node": ">=6" + "@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" } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/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==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, + "node_modules/@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/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==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/emittery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", - "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/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==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, + "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==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, + "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==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/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, + "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==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ] + }, + "node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } ], - "inBundle": true, - "license": "BSD-3-Clause", - "peer": true - }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, + "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==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } ], - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", - "peer": true, "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10.0.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/leveldown": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-6.1.0.tgz", - "integrity": "sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w==", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", - "peer": true, + "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==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "abstract-leveldown": "^7.2.0", - "napi-macros": "~2.0.0", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=10.12.0" + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/leveldown/node_modules/abstract-leveldown": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", - "integrity": "sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, + "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==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.0.0", - "is-buffer": "^2.0.5", - "level-concat-iterator": "^3.0.0", - "level-supports": "^2.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=10" + "@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", + "bech32": "1.1.4", + "ws": "7.4.6" } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/leveldown/node_modules/level-concat-iterator": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz", - "integrity": "sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, + "node_modules/@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "catering": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/leveldown/node_modules/level-supports": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz", - "integrity": "sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/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==", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/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": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/napi-macros": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/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==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/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, + "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==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } ], - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/queue-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.0.tgz", - "integrity": "sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/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==", - "dev": true, + "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==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } ], - "inBundle": true, - "license": "MIT", - "peer": true + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", - "peer": true, + "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==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" + "@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" } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/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==", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, + "node_modules/@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "safe-buffer": "~5.2.0" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/utf-8-validate": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", - "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "peer": true, + "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==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "node-gyp-build": "^4.3.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@ethereum-waffle/provider/node_modules/ganache/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/@ethereumjs/block": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/block/-/block-3.6.3.tgz", - "integrity": "sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg==", - "dev": true, - "peer": true, + "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==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethereumjs/common": "^2.6.5", - "@ethereumjs/tx": "^3.5.2", - "ethereumjs-util": "^7.1.5", - "merkle-patricia-tree": "^4.2.4" + "@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" } }, - "node_modules/@ethereumjs/block/node_modules/@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", - "dev": true, - "peer": true, + "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==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@ethereumjs/block/node_modules/@ethereumjs/tx": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", - "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", - "dev": true, - "peer": true, + "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==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" } }, - "node_modules/@ethereumjs/block/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, - "peer": true, + "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==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "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" + "@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" } }, - "node_modules/@ethereumjs/block/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "peer": true, + "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==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@ethereumjs/blockchain": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz", - "integrity": "sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw==", - "dev": true, - "peer": true, - "dependencies": { - "@ethereumjs/block": "^3.6.2", - "@ethereumjs/common": "^2.6.4", - "@ethereumjs/ethash": "^1.1.0", - "debug": "^4.3.3", - "ethereumjs-util": "^7.1.5", - "level-mem": "^5.0.1", - "lru-cache": "^5.1.1", - "semaphore-async-await": "^1.5.1" + "node_modules/@heroicons/vue": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@heroicons/vue/-/vue-1.0.6.tgz", + "integrity": "sha512-ng2YcCQrdoQWEFpw+ipFl2rZo8mZ56v0T5+MyfQQvNqfKChwgP6DMloZLW+rl17GEcHkE3H82UTAMKBKZr4+WA==", + "peerDependencies": { + "vue": ">= 3" } }, - "node_modules/@ethereumjs/blockchain/node_modules/@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", - "dev": true, - "peer": true, - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethereumjs/blockchain/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==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, - "peer": 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" + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" } }, - "node_modules/@ethereumjs/blockchain/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "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, - "peer": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, "engines": { - "node": ">=10.0.0" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@ethereumjs/common": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.0.tgz", - "integrity": "sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA==", + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "peer": true, "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.3" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@ethereumjs/common/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==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "peer": 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" + "sprintf-js": "~1.0.2" } }, - "node_modules/@ethereumjs/common/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "peer": true, "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=8" } }, - "node_modules/@ethereumjs/ethash": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz", - "integrity": "sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/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, - "peer": true, "dependencies": { - "@ethereumjs/block": "^3.5.0", - "@types/levelup": "^4.3.0", - "buffer-xor": "^2.0.1", - "ethereumjs-util": "^7.1.1", - "miller-rabin": "^4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@ethereumjs/ethash/node_modules/buffer-xor": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz", - "integrity": "sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "peer": true, "dependencies": { - "safe-buffer": "^5.1.1" + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@ethereumjs/ethash/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==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "peer": 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" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@ethereumjs/ethash/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "peer": true, "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=8" } }, - "node_modules/@ethereumjs/tx": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.4.0.tgz", - "integrity": "sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "peer": true, - "dependencies": { - "@ethereumjs/common": "^2.6.0", - "ethereumjs-util": "^7.1.3" + "engines": { + "node": ">=8" } }, - "node_modules/@ethereumjs/tx/node_modules/ethereum-cryptography": { + "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "peer": 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" + "engines": { + "node": ">=8" } }, - "node_modules/@ethereumjs/tx/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "node_modules/@jest/console": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", + "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", "dev": true, - "peer": true, "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=10.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@ethereumjs/vm": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.6.0.tgz", - "integrity": "sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ==", + "node_modules/@jest/core": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", + "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", "dev": true, - "peer": true, "dependencies": { - "@ethereumjs/block": "^3.6.0", - "@ethereumjs/blockchain": "^5.5.0", - "@ethereumjs/common": "^2.6.0", - "@ethereumjs/tx": "^3.4.0", - "async-eventemitter": "^0.2.4", - "core-js-pure": "^3.0.1", - "debug": "^2.2.0", - "ethereumjs-util": "^7.1.3", - "functional-red-black-tree": "^1.0.1", - "mcl-wasm": "^0.7.1", - "merkle-patricia-tree": "^4.2.2", - "rustbn.js": "~0.2.0" + "@jest/console": "^29.5.0", + "@jest/reporters": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.5.0", + "jest-config": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-resolve-dependencies": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "jest-watcher": "^29.5.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@ethereumjs/vm/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@jest/environment": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", + "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", "dev": true, - "peer": true, "dependencies": { - "ms": "2.0.0" + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@ethereumjs/vm/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==", + "node_modules/@jest/expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", "dev": true, - "peer": 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" + "expect": "^29.5.0", + "jest-snapshot": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@ethereumjs/vm/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "node_modules/@jest/expect-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", + "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", "dev": true, - "peer": true, "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" + "jest-get-type": "^29.4.3" }, "engines": { - "node": ">=10.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@ethereumjs/vm/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/@jest/fake-timers": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", + "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", "dev": true, - "peer": true - }, - "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", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], "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" + "@jest/types": "^29.5.0", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@jest/globals": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", + "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "dev": true, "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" + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/types": "^29.5.0", + "jest-mock": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@jest/reporters": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", + "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "dev": true, "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/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true } - ], - "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" } }, - "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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "node_modules/@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" - } - }, - "node_modules/@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/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" - } - }, - "node_modules/@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" - } - }, - "node_modules/@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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ] - }, - "node_modules/@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "node_modules/@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-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", - "bech32": "1.1.4", - "ws": "7.4.6" - } - }, - "node_modules/@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/strings": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/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" - } - }, - "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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.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==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ganache/ethereum-address": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/ethereum-address/-/ethereum-address-0.1.4.tgz", - "integrity": "sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw==", - "dev": true, - "peer": true, - "dependencies": { - "@ganache/utils": "0.1.4" - } - }, - "node_modules/@ganache/ethereum-options": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/ethereum-options/-/ethereum-options-0.1.4.tgz", - "integrity": "sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw==", - "dev": true, - "peer": true, - "dependencies": { - "@ganache/ethereum-address": "0.1.4", - "@ganache/ethereum-utils": "0.1.4", - "@ganache/options": "0.1.4", - "@ganache/utils": "0.1.4", - "bip39": "3.0.4", - "seedrandom": "3.0.5" - } - }, - "node_modules/@ganache/ethereum-utils": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/ethereum-utils/-/ethereum-utils-0.1.4.tgz", - "integrity": "sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg==", - "dev": true, - "peer": true, - "dependencies": { - "@ethereumjs/common": "2.6.0", - "@ethereumjs/tx": "3.4.0", - "@ethereumjs/vm": "5.6.0", - "@ganache/ethereum-address": "0.1.4", - "@ganache/rlp": "0.1.4", - "@ganache/utils": "0.1.4", - "emittery": "0.10.0", - "ethereumjs-abi": "0.6.8", - "ethereumjs-util": "7.1.3" - } - }, - "node_modules/@ganache/ethereum-utils/node_modules/emittery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", - "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/@ganache/ethereum-utils/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, - "peer": 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/@ganache/ethereum-utils/node_modules/ethereumjs-util": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz", - "integrity": "sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@ganache/options": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/options/-/options-0.1.4.tgz", - "integrity": "sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw==", - "dev": true, - "peer": true, - "dependencies": { - "@ganache/utils": "0.1.4", - "bip39": "3.0.4", - "seedrandom": "3.0.5" - } - }, - "node_modules/@ganache/rlp": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/rlp/-/rlp-0.1.4.tgz", - "integrity": "sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ==", - "dev": true, - "peer": true, - "dependencies": { - "@ganache/utils": "0.1.4", - "rlp": "2.2.6" - } - }, - "node_modules/@ganache/rlp/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "peer": true - }, - "node_modules/@ganache/rlp/node_modules/rlp": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz", - "integrity": "sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg==", - "dev": true, - "peer": true, - "dependencies": { - "bn.js": "^4.11.1" - }, - "bin": { - "rlp": "bin/rlp" - } - }, - "node_modules/@ganache/utils": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@ganache/utils/-/utils-0.1.4.tgz", - "integrity": "sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w==", - "dev": true, - "peer": true, - "dependencies": { - "emittery": "0.10.0", - "keccak": "3.0.1", - "seedrandom": "3.0.5" - }, - "optionalDependencies": { - "@trufflesuite/bigint-buffer": "1.1.9" - } - }, - "node_modules/@ganache/utils/node_modules/emittery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", - "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/@ganache/utils/node_modules/keccak": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz", - "integrity": "sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA==", - "dev": true, - "hasInstallScript": true, - "peer": true, - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@heroicons/vue": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@heroicons/vue/-/vue-1.0.6.tgz", - "integrity": "sha512-ng2YcCQrdoQWEFpw+ipFl2rZo8mZ56v0T5+MyfQQvNqfKChwgP6DMloZLW+rl17GEcHkE3H82UTAMKBKZr4+WA==", - "peerDependencies": { - "vue": ">= 3" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "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, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/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, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.5.0", - "jest-config": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-resolve-dependencies": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "jest-watcher": "^29.5.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "jest-mock": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", - "dev": true, - "dependencies": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.4.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.5.0", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/types": "^29.5.0", - "jest-mock": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "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/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.25.16" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.5.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.4.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "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==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jspm/core": { - "version": "2.0.0-beta.24", - "resolved": "https://registry.npmjs.org/@jspm/core/-/core-2.0.0-beta.24.tgz", - "integrity": "sha512-a4Bo/80Z6CoJNor5ldgs6002utmmbttP4JYd/FJ0Ob2fVdf6O6ha5SORBCqrnDnBvMc1TlrHY7dCfat5+H0a6A==", - "dev": true - }, - "node_modules/@kurkle/color": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", - "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" - }, - "node_modules/@ledgerhq/cryptoassets": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/cryptoassets/-/cryptoassets-9.0.0.tgz", - "integrity": "sha512-/C8NtrjXPR1O5YmhK2+hq1M8e25Qum2+GGv8G/xOpGKp15Vpbdqgnn8KlnDQJl7kB1eBx/ZrNwXcEJBavRyTPw==", - "dependencies": { - "invariant": "2" - } - }, - "node_modules/@ledgerhq/devices": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-8.0.0.tgz", - "integrity": "sha512-gSnRT0KPca+LIpaC6D/WZQjOAlSI5uCvK1dmxXtKhODLAj735rX5Z3SnGnLUavRCHNbUi44FzgvloF5BKTkh7A==", - "dependencies": { - "@ledgerhq/errors": "^6.12.3", - "@ledgerhq/logs": "^6.10.1", - "rxjs": "6", - "semver": "^7.3.5" - } - }, - "node_modules/@ledgerhq/devices/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/@ledgerhq/devices/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@ledgerhq/errors": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.12.3.tgz", - "integrity": "sha512-djiMSgB/7hnK3aLR/c5ZMMivxjcI7o2+y3VKcsZZpydPoVf9+FXqeJPRfOwmJ0JxbQ//LinUfWpIfHew8LkaVw==" - }, - "node_modules/@ledgerhq/hw-app-btc": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-app-btc/-/hw-app-btc-9.1.3.tgz", - "integrity": "sha512-f/eohEQ+Ha8iJ3ix0a42qa8NafeEWQdNhe0Q85xBTwVdzyu2W3kLwVfShqn/ELIy/lZffSNqYQKyHp8EnO4s8w==", - "dependencies": { - "@ledgerhq/hw-transport": "^6.28.0", - "@ledgerhq/logs": "^6.10.1", - "bip32-path": "^0.4.2", - "bitcoinjs-lib": "^5.2.0", - "bs58": "^4.0.1", - "bs58check": "^2.1.2", - "invariant": "^2.2.4", - "ripemd160": "2", - "semver": "^7.3.5", - "sha.js": "2", - "tiny-secp256k1": "1.1.6", - "varuint-bitcoin": "1.1.2" - } - }, - "node_modules/@ledgerhq/hw-app-eth": { - "version": "6.32.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-app-eth/-/hw-app-eth-6.32.0.tgz", - "integrity": "sha512-3s3rKyGKSkfk2unHWZUoZg99qUfRykFwbradVZGV7BcqnC0xoYuQsR15PAF7F6vvWXnnch1KzkrOwjjyiLuung==", - "dependencies": { - "@ethersproject/abi": "^5.5.0", - "@ethersproject/rlp": "^5.5.0", - "@ledgerhq/cryptoassets": "^9.0.0", - "@ledgerhq/errors": "^6.12.3", - "@ledgerhq/hw-transport": "^6.28.1", - "@ledgerhq/hw-transport-mocker": "^6.27.12", - "@ledgerhq/logs": "^6.10.1", - "axios": "^0.26.1", - "bignumber.js": "^9.1.0", - "crypto-js": "^4.1.1" - } - }, - "node_modules/@ledgerhq/hw-app-eth/node_modules/axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", - "dependencies": { - "follow-redirects": "^1.14.8" - } - }, - "node_modules/@ledgerhq/hw-transport": { - "version": "6.28.1", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.28.1.tgz", - "integrity": "sha512-RaZe+abn0zBIz82cE9tp7Y7aZkHWWbEaE2yJpfxT8AhFz3fx+BU0kLYzuRN9fmA7vKueNJ1MTVUCY+Ex9/CHSQ==", - "dependencies": { - "@ledgerhq/devices": "^8.0.0", - "@ledgerhq/errors": "^6.12.3", - "events": "^3.3.0" - } - }, - "node_modules/@ledgerhq/hw-transport-mocker": { - "version": "6.27.12", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-mocker/-/hw-transport-mocker-6.27.12.tgz", - "integrity": "sha512-sJu4gJibdxR2qvsrqhCG474g5KhD5Acnfgtb7jdFrMeHbIEgb+XMeNzBGICPdNByUKW1lLgWN/lV1yJyCcCJ8A==", - "dependencies": { - "@ledgerhq/hw-transport": "^6.28.1", - "@ledgerhq/logs": "^6.10.1" - } - }, - "node_modules/@ledgerhq/hw-transport-webusb": { - "version": "6.27.12", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-webusb/-/hw-transport-webusb-6.27.12.tgz", - "integrity": "sha512-U96UWLZIurD9ifHlm77PAgBbvDCe99DAJk64O2SdR41WRF3WaRq/pjrzCq2UvvammdCd1p7nS4zbhlse0wZplg==", - "dependencies": { - "@ledgerhq/devices": "^8.0.0", - "@ledgerhq/errors": "^6.12.3", - "@ledgerhq/hw-transport": "^6.28.1", - "@ledgerhq/logs": "^6.10.1" - } - }, - "node_modules/@ledgerhq/logs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-6.10.1.tgz", - "integrity": "sha512-z+ILK8Q3y+nfUl43ctCPuR4Y2bIxk/ooCQFwZxhtci1EhAtMDzMAx2W25qx8G1PPL9UUOdnUax19+F0OjXoj4w==" - }, - "node_modules/@metamask/eth-sig-util": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", - "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", - "dev": true, - "dependencies": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^6.2.1", - "ethjs-util": "^0.1.6", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@metamask/safe-event-emitter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz", - "integrity": "sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==" - }, - "node_modules/@noble/ed25519": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.3.tgz", - "integrity": "sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "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/" - } - ] - }, - "node_modules/@noble/secp256k1": { - "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/" - } - ] - }, - "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, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nomicfoundation/ethereumjs-block": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz", - "integrity": "sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-block/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/@nomicfoundation/ethereumjs-blockchain": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz", - "integrity": "sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-ethash": "^2.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "abstract-level": "^1.0.3", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "level": "^8.0.0", - "lru-cache": "^5.1.1", - "memory-level": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-blockchain/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/@nomicfoundation/ethereumjs-common": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz", - "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "crc-32": "^1.2.0" - } - }, - "node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz", - "integrity": "sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-ethash/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/@nomicfoundation/ethereumjs-evm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz", - "integrity": "sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "@types/async-eventemitter": "^0.2.1", - "async-eventemitter": "^0.2.4", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-evm/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/@nomicfoundation/ethereumjs-rlp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz", - "integrity": "sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==", - "dev": true, - "bin": { - "rlp": "bin/rlp" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz", - "integrity": "sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "functional-red-black-tree": "^1.0.1" - } - }, - "node_modules/@nomicfoundation/ethereumjs-statemanager/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/@nomicfoundation/ethereumjs-trie": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz", - "integrity": "sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "ethereum-cryptography": "0.1.3", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-trie/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/@nomicfoundation/ethereumjs-tx": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz", - "integrity": "sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" - } - }, - "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==", - "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/@nomicfoundation/ethereumjs-util": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz", - "integrity": "sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "^4.0.0-beta.2", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" - } - }, - "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==", - "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/@nomicfoundation/ethereumjs-vm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz", - "integrity": "sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-evm": "^1.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "@types/async-eventemitter": "^0.2.1", - "async-eventemitter": "^0.2.4", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "functional-red-black-tree": "^1.0.1", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-vm/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/@nomicfoundation/hardhat-chai-matchers": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz", - "integrity": "sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ==", - "dev": true, - "peer": true, - "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@types/chai-as-promised": "^7.1.3", - "chai-as-promised": "^7.1.1", - "deep-eql": "^4.0.1", - "ordinal": "^1.0.3" - }, - "peerDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.0", - "chai": "^4.2.0", - "ethers": "^5.0.0", - "hardhat": "^2.9.4" - } - }, - "node_modules/@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz", - "integrity": "sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==", - "dev": true, - "dependencies": { - "ethereumjs-util": "^7.1.4" - }, - "peerDependencies": { - "hardhat": "^2.9.5" - } - }, - "node_modules/@nomicfoundation/hardhat-network-helpers/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/@nomicfoundation/hardhat-network-helpers/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@nomicfoundation/hardhat-toolbox": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.2.tgz", - "integrity": "sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg==", - "dev": true, - "peerDependencies": { - "@ethersproject/abi": "^5.4.7", - "@ethersproject/providers": "^5.4.7", - "@nomicfoundation/hardhat-chai-matchers": "^1.0.0", - "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomiclabs/hardhat-ethers": "^2.0.0", - "@nomiclabs/hardhat-etherscan": "^3.0.0", - "@typechain/ethers-v5": "^10.1.0", - "@typechain/hardhat": "^6.1.2", - "@types/chai": "^4.2.0", - "@types/mocha": ">=9.1.0", - "@types/node": ">=12.0.0", - "chai": "^4.2.0", - "ethers": "^5.4.7", - "hardhat": "^2.11.0", - "hardhat-gas-reporter": "^1.0.8", - "solidity-coverage": "^0.8.1", - "ts-node": ">=8.0.0", - "typechain": "^8.1.0", - "typescript": ">=4.5.0" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", - "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", - "dev": true, - "engines": { - "node": ">= 12" - }, - "optionalDependencies": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", - "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", - "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", - "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", - "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", - "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", - "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", - "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", - "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", - "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", - "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomiclabs/hardhat-ethers": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.2.tgz", - "integrity": "sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==", - "dev": true, - "peerDependencies": { - "ethers": "^5.0.0", - "hardhat": "^2.0.0" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz", - "integrity": "sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==", - "dev": true, - "peer": true, - "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@ethersproject/address": "^5.0.2", - "cbor": "^8.1.0", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "lodash": "^4.17.11", - "semver": "^6.3.0", - "table": "^6.8.0", - "undici": "^5.14.0" - }, - "peerDependencies": { - "hardhat": "^2.0.4" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan/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, - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/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, - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/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, - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/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, - "peer": true - }, - "node_modules/@nomiclabs/hardhat-etherscan/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, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan/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, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/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, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@nomiclabs/hardhat-waffle": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.5.tgz", - "integrity": "sha512-U1RH9OQ1mWYQfb+moX5aTgGjpVVlOcpiFI47wwnaGG4kLhcTy90cNiapoqZenxcRAITVbr0/+QSduINL5EsUIQ==", - "dev": true, - "peerDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.0", - "ethereum-waffle": "*", - "ethers": "^5.0.0", - "hardhat": "^2.0.0" - } - }, - "node_modules/@octokit/auth-token": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz", - "integrity": "sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz", - "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==", - "dev": true, - "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/endpoint": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz", - "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/graphql": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz", - "integrity": "sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==", - "dev": true, - "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz", - "integrity": "sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz", - "integrity": "sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=4" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz", - "integrity": "sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.3.1" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/request": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.3.tgz", - "integrity": "sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==", - "dev": true, - "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/request/node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@octokit/rest": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz", - "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==", - "dev": true, - "dependencies": { - "@octokit/core": "^4.1.0", - "@octokit/plugin-paginate-rest": "^6.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/types": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz", - "integrity": "sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^16.0.0" - } - }, - "node_modules/@openzeppelin/contracts": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.2.tgz", - "integrity": "sha512-kEUOgPQszC0fSYWpbh2kT94ltOJwj1qfT2DWo+zVttmGmf97JZ99LspePNaeeaLhCImaHVeBbjaQFZQn7+Zc5g==" - }, - "node_modules/@openzeppelin/contracts-upgradeable": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.2.tgz", - "integrity": "sha512-zIggnBwemUmmt9IS73qxi+tumALxCY4QEs3zLCII78k0Gfse2hAOdAkuAeLUzvWUpneMUfFE5sGHzEUSTvn4Ag==" - }, - "node_modules/@openzeppelin/contracts-v0.7": { - "name": "@openzeppelin/contracts", - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2.tgz", - "integrity": "sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA==" - }, - "node_modules/@openzeppelin/hardhat-upgrades": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.22.1.tgz", - "integrity": "sha512-MdoitCTLl4zwMU8MeE/bCj+7JMWBEvd38XqJkw36PkJrXlbv6FedDVCPoumMAhpmtymm0nTwTYYklYG+L6WiiQ==", - "dev": true, - "dependencies": { - "@openzeppelin/upgrades-core": "^1.20.0", - "chalk": "^4.1.0", - "debug": "^4.1.1", - "proper-lockfile": "^4.1.1" - }, - "bin": { - "migrate-oz-cli-project": "dist/scripts/migrate-oz-cli-project.js" - }, - "peerDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.0", - "@nomiclabs/hardhat-etherscan": "^3.1.0", - "ethers": "^5.0.5", - "hardhat": "^2.0.2" - }, - "peerDependenciesMeta": { - "@nomiclabs/harhdat-etherscan": { - "optional": true - } - } - }, - "node_modules/@openzeppelin/upgrades-core": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.24.1.tgz", - "integrity": "sha512-QhdIQDUykJ3vQauB6CheV7vk4zgn0e1iY+IDg7r1KqpA1m2bqIGjQCpzidW33K4bZc9zdJSPx2/Z6Um5KxCB7A==", - "dev": true, - "dependencies": { - "cbor": "^8.0.0", - "chalk": "^4.1.0", - "compare-versions": "^5.0.0", - "debug": "^4.1.1", - "ethereumjs-util": "^7.0.3", - "proper-lockfile": "^4.1.1", - "solidity-ast": "^0.4.15" - } - }, - "node_modules/@openzeppelin/upgrades-core/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/@openzeppelin/upgrades-core/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@panva/asn1.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", - "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.0.0.tgz", - "integrity": "sha512-ZVPVDi1E8oeXlYqkGRtX0CkzLTwE2zt62bjWaWKaAvI8NZqHzlMvGeSNDpW+JB3+aKanYb4UETJOF1/CxGPemA==", - "dev": true, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@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, - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.1.0.tgz", - "integrity": "sha512-Oe6ntvgsMTE3hDIqy6sajqHF+MnzJrOF06qC2QSiUEybLL7cp6tjoKUa32gpd9+KPVl4QyMs3E3nsXrx/Vdnlw==", - "dev": true, - "dependencies": { - "@pnpm/config.env-replace": "^1.0.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "node_modules/@resolver-engine/core": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz", - "integrity": "sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ==", - "dev": true, - "peer": true, - "dependencies": { - "debug": "^3.1.0", - "is-url": "^1.2.4", - "request": "^2.85.0" - } - }, - "node_modules/@resolver-engine/core/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@resolver-engine/fs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.3.3.tgz", - "integrity": "sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ==", - "dev": true, - "peer": true, - "dependencies": { - "@resolver-engine/core": "^0.3.3", - "debug": "^3.1.0" - } - }, - "node_modules/@resolver-engine/fs/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@resolver-engine/imports": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.3.3.tgz", - "integrity": "sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==", - "dev": true, - "peer": true, - "dependencies": { - "@resolver-engine/core": "^0.3.3", - "debug": "^3.1.0", - "hosted-git-info": "^2.6.0", - "path-browserify": "^1.0.0", - "url": "^0.11.0" - } - }, - "node_modules/@resolver-engine/imports-fs": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz", - "integrity": "sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA==", - "dev": true, - "peer": true, - "dependencies": { - "@resolver-engine/fs": "^0.3.3", - "@resolver-engine/imports": "^0.3.3", - "debug": "^3.1.0" - } - }, - "node_modules/@resolver-engine/imports-fs/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@resolver-engine/imports/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@rollup/plugin-inject": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-4.0.4.tgz", - "integrity": "sha512-4pbcU4J/nS+zuHk+c+OL3WtmEQhqxlZ9uqfjQMQDOHOPld7PsCd8k5LWs8h5wjwJN7MgnAn768F2sDxEP4eNFQ==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "estree-walker": "^2.0.1", - "magic-string": "^0.25.7" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "node_modules/@scure/base": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", - "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "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==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "@noble/hashes": "~1.2.0", - "@noble/secp256k1": "~1.7.0", - "@scure/base": "~1.1.0" - } - }, - "node_modules/@scure/bip39": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", - "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "@noble/hashes": "~1.2.0", - "@scure/base": "~1.1.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true - }, - "node_modules/@sentry/hub": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", - "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", - "dev": true, - "dependencies": { - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "@sentry/core": "5.30.0", - "@sentry/hub": "5.30.0", - "@sentry/tracing": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "engines": { - "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==", - "dev": true, - "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==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@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==", - "dev": true, - "dependencies": { - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true - }, - "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", - "dev": true - }, - "node_modules/@sindresorhus/is": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", - "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0" - } - }, - "node_modules/@solana/buffer-layout": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", - "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", - "dependencies": { - "buffer": "~6.0.3" - }, - "engines": { - "node": ">=5.10" - } - }, - "node_modules/@solana/web3.js": { - "version": "1.73.3", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.73.3.tgz", - "integrity": "sha512-vHRMo589XEIpoujpE2sZZ1aMZvfA1ImKfNxobzEFyMb+H5j6mRRUXfdgWD0qJ0sm11e5BcBC7HPeRXJB+7f3Lg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "@noble/ed25519": "^1.7.0", - "@noble/hashes": "^1.1.2", - "@noble/secp256k1": "^1.6.3", - "@solana/buffer-layout": "^4.0.0", - "agentkeepalive": "^4.2.1", - "bigint-buffer": "^1.1.5", - "bn.js": "^5.0.0", - "borsh": "^0.7.0", - "bs58": "^4.0.1", - "buffer": "6.0.1", - "fast-stable-stringify": "^1.0.0", - "jayson": "^3.4.4", - "node-fetch": "^2.6.7", - "rpc-websockets": "^7.5.1", - "superstruct": "^0.14.2" - } - }, - "node_modules/@solana/web3.js/node_modules/buffer": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz", - "integrity": "sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/@solana/web3.js/node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@solidity-parser/parser": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", - "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", - "dev": true, - "peer": true, - "dependencies": { - "antlr4ts": "^0.5.0-alpha.4" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@trezor/blockchain-link": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.1.8.tgz", - "integrity": "sha512-U42+SMUTyMoxm92wETtpIkrWH2SqkG42qq9F55KHMfu1Lt6rkrxhcDjnvmgcvTjmr9qxGmKe0vPtB/l3qH0aGQ==", - "dependencies": { - "@trezor/utils": "^9.0.6", - "@trezor/utxo-lib": "^1.0.4", - "@types/web": "^0.0.91", - "bignumber.js": "^9.1.1", - "events": "^3.3.0", - "ripple-lib": "^1.10.1", - "socks-proxy-agent": "6.1.1", - "ws": "7.5.9" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/socks-proxy-agent": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", - "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@trezor/blockchain-link/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "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/@trezor/connect": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.0.7.tgz", - "integrity": "sha512-y0QYSlhC2lXeBbVT2Oezpi1GRdvHykCviPOCCkhGemQ4gAmqSDp/aniNbKoR/ZAyiibVTZLo0jvPbHXosM9zjQ==", - "dependencies": { - "@trezor/blockchain-link": "^2.1.8", - "@trezor/connect-common": "0.0.12", - "@trezor/transport": "^1.1.8", - "@trezor/utils": "^9.0.6", - "@trezor/utxo-lib": "^1.0.4", - "bignumber.js": "^9.1.1", - "blakejs": "^1.2.1", - "bowser": "^2.11.0", - "cross-fetch": "^3.1.5", - "events": "^3.3.0", - "parse-uri": "1.0.7", - "randombytes": "2.1.0", - "tslib": "2.5.0" - } - }, - "node_modules/@trezor/connect-common": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.0.12.tgz", - "integrity": "sha512-u7hrcS3eBHzR6b2dYD1PBPYw5vWaKT5eLoEL+ykPv2DeJsq0AgdRTNQom9tTUonyHoxGdnjQuaEO2Y4j2hZeng==" - }, - "node_modules/@trezor/connect-web": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@trezor/connect-web/-/connect-web-9.0.7.tgz", - "integrity": "sha512-SVlA0h9evC12bmuO1ksz7Q3tBLNsw1QhxhkZBrZ6giS8gmC/2NkL1MlzKlVp7TCjnQu5gbP6vDRahUoZZoiUmg==", - "dependencies": { - "@trezor/connect": "9.0.7", - "@trezor/utils": "^9.0.6", - "events": "^3.3.0" - } - }, - "node_modules/@trezor/transport": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.1.8.tgz", - "integrity": "sha512-Q5X0vTaZQu21PqaHL1Dnm6TVSsuK1mweMWRo2PDioDErSDlQrTMt/81gUV+HHZq/ej2m4C6YHx74pTlo2zJkfQ==", - "dependencies": { - "@trezor/utils": "^9.0.6", - "bytebuffer": "^5.0.1", - "json-stable-stringify": "^1.0.2", - "long": "^4.0.0", - "prettier": "2.8.4", - "protobufjs": "^6.11.3" - } - }, - "node_modules/@trezor/utils": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.0.6.tgz", - "integrity": "sha512-ZrZDMa1DzcfptBTdIPd7jLJGd03EVbocCSa92o64Qb6FMGSUh+t8Y+9Yy6rBPN1GTOsJxVQmcj3leKrtJMgwVQ==" - }, - "node_modules/@trezor/utxo-lib": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-1.0.4.tgz", - "integrity": "sha512-n4Xj2YIpqRKaZiDZww0mcY0c2ZN+SDygR3dAJkUb7O/2FykxCS28z3QHIjfbdzMwquywbkxDeiErcdrHw3GIvg==", - "dependencies": { - "@trezor/utils": "^9.0.6", - "bchaddrjs": "^0.5.2", - "bech32": "^2.0.0", - "bip66": "^1.1.5", - "bitcoin-ops": "^1.4.1", - "blake-hash": "^2.0.0", - "blakejs": "^1.2.1", - "bn.js": "^5.2.1", - "bs58": "^5.0.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "int64-buffer": "^1.0.1", - "pushdata-bitcoin": "^1.0.1", - "tiny-secp256k1": "^1.1.6", - "typeforce": "^1.18.0", - "varuint-bitcoin": "^1.1.2", - "wif": "^2.0.6" - } - }, - "node_modules/@trezor/utxo-lib/node_modules/base-x": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", - "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" - }, - "node_modules/@trezor/utxo-lib/node_modules/bech32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" - }, - "node_modules/@trezor/utxo-lib/node_modules/bs58": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", - "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", - "dependencies": { - "base-x": "^4.0.0" - } - }, - "node_modules/@trufflesuite/bigint-buffer": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.9.tgz", - "integrity": "sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "node-gyp-build": "4.3.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@trufflesuite/bigint-buffer/node_modules/node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true - }, - "node_modules/@typechain/ethers-v5": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.0.tgz", - "integrity": "sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" - }, - "peerDependencies": { - "@ethersproject/abi": "^5.0.0", - "@ethersproject/bytes": "^5.0.0", - "@ethersproject/providers": "^5.0.0", - "ethers": "^5.1.3", - "typechain": "^8.1.1", - "typescript": ">=4.3.0" - } - }, - "node_modules/@typechain/hardhat": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.5.tgz", - "integrity": "sha512-lg7LW4qDZpxFMknp3Xool61Fg6Lays8F8TXdFGBG+MxyYcYU5795P1U2XdStuzGq9S2Dzdgh+1jGww9wvZ6r4Q==", - "dev": true, - "dependencies": { - "fs-extra": "^9.1.0" - }, - "peerDependencies": { - "@ethersproject/abi": "^5.4.7", - "@ethersproject/providers": "^5.4.7", - "@typechain/ethers-v5": "^10.2.0", - "ethers": "^5.4.7", - "hardhat": "^2.9.9", - "typechain": "^8.1.1" - } - }, - "node_modules/@typechain/hardhat/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "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/abstract-leveldown": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.1.tgz", - "integrity": "sha512-YK8irIC+eMrrmtGx0H4ISn9GgzLd9dojZWJaMbjp1YHLl2VqqNFBNrL5Q3KjGf4VE3sf/4hmq6EhQZ7kZp1NoQ==", - "dev": true, - "peer": true - }, - "node_modules/@types/async-eventemitter": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", - "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/bn.js": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dependencies": { - "@types/connect": "*", - "@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==", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", - "dev": true - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/concat-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "node_modules/@types/form-data": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", - "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/fs-extra": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.1.tgz", - "integrity": "sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==", - "dev": true, - "dependencies": { - "@types/jsonfile": "*", - "@types/node": "*" - } - }, - "node_modules/@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, - "peer": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.10", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.10.tgz", - "integrity": "sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.4.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.4.2.tgz", - "integrity": "sha512-bbne90W7is+m88ezmZrLiTpp41tIoTdvPC5t3gLoNgu/6qbGdWTC2JWqPWQRJn2Q7rVYTr8aTWqOjhGJDXyvAQ==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/jsonfile": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz", - "integrity": "sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/jsonwebtoken": { - "version": "8.5.9", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", - "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", - "dependencies": { - "@types/node": "*" - } - }, - "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==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/level-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.0.tgz", - "integrity": "sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ==", - "dev": true, - "peer": true - }, - "node_modules/@types/levelup": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz", - "integrity": "sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/abstract-leveldown": "*", - "@types/level-errors": "*", - "@types/node": "*" - } - }, - "node_modules/@types/localtunnel": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/localtunnel/-/localtunnel-2.0.1.tgz", - "integrity": "sha512-0h/ggh+tp9uKHc2eEOLdMgWW0cNwsQfn6iEE1Y44FszNB4BQyL5N6xvd5BnChZksB0YgVqa5MKxJt0dFoOKRxw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, - "node_modules/@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "dev": true - }, - "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" - }, - "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, - "peer": true - }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "node_modules/@types/mkdirp": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", - "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" - }, - "node_modules/@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "node_modules/@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/pg": { - "version": "8.6.6", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.6.tgz", - "integrity": "sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.0" - } - }, - "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 - }, - "node_modules/@types/ps-tree": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/ps-tree/-/ps-tree-1.1.2.tgz", - "integrity": "sha512-ZREFYlpUmPQJ0esjxoG1fMvB2HNaD3z+mjqdSosZvd3RalncI9NEur73P8ZJz4YQdL64CmV1w0RuqoRUlhQRBw==", - "dev": true - }, - "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/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dependencies": { - "@types/node": "*" - } - }, - "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==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, - "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-b2nJ9YyXmkhGaa2b8VLM0kJ04xxwNyijcq12/kDoomCt43qbHBeK2SLNJ9iJmETaAj+bKUT05PQUu3Q66GvLhQ==", - "dev": true, - "dependencies": { - "source-map": "^0.6.0" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "node_modules/@types/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", - "dev": true - }, - "node_modules/@types/strip-json-comments": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "dev": true - }, - "node_modules/@types/web": { - "version": "0.0.91", - "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.91.tgz", - "integrity": "sha512-KIw/1SNDyzPMpN7JiS2TTmiKXUhg4vkV2b8ozgQV0aw82dZr1chPXyunxVbUjSHaDrLxQbD+xpVk+CXiVkakHg==" - }, - "node_modules/@types/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz", - "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", - "dev": true - }, - "node_modules/@types/ws": { - "version": "7.4.7", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", - "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", - "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.55.0.tgz", - "integrity": "sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.55.0", - "@typescript-eslint/type-utils": "5.55.0", - "@typescript-eslint/utils": "5.55.0", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.55.0.tgz", - "integrity": "sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.55.0", - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/typescript-estree": "5.55.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz", - "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/visitor-keys": "5.55.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.55.0.tgz", - "integrity": "sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.55.0", - "@typescript-eslint/utils": "5.55.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz", - "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz", - "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/visitor-keys": "5.55.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.55.0.tgz", - "integrity": "sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.55.0", - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/typescript-estree": "5.55.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz", - "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.55.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@uniswap/lib": { - "version": "4.0.1-alpha", - "resolved": "https://registry.npmjs.org/@uniswap/lib/-/lib-4.0.1-alpha.tgz", - "integrity": "sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/v2-core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@uniswap/v2-core/-/v2-core-1.0.1.tgz", - "integrity": "sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/v3-core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.1.tgz", - "integrity": "sha512-7pVk4hEm00j9tc71Y9+ssYpO6ytkeI0y7WE9P6UcmNzhxPePwyAxImuhVsTqWK9YFvzgtvzJHi64pBl4jUzKMQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/v3-periphery": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.4.3.tgz", - "integrity": "sha512-80c+wtVzl5JJT8UQskxVYYG3oZb4pkhY0zDe0ab/RX4+8f9+W5d8wI4BT0wLB0wFQTSnbW+QdBSpkHA/vRyGBA==", - "dependencies": { - "@openzeppelin/contracts": "3.4.2-solc-0.7", - "@uniswap/lib": "^4.0.1-alpha", - "@uniswap/v2-core": "1.0.1", - "@uniswap/v3-core": "1.0.0", - "base64-sol": "1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/v3-periphery/node_modules/@openzeppelin/contracts": { - "version": "3.4.2-solc-0.7", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", - "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==" - }, - "node_modules/@uniswap/v3-periphery/node_modules/@uniswap/v3-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.0.tgz", - "integrity": "sha512-kSC4djMGKMHj7sLMYVnn61k9nu+lHjMIxgg9CDQT+s2QYLoA56GbSK9Oxr+qJXzzygbkrmuY6cwgP6cW2JXPFA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@vitejs/plugin-vue": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.4.tgz", - "integrity": "sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==", - "dev": true, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "vite": "^2.5.10", - "vue": "^3.2.25" - } - }, - "node_modules/@volar/code-gen": { - "version": "0.34.17", - "resolved": "https://registry.npmjs.org/@volar/code-gen/-/code-gen-0.34.17.tgz", - "integrity": "sha512-rHR7BA71BJ/4S7xUOPMPiB7uk6iU9oTWpEMZxFi5VGC9iJmDncE82WzU5iYpcbOBCVHsOjMh0+5CGMgdO6SaPA==", - "dev": true, - "dependencies": { - "@volar/source-map": "0.34.17" - } - }, - "node_modules/@volar/source-map": { - "version": "0.34.17", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-0.34.17.tgz", - "integrity": "sha512-3yn1IMXJGGWB/G817/VFlFMi8oh5pmE7VzUqvgMZMrppaZpKj6/juvJIEiXNxRsgWc0RxIO8OSp4htdPUg1Raw==", - "dev": true - }, - "node_modules/@volar/vue-code-gen": { - "version": "0.34.17", - "resolved": "https://registry.npmjs.org/@volar/vue-code-gen/-/vue-code-gen-0.34.17.tgz", - "integrity": "sha512-17pzcK29fyFWUc+C82J3JYSnA+jy3QNrIldb9kPaP9Itbik05ZjEIyEue9FjhgIAuHeYSn4LDM5s6nGjxyfhsQ==", - "dev": true, - "dependencies": { - "@volar/code-gen": "0.34.17", - "@volar/source-map": "0.34.17", - "@vue/compiler-core": "^3.2.36", - "@vue/compiler-dom": "^3.2.36", - "@vue/shared": "^3.2.36" - } - }, - "node_modules/@volar/vue-typescript": { - "version": "0.34.17", - "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-0.34.17.tgz", - "integrity": "sha512-U0YSVIBPRWVPmgJHNa4nrfq88+oS+tmyZNxmnfajIw9A/GOGZQiKXHC0k09SVvbYXlsjgJ6NIjhm9NuAhGRQjg==", - "dev": true, - "dependencies": { - "@volar/code-gen": "0.34.17", - "@volar/source-map": "0.34.17", - "@volar/vue-code-gen": "0.34.17", - "@vue/compiler-sfc": "^3.2.36", - "@vue/reactivity": "^3.2.36" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", - "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", - "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "source-map": "^0.6.1" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", - "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", - "dependencies": { - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", - "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", - "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/compiler-dom": "3.2.47", - "@vue/compiler-ssr": "3.2.47", - "@vue/reactivity-transform": "3.2.47", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7", - "postcss": "^8.1.10", - "source-map": "^0.6.1" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", - "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", - "dependencies": { - "@vue/compiler-dom": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "node_modules/@vue/devtools-api": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", - "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" - }, - "node_modules/@vue/eslint-config-typescript": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-10.0.0.tgz", - "integrity": "sha512-F94cL8ug3FaYXlCfU5/wiGjk1qeadmoBpRGAOBq+qre3Smdupa59dd6ZJrsfRODpsMPyTG7330juMDsUvpZ3Rw==", - "dev": true, - "dependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0", - "@typescript-eslint/parser": "^5.0.0", - "vue-eslint-parser": "^8.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0", - "eslint-plugin-vue": "^8.0.1" - } - }, - "node_modules/@vue/reactivity": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz", - "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", - "dependencies": { - "@vue/shared": "3.2.47" - } - }, - "node_modules/@vue/reactivity-transform": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", - "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", - "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47", - "estree-walker": "^2.0.2", - "magic-string": "^0.25.7" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz", - "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", - "dependencies": { - "@vue/reactivity": "3.2.47", - "@vue/shared": "3.2.47" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", - "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", - "dependencies": { - "@vue/runtime-core": "3.2.47", - "@vue/shared": "3.2.47", - "csstype": "^2.6.8" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz", - "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", - "dependencies": { - "@vue/compiler-ssr": "3.2.47", - "@vue/shared": "3.2.47" - }, - "peerDependencies": { - "vue": "3.2.47" - } - }, - "node_modules/@vue/shared": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", - "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==" - }, - "node_modules/@walletconnect/browser-utils": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@walletconnect/browser-utils/-/browser-utils-1.8.0.tgz", - "integrity": "sha512-Wcqqx+wjxIo9fv6eBUFHPsW1y/bGWWRboni5dfD8PtOmrihrEpOCmvRJe4rfl7xgJW8Ea9UqKEaq0bIRLHlK4A==", - "dependencies": { - "@walletconnect/safe-json": "1.0.0", - "@walletconnect/types": "^1.8.0", - "@walletconnect/window-getters": "1.0.0", - "@walletconnect/window-metadata": "1.0.0", - "detect-browser": "5.2.0" - } - }, - "node_modules/@walletconnect/client": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@walletconnect/client/-/client-1.8.0.tgz", - "integrity": "sha512-svyBQ14NHx6Cs2j4TpkQaBI/2AF4+LXz64FojTjMtV4VMMhl81jSO1vNeg+yYhQzvjcGH/GpSwixjyCW0xFBOQ==", - "deprecated": "WalletConnect's v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/", - "dependencies": { - "@walletconnect/core": "^1.8.0", - "@walletconnect/iso-crypto": "^1.8.0", - "@walletconnect/types": "^1.8.0", - "@walletconnect/utils": "^1.8.0" - } - }, - "node_modules/@walletconnect/core": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-1.8.0.tgz", - "integrity": "sha512-aFTHvEEbXcZ8XdWBw6rpQDte41Rxwnuk3SgTD8/iKGSRTni50gI9S3YEzMj05jozSiOBxQci4pJDMVhIUMtarw==", - "dependencies": { - "@walletconnect/socket-transport": "^1.8.0", - "@walletconnect/types": "^1.8.0", - "@walletconnect/utils": "^1.8.0" - } - }, - "node_modules/@walletconnect/crypto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@walletconnect/crypto/-/crypto-1.0.3.tgz", - "integrity": "sha512-+2jdORD7XQs76I2Odgr3wwrtyuLUXD/kprNVsjWRhhhdO9Mt6WqVzOPu0/t7OHSmgal8k7SoBQzUc5hu/8zL/g==", - "dependencies": { - "@walletconnect/encoding": "^1.0.2", - "@walletconnect/environment": "^1.0.1", - "@walletconnect/randombytes": "^1.0.3", - "aes-js": "^3.1.2", - "hash.js": "^1.1.7", - "tslib": "1.14.1" - } - }, - "node_modules/@walletconnect/crypto/node_modules/aes-js": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" - }, - "node_modules/@walletconnect/crypto/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@walletconnect/encoding": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@walletconnect/encoding/-/encoding-1.0.2.tgz", - "integrity": "sha512-CrwSBrjqJ7rpGQcTL3kU+Ief+Bcuu9PH6JLOb+wM6NITX1GTxR/MfNwnQfhLKK6xpRAyj2/nM04OOH6wS8Imag==", - "dependencies": { - "is-typedarray": "1.0.0", - "tslib": "1.14.1", - "typedarray-to-buffer": "3.1.5" - } - }, - "node_modules/@walletconnect/encoding/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@walletconnect/environment": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz", - "integrity": "sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==", - "dependencies": { - "tslib": "1.14.1" - } - }, - "node_modules/@walletconnect/environment/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@walletconnect/http-connection": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@walletconnect/http-connection/-/http-connection-1.8.0.tgz", - "integrity": "sha512-IziEr3c53qsMromK7jz0EkbKDHlryRbxXdFR+xaG+S5nfxtUdAfjzlZabvczXdDCgmTij6KbNsZAjBMqCBzACw==", - "dependencies": { - "@walletconnect/types": "^1.8.0", - "@walletconnect/utils": "^1.8.0", - "eventemitter3": "4.0.7", - "xhr2-cookies": "1.1.0" - } - }, - "node_modules/@walletconnect/iso-crypto": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@walletconnect/iso-crypto/-/iso-crypto-1.8.0.tgz", - "integrity": "sha512-pWy19KCyitpfXb70hA73r9FcvklS+FvO9QUIttp3c2mfW8frxgYeRXfxLRCIQTkaYueRKvdqPjbyhPLam508XQ==", - "dependencies": { - "@walletconnect/crypto": "^1.0.2", - "@walletconnect/types": "^1.8.0", - "@walletconnect/utils": "^1.8.0" - } - }, - "node_modules/@walletconnect/jsonrpc-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.2.tgz", - "integrity": "sha512-CZe8tjJX73OWdHjrBHy7HtAapJ2tT0Q3TYhPBhRxi3643lwPIQWC9En45ldY14TZwgSewkbZ0FtGBZK0G7Bbyg==", - "dependencies": { - "keyvaluestorage-interface": "^1.0.0", - "tslib": "1.14.1" - } - }, - "node_modules/@walletconnect/jsonrpc-types/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@walletconnect/jsonrpc-utils": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.6.tgz", - "integrity": "sha512-snp0tfkjPiDLQp/jrBewI+9SM33GPV4+Gjgldod6XQ7rFyQ5FZjnBxUkY4xWH0+arNxzQSi6v5iDXjCjSaorpg==", - "dependencies": { - "@walletconnect/environment": "^1.0.1", - "@walletconnect/jsonrpc-types": "^1.0.2", - "tslib": "1.14.1" - } - }, - "node_modules/@walletconnect/jsonrpc-utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@walletconnect/mobile-registry": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@walletconnect/mobile-registry/-/mobile-registry-1.4.0.tgz", - "integrity": "sha512-ZtKRio4uCZ1JUF7LIdecmZt7FOLnX72RPSY7aUVu7mj7CSfxDwUn6gBuK6WGtH+NZCldBqDl5DenI5fFSvkKYw==", - "deprecated": "Deprecated in favor of dynamic registry available from: https://github.com/walletconnect/walletconnect-registry" - }, - "node_modules/@walletconnect/qrcode-modal": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@walletconnect/qrcode-modal/-/qrcode-modal-1.8.0.tgz", - "integrity": "sha512-BueaFefaAi8mawE45eUtztg3ZFbsAH4DDXh1UNwdUlsvFMjqcYzLUG0xZvDd6z2eOpbgDg2N3bl6gF0KONj1dg==", - "deprecated": "WalletConnect's v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/", - "dependencies": { - "@walletconnect/browser-utils": "^1.8.0", - "@walletconnect/mobile-registry": "^1.4.0", - "@walletconnect/types": "^1.8.0", - "copy-to-clipboard": "^3.3.1", - "preact": "10.4.1", - "qrcode": "1.4.4" - } - }, - "node_modules/@walletconnect/randombytes": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@walletconnect/randombytes/-/randombytes-1.0.3.tgz", - "integrity": "sha512-35lpzxcHFbTN3ABefC9W+uBpNZl1GC4Wpx0ed30gibfO/y9oLdy1NznbV96HARQKSBV9J9M/rrtIvf6a23jfYw==", - "dependencies": { - "@walletconnect/encoding": "^1.0.2", - "@walletconnect/environment": "^1.0.1", - "randombytes": "^2.1.0", - "tslib": "1.14.1" - } - }, - "node_modules/@walletconnect/randombytes/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@walletconnect/safe-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.0.tgz", - "integrity": "sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg==" - }, - "node_modules/@walletconnect/socket-transport": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@walletconnect/socket-transport/-/socket-transport-1.8.0.tgz", - "integrity": "sha512-5DyIyWrzHXTcVp0Vd93zJ5XMW61iDM6bcWT4p8DTRfFsOtW46JquruMhxOLeCOieM4D73kcr3U7WtyR4JUsGuQ==", - "dependencies": { - "@walletconnect/types": "^1.8.0", - "@walletconnect/utils": "^1.8.0", - "ws": "7.5.3" - } - }, - "node_modules/@walletconnect/socket-transport/node_modules/ws": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", - "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/@walletconnect/types": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-1.8.0.tgz", - "integrity": "sha512-Cn+3I0V0vT9ghMuzh1KzZvCkiAxTq+1TR2eSqw5E5AVWfmCtECFkVZBP6uUJZ8YjwLqXheI+rnjqPy7sVM4Fyg==", - "deprecated": "WalletConnect's v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/" - }, - "node_modules/@walletconnect/utils": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-1.8.0.tgz", - "integrity": "sha512-zExzp8Mj1YiAIBfKNm5u622oNw44WOESzo6hj+Q3apSMIb0Jph9X3GDIdbZmvVZsNPxWDL7uodKgZcCInZv2vA==", - "dependencies": { - "@walletconnect/browser-utils": "^1.8.0", - "@walletconnect/encoding": "^1.0.1", - "@walletconnect/jsonrpc-utils": "^1.0.3", - "@walletconnect/types": "^1.8.0", - "bn.js": "4.11.8", - "js-sha3": "0.8.0", - "query-string": "6.13.5" - } - }, - "node_modules/@walletconnect/utils/node_modules/bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "node_modules/@walletconnect/web3-provider": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@walletconnect/web3-provider/-/web3-provider-1.8.0.tgz", - "integrity": "sha512-lqqEO0oRmCehH+c8ZPk3iH7I7YtbzmkWd58/Or2AgWAl869JamzndKCD3sTlNsPRQLxxPpraHQqzur7uclLWvg==", - "deprecated": "WalletConnect's v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/", - "dependencies": { - "@walletconnect/client": "^1.8.0", - "@walletconnect/http-connection": "^1.8.0", - "@walletconnect/qrcode-modal": "^1.8.0", - "@walletconnect/types": "^1.8.0", - "@walletconnect/utils": "^1.8.0", - "web3-provider-engine": "16.0.1" - } - }, - "node_modules/@walletconnect/window-getters": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.0.tgz", - "integrity": "sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA==" - }, - "node_modules/@walletconnect/window-metadata": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz", - "integrity": "sha512-9eFvmJxIKCC3YWOL97SgRkKhlyGXkrHwamfechmqszbypFspaSk+t2jQXAEU7YClHF6Qjw5eYOmy1//zFi9/GA==", - "dependencies": { - "@walletconnect/window-getters": "^1.0.0" - } - }, - "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, - "peer": 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, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/abortcontroller-polyfill": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", - "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" - }, - "node_modules/abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/abstract-leveldown": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz", - "integrity": "sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==", - "dev": true, - "peer": true, - "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/abstract-leveldown/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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" - } - ], - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/abstract-leveldown/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "peer": true, - "dependencies": { - "xtend": "^4.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/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, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "node_modules/acorn-node/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-node/node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "engines": { - "node": ">=0.4.0" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "dev": true, - "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==" - }, - "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==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", - "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", - "dependencies": { - "debug": "^4.1.0", - "depd": "^2.0.0", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.4.2" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/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==", - "dev": true - }, - "node_modules/ansi-align/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-align/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==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-colors": { - "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==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/antlr4ts": { - "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", - "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", - "dev": true, - "peer": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "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==", - "dev": true - }, - "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, - "engines": { - "node": ">=6" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array.prototype.map": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.5.tgz", - "integrity": "sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.reduce": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", - "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "peer": true - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/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/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==" - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", - "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "engines": { - "node": "*" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "dependencies": { - "async": "^2.4.0" - } - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "node_modules/async-mutex": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.2.6.tgz", - "integrity": "sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==", - "dependencies": { - "tslib": "^2.0.0" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "dev": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "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, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "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" }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "engines": { - "node": ">= 0.4" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/aws-cdk": { - "version": "2.69.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.69.0.tgz", - "integrity": "sha512-wsocwG6gFpPq4WZhLc77khuD35qtDuSphV4kquirlPE7wBmXh7XKoC60sRJvz8IHjv5dvqygaoNL4HH2fLonaQ==", + "node_modules/@jest/schemas": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", + "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", "dev": true, - "bin": { - "cdk": "bin/cdk" - }, - "engines": { - "node": ">= 14.15.0" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "node_modules/aws-cdk-lib": { - "version": "2.69.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.69.0.tgz", - "integrity": "sha512-VIwgMMpc8iHCZTmt1PuMdj20f0lTY8SI6Pltx7jvhYxyzvg04Dd0YAryBUuutj/khE3typJwiFzLlL7yoNo5AA==", - "bundleDependencies": [ - "@balena/dockerignore", - "case", - "fs-extra", - "ignore", - "jsonschema", - "minimatch", - "punycode", - "semver", - "yaml" - ], "dependencies": { - "@aws-cdk/asset-awscli-v1": "^2.2.97", - "@aws-cdk/asset-kubectl-v20": "^2.1.1", - "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.77", - "@balena/dockerignore": "^1.0.2", - "case": "1.6.3", - "fs-extra": "^9.1.0", - "ignore": "^5.2.4", - "jsonschema": "^1.4.1", - "minimatch": "^3.1.2", - "punycode": "^2.3.0", - "semver": "^7.3.8", - "yaml": "1.10.2" - }, - "engines": { - "node": ">= 14.15.0" + "@sinclair/typebox": "^0.25.16" }, - "peerDependencies": { - "constructs": "^10.0.0" - } - }, - "node_modules/aws-cdk-lib/node_modules/@balena/dockerignore": { - "version": "1.0.2", - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/aws-cdk-lib/node_modules/at-least-node": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC", "engines": { - "node": ">= 4.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/aws-cdk-lib/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", + "node_modules/@jest/source-map": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", + "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/aws-cdk-lib/node_modules/case": { - "version": "1.6.3", - "inBundle": true, - "license": "(MIT OR GPL-3.0-or-later)", + "@jridgewell/trace-mapping": "^0.3.15", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, "engines": { - "node": ">= 0.8.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/aws-cdk-lib/node_modules/concat-map": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/fs-extra": { - "version": "9.1.0", - "inBundle": true, - "license": "MIT", + "node_modules/@jest/test-result": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", + "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "dev": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@jest/console": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/aws-cdk-lib/node_modules/graceful-fs": { - "version": "4.2.10", - "inBundle": true, - "license": "ISC" - }, - "node_modules/aws-cdk-lib/node_modules/ignore": { - "version": "5.2.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/aws-cdk-lib/node_modules/jsonfile": { - "version": "6.1.0", - "inBundle": true, - "license": "MIT", + "node_modules/@jest/test-sequencer": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", + "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "dev": true, "dependencies": { - "universalify": "^2.0.0" + "@jest/test-result": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "slash": "^3.0.0" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/aws-cdk-lib/node_modules/jsonschema": { - "version": "1.4.1", - "inBundle": true, - "license": "MIT", "engines": { - "node": "*" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/aws-cdk-lib/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", + "node_modules/@jest/transform": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", + "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "dev": true, "dependencies": { - "yallist": "^4.0.0" + "@babel/core": "^7.11.6", + "@jest/types": "^29.5.0", + "@jridgewell/trace-mapping": "^0.3.15", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/aws-cdk-lib/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", + "node_modules/@jest/types": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", + "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "@jest/schemas": "^29.4.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, "engines": { - "node": "*" - } - }, - "node_modules/aws-cdk-lib/node_modules/punycode": { - "version": "2.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/aws-cdk-lib/node_modules/semver": { - "version": "7.3.8", - "inBundle": true, - "license": "ISC", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" }, "engines": { - "node": ">=10" + "node": ">=6.0.0" } }, - "node_modules/aws-cdk-lib/node_modules/universalify": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", + "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==", "engines": { - "node": ">= 10.0.0" + "node": ">=6.0.0" } }, - "node_modules/aws-cdk-lib/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/aws-cdk-lib/node_modules/yaml": { - "version": "1.10.2", - "inBundle": true, - "license": "ISC", + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "engines": { - "node": ">= 6" + "node": ">=6.0.0" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "engines": { - "node": "*" + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + "node_modules/@jspm/core": { + "version": "2.0.0-beta.24", + "resolved": "https://registry.npmjs.org/@jspm/core/-/core-2.0.0-beta.24.tgz", + "integrity": "sha512-a4Bo/80Z6CoJNor5ldgs6002utmmbttP4JYd/FJ0Ob2fVdf6O6ha5SORBCqrnDnBvMc1TlrHY7dCfat5+H0a6A==", + "dev": true }, - "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, + "node_modules/@ledgerhq/cryptoassets": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/cryptoassets/-/cryptoassets-9.0.0.tgz", + "integrity": "sha512-/C8NtrjXPR1O5YmhK2+hq1M8e25Qum2+GGv8G/xOpGKp15Vpbdqgnn8KlnDQJl7kB1eBx/ZrNwXcEJBavRyTPw==", "dependencies": { - "follow-redirects": "^1.14.0" + "invariant": "2" } }, - "node_modules/babel-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", - "dev": true, + "node_modules/@ledgerhq/devices": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-8.0.0.tgz", + "integrity": "sha512-gSnRT0KPca+LIpaC6D/WZQjOAlSI5uCvK1dmxXtKhODLAj735rX5Z3SnGnLUavRCHNbUi44FzgvloF5BKTkh7A==", "dependencies": { - "@jest/transform": "^29.5.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.5.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" + "@ledgerhq/errors": "^6.12.3", + "@ledgerhq/logs": "^6.10.1", + "rxjs": "6", + "semver": "^7.3.5" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, + "node_modules/@ledgerhq/devices/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" + "tslib": "^1.9.0" }, "engines": { - "node": ">=8" + "npm": ">=2.0.0" } }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", - "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", - "dev": true, + "node_modules/@ledgerhq/devices/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@ledgerhq/errors": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.12.3.tgz", + "integrity": "sha512-djiMSgB/7hnK3aLR/c5ZMMivxjcI7o2+y3VKcsZZpydPoVf9+FXqeJPRfOwmJ0JxbQ//LinUfWpIfHew8LkaVw==" + }, + "node_modules/@ledgerhq/hw-app-btc": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-app-btc/-/hw-app-btc-9.1.3.tgz", + "integrity": "sha512-f/eohEQ+Ha8iJ3ix0a42qa8NafeEWQdNhe0Q85xBTwVdzyu2W3kLwVfShqn/ELIy/lZffSNqYQKyHp8EnO4s8w==", "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@ledgerhq/hw-transport": "^6.28.0", + "@ledgerhq/logs": "^6.10.1", + "bip32-path": "^0.4.2", + "bitcoinjs-lib": "^5.2.0", + "bs58": "^4.0.1", + "bs58check": "^2.1.2", + "invariant": "^2.2.4", + "ripemd160": "2", + "semver": "^7.3.5", + "sha.js": "2", + "tiny-secp256k1": "1.1.6", + "varuint-bitcoin": "1.1.2" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "node_modules/@ledgerhq/hw-app-eth": { + "version": "6.32.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-app-eth/-/hw-app-eth-6.32.0.tgz", + "integrity": "sha512-3s3rKyGKSkfk2unHWZUoZg99qUfRykFwbradVZGV7BcqnC0xoYuQsR15PAF7F6vvWXnnch1KzkrOwjjyiLuung==", "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@ethersproject/abi": "^5.5.0", + "@ethersproject/rlp": "^5.5.0", + "@ledgerhq/cryptoassets": "^9.0.0", + "@ledgerhq/errors": "^6.12.3", + "@ledgerhq/hw-transport": "^6.28.1", + "@ledgerhq/hw-transport-mocker": "^6.27.12", + "@ledgerhq/logs": "^6.10.1", + "axios": "^0.26.1", + "bignumber.js": "^9.1.0", + "crypto-js": "^4.1.1" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + "node_modules/@ledgerhq/hw-app-eth/node_modules/axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "dependencies": { + "follow-redirects": "^1.14.8" } }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "node_modules/@ledgerhq/hw-transport": { + "version": "6.28.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.28.1.tgz", + "integrity": "sha512-RaZe+abn0zBIz82cE9tp7Y7aZkHWWbEaE2yJpfxT8AhFz3fx+BU0kLYzuRN9fmA7vKueNJ1MTVUCY+Ex9/CHSQ==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "@ledgerhq/devices": "^8.0.0", + "@ledgerhq/errors": "^6.12.3", + "events": "^3.3.0" + } + }, + "node_modules/@ledgerhq/hw-transport-mocker": { + "version": "6.27.12", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-mocker/-/hw-transport-mocker-6.27.12.tgz", + "integrity": "sha512-sJu4gJibdxR2qvsrqhCG474g5KhD5Acnfgtb7jdFrMeHbIEgb+XMeNzBGICPdNByUKW1lLgWN/lV1yJyCcCJ8A==", + "dependencies": { + "@ledgerhq/hw-transport": "^6.28.1", + "@ledgerhq/logs": "^6.10.1" + } + }, + "node_modules/@ledgerhq/hw-transport-webusb": { + "version": "6.27.12", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-webusb/-/hw-transport-webusb-6.27.12.tgz", + "integrity": "sha512-U96UWLZIurD9ifHlm77PAgBbvDCe99DAJk64O2SdR41WRF3WaRq/pjrzCq2UvvammdCd1p7nS4zbhlse0wZplg==", + "dependencies": { + "@ledgerhq/devices": "^8.0.0", + "@ledgerhq/errors": "^6.12.3", + "@ledgerhq/hw-transport": "^6.28.1", + "@ledgerhq/logs": "^6.10.1" + } + }, + "node_modules/@ledgerhq/logs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-6.10.1.tgz", + "integrity": "sha512-z+ILK8Q3y+nfUl43ctCPuR4Y2bIxk/ooCQFwZxhtci1EhAtMDzMAx2W25qx8G1PPL9UUOdnUax19+F0OjXoj4w==" + }, + "node_modules/@metamask/eth-sig-util": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", + "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", + "dev": true, + "dependencies": { + "ethereumjs-abi": "^0.6.8", + "ethereumjs-util": "^6.2.1", + "ethjs-util": "^0.1.6", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=12.0.0" } }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "node_modules/@metamask/safe-event-emitter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz", + "integrity": "sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==" + }, + "node_modules/@noble/ed25519": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.3.tgz", + "integrity": "sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "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/" + } + ] + }, + "node_modules/@noble/secp256k1": { + "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/" + } + ] + }, + "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, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">= 8" } }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "node_modules/@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, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "engines": { + "node": ">= 8" } }, - "node_modules/babel-preset-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", - "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "node_modules/@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, "dependencies": { - "babel-plugin-jest-hoist": "^29.5.0", - "babel-preset-current-node-syntax": "^1.0.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">= 8" } }, - "node_modules/backoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", - "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", + "node_modules/@nomicfoundation/ethereumjs-block": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz", + "integrity": "sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==", + "dev": true, "dependencies": { - "precond": "0.2" + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">= 0.6" + "node": ">=14" } }, - "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==" - }, - "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==", + "node_modules/@nomicfoundation/ethereumjs-block/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": { - "safe-buffer": "^5.0.1" + "@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/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/base64-sol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/base64-sol/-/base64-sol-1.0.1.tgz", - "integrity": "sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg==" - }, - "node_modules/bchaddrjs": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/bchaddrjs/-/bchaddrjs-0.5.2.tgz", - "integrity": "sha512-OO7gIn3m7ea4FVx4cT8gdlWQR2+++EquhdpWQJH9BQjK63tJJ6ngB3QMZDO6DiBoXiIGUsTPHjlrHVxPGcGxLQ==", + "node_modules/@nomicfoundation/ethereumjs-blockchain": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz", + "integrity": "sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==", + "dev": true, "dependencies": { - "bs58check": "2.1.2", - "buffer": "^6.0.3", - "cashaddrjs": "0.4.4", - "stream-browserify": "^3.0.0" + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-ethash": "^2.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "abstract-level": "^1.0.3", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "level": "^8.0.0", + "lru-cache": "^5.1.1", + "memory-level": "^1.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=14" } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "node_modules/@nomicfoundation/ethereumjs-blockchain/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": { - "tweetnacl": "^0.14.3" + "@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/bcrypt-pbkdf/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "node_modules/big-integer": { - "version": "1.6.36", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", - "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", - "engines": { - "node": ">=0.6" + "node_modules/@nomicfoundation/ethereumjs-common": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz", + "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "crc-32": "^1.2.0" } }, - "node_modules/bigint-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz", - "integrity": "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==", - "hasInstallScript": true, + "node_modules/@nomicfoundation/ethereumjs-ethash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz", + "integrity": "sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==", + "dev": true, "dependencies": { - "bindings": "^1.3.0" + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "abstract-level": "^1.0.3", + "bigint-crypto-utils": "^3.0.23", + "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">= 10.0.0" + "node": ">=14" } }, - "node_modules/bigint-crypto-utils": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz", - "integrity": "sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==", + "node_modules/@nomicfoundation/ethereumjs-ethash/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": { - "bigint-mod-arith": "^3.1.0" - }, - "engines": { - "node": ">=10.4.0" + "@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/bigint-mod-arith": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz", - "integrity": "sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ==", + "node_modules/@nomicfoundation/ethereumjs-evm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz", + "integrity": "sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==", "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, "engines": { - "node": ">=10.4.0" + "node": ">=14" } }, - "node_modules/bignumber.js": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", - "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", - "engines": { - "node": "*" + "node_modules/@nomicfoundation/ethereumjs-evm/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/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/@nomicfoundation/ethereumjs-rlp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz", + "integrity": "sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==", "dev": true, + "bin": { + "rlp": "bin/rlp" + }, "engines": { - "node": ">=8" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dependencies": { - "file-uri-to-path": "1.0.0" + "node": ">=14" } }, - "node_modules/bindings/node_modules/file-uri-to-path": { + "node_modules/@nomicfoundation/ethereumjs-statemanager": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "node_modules/bip174": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bip174/-/bip174-2.1.0.tgz", - "integrity": "sha512-lkc0XyiX9E9KiVAS1ZiOqK1xfiwvf4FXDDdkDq5crcDzOq+xGytY+14qCsqz7kCiy8rpN1CRNfacRhf9G3JNSA==", - "engines": { - "node": ">=8.0.0" + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz", + "integrity": "sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1" } }, - "node_modules/bip32": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", - "integrity": "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==", + "node_modules/@nomicfoundation/ethereumjs-statemanager/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/node": "10.12.18", - "bs58check": "^2.1.1", + "@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", - "tiny-secp256k1": "^1.1.3", - "typeforce": "^1.11.5", - "wif": "^2.0.6" + "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-trie": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz", + "integrity": "sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=14" } }, - "node_modules/bip32-path": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/bip32-path/-/bip32-path-0.4.2.tgz", - "integrity": "sha512-ZBMCELjJfcNMkz5bDuJ1WrYvjlhEF5k6mQ8vUr4N7MbVRsXei7ZOg8VhhwMfNiW68NWmLkgkc6WvTickrLGprQ==" - }, - "node_modules/bip32/node_modules/@types/node": { - "version": "10.12.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", - "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" - }, - "node_modules/bip39": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz", - "integrity": "sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw==", + "node_modules/@nomicfoundation/ethereumjs-trie/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, - "peer": true, "dependencies": { - "@types/node": "11.11.6", - "create-hash": "^1.1.0", - "pbkdf2": "^3.0.9", - "randombytes": "^2.0.1" + "@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/bip39/node_modules/@types/node": { - "version": "11.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", - "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==", + "node_modules/@nomicfoundation/ethereumjs-tx": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz", + "integrity": "sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==", "dev": true, - "peer": true - }, - "node_modules/bip66": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", - "integrity": "sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==", "dependencies": { - "safe-buffer": "^5.0.1" + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" } }, - "node_modules/bitcoin-ops": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz", - "integrity": "sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==" + "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==", + "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/bitcoinjs-lib": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-5.2.0.tgz", - "integrity": "sha512-5DcLxGUDejgNBYcieMIUfjORtUeNWl828VWLHJGVKZCb4zIS1oOySTUr0LGmcqJBQgTBz3bGbRQla4FgrdQEIQ==", + "node_modules/@nomicfoundation/ethereumjs-util": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz", + "integrity": "sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==", + "dev": true, "dependencies": { - "bech32": "^1.1.2", - "bip174": "^2.0.1", - "bip32": "^2.0.4", - "bip66": "^1.1.0", - "bitcoin-ops": "^1.4.0", - "bs58check": "^2.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.3", - "merkle-lib": "^2.0.10", - "pushdata-bitcoin": "^1.0.1", - "randombytes": "^2.0.1", - "tiny-secp256k1": "^1.1.1", - "typeforce": "^1.11.3", - "varuint-bitcoin": "^1.0.4", - "wif": "^2.0.1" + "@nomicfoundation/ethereumjs-rlp": "^4.0.0-beta.2", + "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=8.0.0" + "node": ">=14" } }, - "node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "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==", "dev": true, "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "@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/blake-hash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/blake-hash/-/blake-hash-2.0.0.tgz", - "integrity": "sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w==", - "hasInstallScript": true, + "node_modules/@nomicfoundation/ethereumjs-vm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz", + "integrity": "sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==", + "dev": true, "dependencies": { - "node-addon-api": "^3.0.0", - "node-gyp-build": "^4.2.2", - "readable-stream": "^3.6.0" + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" }, "engines": { - "node": ">= 10" + "node": ">=14" } }, - "node_modules/blake-hash/node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" - }, - "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==" - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "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==" + "node_modules/@nomicfoundation/ethereumjs-vm/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/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "node_modules/@nomicfoundation/hardhat-network-helpers": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz", + "integrity": "sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==", + "dev": true, "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "ethereumjs-util": "^7.1.4" }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "peerDependencies": { + "hardhat": "^2.9.5" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@nomicfoundation/hardhat-network-helpers/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": { - "ms": "2.0.0" + "@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/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/borsh": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", - "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", + "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dev": true, "dependencies": { - "bn.js": "^5.2.0", - "bs58": "^4.0.0", - "text-encoding-utf-8": "^1.0.2" + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" - }, - "node_modules/boxen": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.2.tgz", - "integrity": "sha512-1Z4UJabXUP1/R9rLpoU3O2lEMnG3pPLAs/ZD2lF3t2q7qD5lM8rqbtnvtvm4N0wEyNlE+9yZVTVAGmd1V5jabg==", + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", + "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", "dev": true, - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.0", - "chalk": "^5.0.1", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" + "engines": { + "node": ">= 12" }, + "optionalDependencies": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", + "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10" } }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", + "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">= 10" } }, - "node_modules/boxen/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==", + "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", + "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 10" } }, - "node_modules/boxen/node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", + "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10" } }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", + "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 10" } }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", + "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">= 10" } }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", + "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10" } }, - "node_modules/boxen/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", + "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "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==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node": ">= 10" } }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", + "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" + "node": ">= 10" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "node_modules/browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", + "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" - } - }, - "node_modules/browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "dependencies": { - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "JSONStream": "^1.0.3", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - }, - "bin": { - "browser-pack": "bin/cmd.js" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", - "dependencies": { - "resolve": "^1.17.0" + "node_modules/@nomiclabs/hardhat-ethers": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.2.tgz", + "integrity": "sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==", + "dev": true, + "peerDependencies": { + "ethers": "^5.0.0", + "hardhat": "^2.0.0" } }, - "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==", - "dev": true - }, - "node_modules/browser-tabs-lock": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/browser-tabs-lock/-/browser-tabs-lock-1.2.15.tgz", - "integrity": "sha512-J8K9vdivK0Di+b8SBdE7EZxDr88TnATing7XoLw6+nFkXMQ6sVBh92K3NQvZlZU91AIkFRi0w3sztk5Z+vsswA==", - "hasInstallScript": true, + "node_modules/@nomiclabs/hardhat-etherscan": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz", + "integrity": "sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==", + "dev": true, + "peer": true, "dependencies": { - "lodash": ">=4.17.21" + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^8.1.0", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.11", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.14.0" + }, + "peerDependencies": { + "hardhat": "^2.0.4" } }, - "node_modules/browserify": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", - "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", + "node_modules/@nomiclabs/hardhat-etherscan/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, + "peer": true, "dependencies": { - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^2.0.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.1", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^3.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.2.1", - "JSONStream": "^1.0.3", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.2.3", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "^1.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum-object": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^3.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.12.0", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "browserify": "bin/cmd.js" + "color-convert": "^1.9.0" }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "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==", + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/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, + "peer": true, "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/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, + "peer": true, "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "color-name": "1.1.3" } }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/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, + "peer": true }, - "node_modules/browserify-rsa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", - "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dependencies": { - "bn.js": "^5.0.0", - "randombytes": "^2.0.1" + "node_modules/@nomiclabs/hardhat-etherscan/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, + "peer": true, + "engines": { + "node": ">=0.8.0" } }, - "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "peer": true, "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" } }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dependencies": { - "pako": "~1.0.5" + "node_modules/@nomiclabs/hardhat-etherscan/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, + "peer": true, + "engines": { + "node": ">=4" } }, - "node_modules/browserify/node_modules/buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/browserify/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/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, + "peer": true, "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" + "has-flag": "^3.0.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=4" } }, - "node_modules/browserify/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/browserify/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" - }, - "node_modules/browserify/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/@octokit/auth-token": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz", + "integrity": "sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==", + "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "@octokit/types": "^9.0.0" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/browserify/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/browserify/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/@octokit/core": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz", + "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==", + "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], + "node_modules/@octokit/endpoint": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz", + "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==", + "dev": true, "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - }, - "bin": { - "browserslist": "cli.js" + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">= 14" } }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "node_modules/@octokit/graphql": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz", + "integrity": "sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==", "dev": true, "dependencies": { - "fast-json-stable-stringify": "2.x" + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "node_modules/@octokit/openapi-types": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz", + "integrity": "sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==", + "dev": true + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz", + "integrity": "sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==", + "dev": true, "dependencies": { - "base-x": "^3.0.2" + "@octokit/types": "^9.0.0" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=4" } }, - "node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "peerDependencies": { + "@octokit/core": ">=3" } }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz", + "integrity": "sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==", "dev": true, "dependencies": { - "node-int64": "^0.4.0" + "@octokit/types": "^9.0.0", + "deprecation": "^2.3.1" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" } }, - "node_modules/btoa": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", - "bin": { - "btoa": "bin/btoa.js" + "node_modules/@octokit/request": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.3.tgz", + "integrity": "sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 0.4.0" + "node": ">= 14" } }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/@octokit/request-error": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "dev": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "node_modules/@octokit/request/node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dev": true, "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" + "node_modules/@octokit/rest": { + "version": "19.0.7", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz", + "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==", + "dev": true, + "dependencies": { + "@octokit/core": "^4.1.0", + "@octokit/plugin-paginate-rest": "^6.0.0", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^7.0.0" + }, + "engines": { + "node": ">= 14" + } }, - "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==" + "node_modules/@octokit/types": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz", + "integrity": "sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^16.0.0" + } }, - "node_modules/buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" + "node_modules/@openzeppelin/contracts": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.2.tgz", + "integrity": "sha512-kEUOgPQszC0fSYWpbh2kT94ltOJwj1qfT2DWo+zVttmGmf97JZ99LspePNaeeaLhCImaHVeBbjaQFZQn7+Zc5g==" }, - "node_modules/buffer-writer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", - "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", - "engines": { - "node": ">=4" - } + "node_modules/@openzeppelin/contracts-upgradeable": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.2.tgz", + "integrity": "sha512-zIggnBwemUmmt9IS73qxi+tumALxCY4QEs3zLCII78k0Gfse2hAOdAkuAeLUzvWUpneMUfFE5sGHzEUSTvn4Ag==" }, - "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/@openzeppelin/contracts-v0.7": { + "name": "@openzeppelin/contracts", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2.tgz", + "integrity": "sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA==" }, - "node_modules/bufferutil": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", - "hasInstallScript": true, + "node_modules/@openzeppelin/hardhat-upgrades": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.22.1.tgz", + "integrity": "sha512-MdoitCTLl4zwMU8MeE/bCj+7JMWBEvd38XqJkw36PkJrXlbv6FedDVCPoumMAhpmtymm0nTwTYYklYG+L6WiiQ==", + "dev": true, "dependencies": { - "node-gyp-build": "^4.3.0" + "@openzeppelin/upgrades-core": "^1.20.0", + "chalk": "^4.1.0", + "debug": "^4.1.1", + "proper-lockfile": "^4.1.1" }, - "engines": { - "node": ">=6.14.2" + "bin": { + "migrate-oz-cli-project": "dist/scripts/migrate-oz-cli-project.js" + }, + "peerDependencies": { + "@nomiclabs/hardhat-ethers": "^2.0.0", + "@nomiclabs/hardhat-etherscan": "^3.1.0", + "ethers": "^5.0.5", + "hardhat": "^2.0.2" + }, + "peerDependenciesMeta": { + "@nomiclabs/harhdat-etherscan": { + "optional": true + } } }, - "node_modules/bufio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bufio/-/bufio-1.2.0.tgz", - "integrity": "sha512-UlFk8z/PwdhYQTXSQQagwGAdtRI83gib2n4uy4rQnenxUM2yQi8lBDzF230BNk+3wAoZDxYRoBwVVUPgHa9MCA==", - "engines": { - "node": ">=8.0.0" + "node_modules/@openzeppelin/upgrades-core": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.24.1.tgz", + "integrity": "sha512-QhdIQDUykJ3vQauB6CheV7vk4zgn0e1iY+IDg7r1KqpA1m2bqIGjQCpzidW33K4bZc9zdJSPx2/Z6Um5KxCB7A==", + "dev": true, + "dependencies": { + "cbor": "^8.0.0", + "chalk": "^4.1.0", + "compare-versions": "^5.0.0", + "debug": "^4.1.1", + "ethereumjs-util": "^7.0.3", + "proper-lockfile": "^4.1.1", + "solidity-ast": "^0.4.15" } }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "node_modules/@openzeppelin/upgrades-core/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": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" + "@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/bytebuffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", - "integrity": "sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ==", + "node_modules/@openzeppelin/upgrades-core/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dev": true, "dependencies": { - "long": "~3" + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" }, "engines": { - "node": ">=0.8" + "node": ">=10.0.0" } }, - "node_modules/bytebuffer/node_modules/long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==", + "node_modules/@panva/asn1.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", + "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==", "engines": { - "node": ">=0.6" + "node": ">=10.13.0" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/@pnpm/config.env-replace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.0.0.tgz", + "integrity": "sha512-ZVPVDi1E8oeXlYqkGRtX0CkzLTwE2zt62bjWaWKaAvI8NZqHzlMvGeSNDpW+JB3+aKanYb4UETJOF1/CxGPemA==", + "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=12.22.0" } }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "node_modules/@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, + "dependencies": { + "graceful-fs": "4.2.10" + }, "engines": { - "node": ">=14.16" + "node": ">=12.22.0" } }, - "node_modules/cacheable-request": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.8.tgz", - "integrity": "sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==", + "node_modules/@pnpm/npm-conf": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.1.0.tgz", + "integrity": "sha512-Oe6ntvgsMTE3hDIqy6sajqHF+MnzJrOF06qC2QSiUEybLL7cp6tjoKUa32gpd9+KPVl4QyMs3E3nsXrx/Vdnlw==", "dev": true, "dependencies": { - "@types/http-cache-semantics": "^4.0.1", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.2", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" + "@pnpm/config.env-replace": "^1.0.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" }, "engines": { - "node": ">=14.16" + "node": ">=12" } }, - "node_modules/cached-path-relative": { + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", - "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==" + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@rollup/plugin-inject": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-4.0.4.tgz", + "integrity": "sha512-4pbcU4J/nS+zuHk+c+OL3WtmEQhqxlZ9uqfjQMQDOHOPld7PsCd8k5LWs8h5wjwJN7MgnAn768F2sDxEP4eNFQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "estree-walker": "^2.0.1", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" } }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, "engines": { - "node": ">= 6" + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001466", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001466.tgz", - "integrity": "sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==", + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "node_modules/@scure/base": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", + "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", + "dev": true, "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + "type": "individual", + "url": "https://paulmillr.com/funding/" } ] }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/cashaddrjs": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cashaddrjs/-/cashaddrjs-0.4.4.tgz", - "integrity": "sha512-xZkuWdNOh0uq/mxJIng6vYWfTowZLd9F4GMAlp2DwFHlcCqCm91NtuAc47RuV4L7r4PYcY5p6Cr2OKNb4hnkWA==", + "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==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "big-integer": "1.6.36" + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" } }, - "node_modules/catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", + "node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", "dev": true, - "engines": { - "node": ">=6" + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" } }, - "node_modules/cbor": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", - "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "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==", "dev": true, "dependencies": { - "nofilter": "^3.1.0" + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=12.19" + "node": ">=6" } }, - "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "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==", + "dev": true + }, + "node_modules/@sentry/hub": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "dev": true, "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "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==", + "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==", + "dev": true + }, + "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==", "dev": true, - "peer": true, "dependencies": { - "check-error": "^1.0.2" + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" }, - "peerDependencies": { - "chai": ">= 2.1.2 < 5" + "engines": { + "node": ">=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==", + "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==", + "dev": true + }, + "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==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@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" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=6" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "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==", "dev": true, "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "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==", "dev": true }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "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==", "dev": true, - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/chart.js": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.2.1.tgz", - "integrity": "sha512-6YbpQ0nt3NovAgOzbkSSeeAQu/3za1319dPUQTXn9WcOpywM8rGKxJHrhS8V8xEkAlk8YhEfjbuAPfUyp6jIsw==", "dependencies": { - "@kurkle/color": "^0.3.0" + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "pnpm": "^7.0.0" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "engines": { - "node": "*" + "node": ">=6" } }, - "node_modules/checkpoint-store": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", - "integrity": "sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg==", - "dependencies": { - "functional-red-black-tree": "^1.0.1" - } + "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==", + "dev": true }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "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==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "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" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "engines": { + "node": ">=6" } }, - "node_modules/chokidar/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==", + "node_modules/@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==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">= 6" + "node": ">=6" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "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==", + "dev": true }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "node_modules/@sinclair/typebox": { + "version": "0.25.24", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", + "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", + "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/cids": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", - "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, "dependencies": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0" + } + }, + "node_modules/@solana/buffer-layout": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", + "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", + "dependencies": { + "buffer": "~6.0.3" }, "engines": { - "node": ">=4.0.0", - "npm": ">=3.0.0" + "node": ">=5.10" } }, - "node_modules/cids/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "node_modules/@solana/web3.js": { + "version": "1.73.3", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.73.3.tgz", + "integrity": "sha512-vHRMo589XEIpoujpE2sZZ1aMZvfA1ImKfNxobzEFyMb+H5j6mRRUXfdgWD0qJ0sm11e5BcBC7HPeRXJB+7f3Lg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@noble/ed25519": "^1.7.0", + "@noble/hashes": "^1.1.2", + "@noble/secp256k1": "^1.6.3", + "@solana/buffer-layout": "^4.0.0", + "agentkeepalive": "^4.2.1", + "bigint-buffer": "^1.1.5", + "bn.js": "^5.0.0", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.1", + "fast-stable-stringify": "^1.0.0", + "jayson": "^3.4.4", + "node-fetch": "^2.6.7", + "rpc-websockets": "^7.5.1", + "superstruct": "^0.14.2" + } + }, + "node_modules/@solana/web3.js/node_modules/buffer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz", + "integrity": "sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ==", "funding": [ { "type": "github", @@ -10873,1572 +5419,1709 @@ ], "dependencies": { "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "ieee754": "^1.2.1" } }, - "node_modules/cids/node_modules/multicodec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", - "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/@solana/web3.js/node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", "dependencies": { - "buffer": "^5.6.0", - "varint": "^5.0.0" + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "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==", + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" } }, - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } }, - "node_modules/class-is": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" + "node_modules/@trezor/blockchain-link": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.1.8.tgz", + "integrity": "sha512-U42+SMUTyMoxm92wETtpIkrWH2SqkG42qq9F55KHMfu1Lt6rkrxhcDjnvmgcvTjmr9qxGmKe0vPtB/l3qH0aGQ==", + "dependencies": { + "@trezor/utils": "^9.0.6", + "@trezor/utxo-lib": "^1.0.4", + "@types/web": "^0.0.91", + "bignumber.js": "^9.1.1", + "events": "^3.3.0", + "ripple-lib": "^1.10.1", + "socks-proxy-agent": "6.1.1", + "ws": "7.5.9" + } }, - "node_modules/classic-level": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", - "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", - "dev": true, - "hasInstallScript": true, + "node_modules/@trezor/blockchain-link/node_modules/socks-proxy-agent": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", + "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "~2.0.0", - "node-gyp-build": "^4.3.0" + "agent-base": "^6.0.2", + "debug": "^4.3.1", + "socks": "^2.6.1" }, "engines": { - "node": ">=12" + "node": ">= 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==", - "dev": true, + "node_modules/@trezor/blockchain-link/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "engines": { - "node": ">=6" + "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/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/@trezor/connect": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.0.7.tgz", + "integrity": "sha512-y0QYSlhC2lXeBbVT2Oezpi1GRdvHykCviPOCCkhGemQ4gAmqSDp/aniNbKoR/ZAyiibVTZLo0jvPbHXosM9zjQ==", + "dependencies": { + "@trezor/blockchain-link": "^2.1.8", + "@trezor/connect-common": "0.0.12", + "@trezor/transport": "^1.1.8", + "@trezor/utils": "^9.0.6", + "@trezor/utxo-lib": "^1.0.4", + "bignumber.js": "^9.1.1", + "blakejs": "^1.2.1", + "bowser": "^2.11.0", + "cross-fetch": "^3.1.5", + "events": "^3.3.0", + "parse-uri": "1.0.7", + "randombytes": "2.1.0", + "tslib": "2.5.0" } }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, + "node_modules/@trezor/connect-common": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.0.12.tgz", + "integrity": "sha512-u7hrcS3eBHzR6b2dYD1PBPYw5vWaKT5eLoEL+ykPv2DeJsq0AgdRTNQom9tTUonyHoxGdnjQuaEO2Y4j2hZeng==" + }, + "node_modules/@trezor/connect-web": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@trezor/connect-web/-/connect-web-9.0.7.tgz", + "integrity": "sha512-SVlA0h9evC12bmuO1ksz7Q3tBLNsw1QhxhkZBrZ6giS8gmC/2NkL1MlzKlVp7TCjnQu5gbP6vDRahUoZZoiUmg==", "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" + "@trezor/connect": "9.0.7", + "@trezor/utils": "^9.0.6", + "events": "^3.3.0" } }, - "node_modules/cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/@trezor/transport": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.1.8.tgz", + "integrity": "sha512-Q5X0vTaZQu21PqaHL1Dnm6TVSsuK1mweMWRo2PDioDErSDlQrTMt/81gUV+HHZq/ej2m4C6YHx74pTlo2zJkfQ==", + "dependencies": { + "@trezor/utils": "^9.0.6", + "bytebuffer": "^5.0.1", + "json-stable-stringify": "^1.0.2", + "long": "^4.0.0", + "prettier": "2.8.4", + "protobufjs": "^6.11.3" } }, - "node_modules/cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", - "dev": true, - "peer": true, + "node_modules/@trezor/utils": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.0.6.tgz", + "integrity": "sha512-ZrZDMa1DzcfptBTdIPd7jLJGd03EVbocCSa92o64Qb6FMGSUh+t8Y+9Yy6rBPN1GTOsJxVQmcj3leKrtJMgwVQ==" + }, + "node_modules/@trezor/utxo-lib": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-1.0.4.tgz", + "integrity": "sha512-n4Xj2YIpqRKaZiDZww0mcY0c2ZN+SDygR3dAJkUb7O/2FykxCS28z3QHIjfbdzMwquywbkxDeiErcdrHw3GIvg==", "dependencies": { - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "colors": "^1.1.2" + "@trezor/utils": "^9.0.6", + "bchaddrjs": "^0.5.2", + "bech32": "^2.0.0", + "bip66": "^1.1.5", + "bitcoin-ops": "^1.4.1", + "blake-hash": "^2.0.0", + "blakejs": "^1.2.1", + "bn.js": "^5.2.1", + "bs58": "^5.0.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "int64-buffer": "^1.0.1", + "pushdata-bitcoin": "^1.0.1", + "tiny-secp256k1": "^1.1.6", + "typeforce": "^1.18.0", + "varuint-bitcoin": "^1.1.2", + "wif": "^2.0.6" } }, - "node_modules/cli-table3/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } + "node_modules/@trezor/utxo-lib/node_modules/base-x": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" }, - "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { + "node_modules/@trezor/utxo-lib/node_modules/bech32": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + }, + "node_modules/@trezor/utxo-lib/node_modules/bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "dependencies": { + "base-x": "^4.0.0" } }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/@typechain/ethers-v5": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.0.tgz", + "integrity": "sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w==", "dev": true, - "peer": true, "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@ethersproject/abi": "^5.0.0", + "@ethersproject/bytes": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "ethers": "^5.1.3", + "typechain": "^8.1.1", + "typescript": ">=4.3.0" } }, - "node_modules/cli-table3/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "node_modules/@typechain/hardhat": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.5.tgz", + "integrity": "sha512-lg7LW4qDZpxFMknp3Xool61Fg6Lays8F8TXdFGBG+MxyYcYU5795P1U2XdStuzGq9S2Dzdgh+1jGww9wvZ6r4Q==", "dev": true, - "peer": true, "dependencies": { - "ansi-regex": "^3.0.0" + "fs-extra": "^9.1.0" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@ethersproject/abi": "^5.4.7", + "@ethersproject/providers": "^5.4.7", + "@typechain/ethers-v5": "^10.2.0", + "ethers": "^5.4.7", + "hardhat": "^2.9.9", + "typechain": "^8.1.1" } }, - "node_modules/cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "node_modules/@typechain/hardhat/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "node_modules/cli-width": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz", - "integrity": "sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==", + "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, - "engines": { - "node": ">= 12" + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "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, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, "engines": { - "node": ">=12" + "node": ">= 10.0.0" } }, - "node_modules/cliui/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==", + "node_modules/@types/async-eventemitter": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", + "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", "dev": true }, - "node_modules/cliui/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==", + "node_modules/@types/babel__core": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/cliui/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==", + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "node_modules/@types/babel__traverse": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", + "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", "dev": true, - "engines": { - "node": ">=0.8" + "dependencies": { + "@babel/types": "^7.3.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==", + "node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/node": "*" } }, - "node_modules/clone-response/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==", - "engines": { - "node": ">=4" + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" + "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==", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" } }, - "node_modules/co-body": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", - "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", + "node_modules/@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", "dependencies": { - "inflation": "^2.0.0", - "qs": "^6.5.2", - "raw-body": "^2.3.3", - "type-is": "^1.6.16" + "@types/node": "*" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "node_modules/@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@types/node": "*" } }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, - "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==", - "dev": true, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "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==", - "dev": true - }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true + "node_modules/@types/express-serve-static-core": { + "version": "4.17.33", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", + "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "node_modules/@types/fs-extra": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.1.tgz", + "integrity": "sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==", "dev": true, - "peer": true, - "engines": { - "node": ">=0.1.90" + "dependencies": { + "@types/jsonfile": "*", + "@types/node": "*" } }, - "node_modules/combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==", + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dev": true, "dependencies": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" + "@types/node": "*" } }, - "node_modules/combine-source-map/node_modules/convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==" - }, - "node_modules/combine-source-map/node_modules/lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==" - }, - "node_modules/combine-source-map/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/@types/http-proxy": { + "version": "1.17.10", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.10.tgz", + "integrity": "sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==", + "dev": true, "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" + "@types/node": "*" } }, - "node_modules/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==", + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, - "node_modules/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==", + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/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==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, "dependencies": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" + "@types/istanbul-lib-report": "*" } }, - "node_modules/command-line-usage/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==", + "node_modules/@types/jest": { + "version": "29.4.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.4.2.tgz", + "integrity": "sha512-bbne90W7is+m88ezmZrLiTpp41tIoTdvPC5t3gLoNgu/6qbGdWTC2JWqPWQRJn2Q7rVYTr8aTWqOjhGJDXyvAQ==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/jsonfile": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.1.tgz", + "integrity": "sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "@types/node": "*" } }, - "node_modules/command-line-usage/node_modules/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, - "engines": { - "node": ">=8" + "node_modules/@types/jsonwebtoken": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.9.tgz", + "integrity": "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==", + "dependencies": { + "@types/node": "*" } }, - "node_modules/command-line-usage/node_modules/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, + "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==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "@types/node": "*" } }, - "node_modules/command-line-usage/node_modules/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==", + "node_modules/@types/localtunnel": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/localtunnel/-/localtunnel-2.0.1.tgz", + "integrity": "sha512-0h/ggh+tp9uKHc2eEOLdMgWW0cNwsQfn6iEE1Y44FszNB4BQyL5N6xvd5BnChZksB0YgVqa5MKxJt0dFoOKRxw==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "@types/node": "*" } }, - "node_modules/command-line-usage/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "node_modules/@types/lodash": { + "version": "4.14.191", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", + "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", "dev": true }, - "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, - "engines": { - "node": ">=0.8.0" - } + "node_modules/@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" }, - "node_modules/command-line-usage/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, - "engines": { - "node": ">=4" - } + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true }, - "node_modules/command-line-usage/node_modules/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, + "node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==" + }, + "node_modules/@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "@types/node": "*" } }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "node_modules/@types/pg": { + "version": "8.6.6", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.6.tgz", + "integrity": "sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" } }, - "node_modules/commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", - "dev": true, - "engines": { - "node": ">=14" - } + "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 }, - "node_modules/compare-versions": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.3.tgz", - "integrity": "sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==", + "node_modules/@types/ps-tree": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/ps-tree/-/ps-tree-1.1.2.tgz", + "integrity": "sha512-ZREFYlpUmPQJ0esjxoG1fMvB2HNaD3z+mjqdSosZvd3RalncI9NEur73P8ZJz4YQdL64CmV1w0RuqoRUlhQRBw==", "dev": true }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "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/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "@types/node": "*" } }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "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==", + "dependencies": { + "@types/node": "*" + } }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "node_modules/@types/serve-static": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "@types/mime": "*", + "@types/node": "*" } }, - "node_modules/concat-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/@types/source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-b2nJ9YyXmkhGaa2b8VLM0kJ04xxwNyijcq12/kDoomCt43qbHBeK2SLNJ9iJmETaAj+bKUT05PQUu3Q66GvLhQ==", + "dev": true, + "dependencies": { + "source-map": "^0.6.0" + } }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", + "dev": true + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "node_modules/@types/web": { + "version": "0.0.91", + "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.91.tgz", + "integrity": "sha512-KIw/1SNDyzPMpN7JiS2TTmiKXUhg4vkV2b8ozgQV0aw82dZr1chPXyunxVbUjSHaDrLxQbD+xpVk+CXiVkakHg==" + }, + "node_modules/@types/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz", + "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", + "dev": true + }, + "node_modules/@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", "dependencies": { - "safe-buffer": "~5.1.0" + "@types/node": "*" } }, - "node_modules/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==", + "node_modules/@types/yargs": { + "version": "17.0.22", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", + "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", "dev": true, "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" + "@types/yargs-parser": "*" } }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.55.0.tgz", + "integrity": "sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==", "dev": true, "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.55.0", + "@typescript-eslint/type-utils": "5.55.0", + "@typescript-eslint/utils": "5.55.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/configstore/node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "node_modules/@typescript-eslint/parser": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.55.0.tgz", + "integrity": "sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==", "dev": true, "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" - }, - "node_modules/constructs": { - "version": "10.1.278", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.1.278.tgz", - "integrity": "sha512-F1JfBAglyMTAbtrA74z1tOST9RYSETkMVZcoYCggtPTMNEZsAMnu9qFxA5Z19m75XcAWLSAts8cLNJZH27alTA==", + "@typescript-eslint/scope-manager": "5.55.0", + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/typescript-estree": "5.55.0", + "debug": "^4.3.4" + }, "engines": { - "node": ">= 14.17.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz", + "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==", + "dev": true, "dependencies": { - "safe-buffer": "5.2.1" + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/visitor-keys": "5.55.0" }, "engines": { - "node": ">= 0.6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/content-hash": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", - "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "node_modules/@typescript-eslint/type-utils": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.55.0.tgz", + "integrity": "sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==", + "dev": true, "dependencies": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" + "@typescript-eslint/typescript-estree": "5.55.0", + "@typescript-eslint/utils": "5.55.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/@typescript-eslint/types": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz", + "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==", + "dev": true, "engines": { - "node": ">= 0.6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz", + "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/visitor-keys": "5.55.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, "engines": { - "node": ">= 0.6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" - }, - "node_modules/copy-to-clipboard": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "node_modules/@typescript-eslint/utils": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.55.0.tgz", + "integrity": "sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==", + "dev": true, "dependencies": { - "toggle-selection": "^1.0.6" + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.55.0", + "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/typescript-estree": "5.55.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/core-js-compat": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.1.tgz", - "integrity": "sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.55.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz", + "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==", + "dev": true, "dependencies": { - "browserslist": "^4.21.5" + "@typescript-eslint/types": "5.55.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/core-js-pure": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.29.1.tgz", - "integrity": "sha512-4En6zYVi0i0XlXHVz/bi6l1XDjCqkKRq765NXuX+SnaIatlE96Odt5lMLjdxUiNI1v9OXI5DSLWYPlmTfkTktg==", - "dev": true, - "hasInstallScript": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "node_modules/@uniswap/lib": { + "version": "4.0.1-alpha", + "resolved": "https://registry.npmjs.org/@uniswap/lib/-/lib-4.0.1-alpha.tgz", + "integrity": "sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA==", + "engines": { + "node": ">=10" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "node_modules/@uniswap/v2-core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@uniswap/v2-core/-/v2-core-1.0.1.tgz", + "integrity": "sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q==", + "engines": { + "node": ">=10" + } }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, + "node_modules/@uniswap/v3-core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.1.tgz", + "integrity": "sha512-7pVk4hEm00j9tc71Y9+ssYpO6ytkeI0y7WE9P6UcmNzhxPePwyAxImuhVsTqWK9YFvzgtvzJHi64pBl4jUzKMQ==", "engines": { - "node": ">= 0.10" + "node": ">=10" } }, - "node_modules/cosmiconfig": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.0.tgz", - "integrity": "sha512-0tLZ9URlPGU7JsKq0DQOQ3FoRsYX8xDZ7xMiATQfaiGMz7EHowNkbU9u1coAOmnh9p/1ySpm0RB3JNWRXM5GCg==", - "dev": true, + "node_modules/@uniswap/v3-periphery": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.4.3.tgz", + "integrity": "sha512-80c+wtVzl5JJT8UQskxVYYG3oZb4pkhY0zDe0ab/RX4+8f9+W5d8wI4BT0wLB0wFQTSnbW+QdBSpkHA/vRyGBA==", "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" + "@openzeppelin/contracts": "3.4.2-solc-0.7", + "@uniswap/lib": "^4.0.1-alpha", + "@uniswap/v2-core": "1.0.1", + "@uniswap/v3-core": "1.0.0", + "base64-sol": "1.0.1" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" + "node": ">=10" } }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "bin": { - "crc32": "bin/crc32.njs" - }, + "node_modules/@uniswap/v3-periphery/node_modules/@openzeppelin/contracts": { + "version": "3.4.2-solc-0.7", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", + "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==" + }, + "node_modules/@uniswap/v3-periphery/node_modules/@uniswap/v3-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.0.tgz", + "integrity": "sha512-kSC4djMGKMHj7sLMYVnn61k9nu+lHjMIxgg9CDQT+s2QYLoA56GbSK9Oxr+qJXzzygbkrmuY6cwgP6cW2JXPFA==", "engines": { - "node": ">=0.8" + "node": ">=10" } }, - "node_modules/create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" + "node_modules/@vitejs/plugin-vue": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-2.3.4.tgz", + "integrity": "sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "vite": "^2.5.10", + "vue": "^3.2.25" } }, - "node_modules/create-ecdh/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/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==", + "node_modules/@volar/code-gen": { + "version": "0.34.17", + "resolved": "https://registry.npmjs.org/@volar/code-gen/-/code-gen-0.34.17.tgz", + "integrity": "sha512-rHR7BA71BJ/4S7xUOPMPiB7uk6iU9oTWpEMZxFi5VGC9iJmDncE82WzU5iYpcbOBCVHsOjMh0+5CGMgdO6SaPA==", + "dev": true, "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "@volar/source-map": "0.34.17" } }, - "node_modules/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==", + "node_modules/@volar/source-map": { + "version": "0.34.17", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-0.34.17.tgz", + "integrity": "sha512-3yn1IMXJGGWB/G817/VFlFMi8oh5pmE7VzUqvgMZMrppaZpKj6/juvJIEiXNxRsgWc0RxIO8OSp4htdPUg1Raw==", + "dev": true + }, + "node_modules/@volar/vue-code-gen": { + "version": "0.34.17", + "resolved": "https://registry.npmjs.org/@volar/vue-code-gen/-/vue-code-gen-0.34.17.tgz", + "integrity": "sha512-17pzcK29fyFWUc+C82J3JYSnA+jy3QNrIldb9kPaP9Itbik05ZjEIyEue9FjhgIAuHeYSn4LDM5s6nGjxyfhsQ==", + "dev": true, "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "@volar/code-gen": "0.34.17", + "@volar/source-map": "0.34.17", + "@vue/compiler-core": "^3.2.36", + "@vue/compiler-dom": "^3.2.36", + "@vue/shared": "^3.2.36" } }, - "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==", - "dev": true - }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "node_modules/@volar/vue-typescript": { + "version": "0.34.17", + "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-0.34.17.tgz", + "integrity": "sha512-U0YSVIBPRWVPmgJHNa4nrfq88+oS+tmyZNxmnfajIw9A/GOGZQiKXHC0k09SVvbYXlsjgJ6NIjhm9NuAhGRQjg==", + "dev": true, "dependencies": { - "node-fetch": "2.6.7" + "@volar/code-gen": "0.34.17", + "@volar/source-map": "0.34.17", + "@volar/vue-code-gen": "0.34.17", + "@vue/compiler-sfc": "^3.2.36", + "@vue/reactivity": "^3.2.36" } }, - "node_modules/cross-fetch/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "node_modules/@vue/compiler-core": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", + "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" } }, - "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==", - "dev": true, + "node_modules/@vue/compiler-dom": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", + "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47" } }, - "node_modules/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, - "peer": true, - "engines": { - "node": "*" + "node_modules/@vue/compiler-sfc": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", + "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-ssr": "3.2.47", + "@vue/reactivity-transform": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" } }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "node_modules/@vue/compiler-ssr": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", + "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" + "@vue/compiler-dom": "3.2.47", + "@vue/shared": "3.2.47" } }, - "node_modules/crypto-js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", - "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + "node_modules/@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "node_modules/@vue/eslint-config-typescript": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-10.0.0.tgz", + "integrity": "sha512-F94cL8ug3FaYXlCfU5/wiGjk1qeadmoBpRGAOBq+qre3Smdupa59dd6ZJrsfRODpsMPyTG7330juMDsUvpZ3Rw==", "dev": true, "dependencies": { - "type-fest": "^1.0.1" + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "vue-eslint-parser": "^8.0.0" }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0", + "eslint-plugin-vue": "^8.0.1" } }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/@vue/reactivity": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz", + "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", + "dependencies": { + "@vue/shared": "3.2.47" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" + "node_modules/@vue/reactivity-transform": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", + "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" } }, - "node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "node_modules/@vue/runtime-core": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz", + "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "@vue/reactivity": "3.2.47", + "@vue/shared": "3.2.47" } }, - "node_modules/d3": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.2.tgz", - "integrity": "sha512-WXty7qOGSHb7HR7CfOzwN1Gw04MUOzN8qh9ZUsvwycIMb4DYMpY9xczZ6jUorGtO6bR9BPMPaueIKwiDxu9uiQ==", + "node_modules/@vue/runtime-dom": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", + "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" + "@vue/runtime-core": "3.2.47", + "@vue/shared": "3.2.47", + "csstype": "^2.6.8" } }, - "node_modules/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ==", + "node_modules/@vue/server-renderer": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz", + "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", "dependencies": { - "internmap": "1 - 2" + "@vue/compiler-ssr": "3.2.47", + "@vue/shared": "3.2.47" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "vue": "3.2.47" } }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "engines": { - "node": ">=12" - } + "node_modules/@vue/shared": { + "version": "3.2.47", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", + "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==" }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "node_modules/@walletconnect/browser-utils": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/browser-utils/-/browser-utils-1.8.0.tgz", + "integrity": "sha512-Wcqqx+wjxIo9fv6eBUFHPsW1y/bGWWRboni5dfD8PtOmrihrEpOCmvRJe4rfl7xgJW8Ea9UqKEaq0bIRLHlK4A==", "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" + "@walletconnect/safe-json": "1.0.0", + "@walletconnect/types": "^1.8.0", + "@walletconnect/window-getters": "1.0.0", + "@walletconnect/window-metadata": "1.0.0", + "detect-browser": "5.2.0" } }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "node_modules/@walletconnect/client": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/client/-/client-1.8.0.tgz", + "integrity": "sha512-svyBQ14NHx6Cs2j4TpkQaBI/2AF4+LXz64FojTjMtV4VMMhl81jSO1vNeg+yYhQzvjcGH/GpSwixjyCW0xFBOQ==", + "deprecated": "WalletConnect's v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/", "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" + "@walletconnect/core": "^1.8.0", + "@walletconnect/iso-crypto": "^1.8.0", + "@walletconnect/types": "^1.8.0", + "@walletconnect/utils": "^1.8.0" } }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" + "node_modules/@walletconnect/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/core/-/core-1.8.0.tgz", + "integrity": "sha512-aFTHvEEbXcZ8XdWBw6rpQDte41Rxwnuk3SgTD8/iKGSRTni50gI9S3YEzMj05jozSiOBxQci4pJDMVhIUMtarw==", + "dependencies": { + "@walletconnect/socket-transport": "^1.8.0", + "@walletconnect/types": "^1.8.0", + "@walletconnect/utils": "^1.8.0" } }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "node_modules/@walletconnect/crypto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@walletconnect/crypto/-/crypto-1.0.3.tgz", + "integrity": "sha512-+2jdORD7XQs76I2Odgr3wwrtyuLUXD/kprNVsjWRhhhdO9Mt6WqVzOPu0/t7OHSmgal8k7SoBQzUc5hu/8zL/g==", "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" + "@walletconnect/encoding": "^1.0.2", + "@walletconnect/environment": "^1.0.1", + "@walletconnect/randombytes": "^1.0.3", + "aes-js": "^3.1.2", + "hash.js": "^1.1.7", + "tslib": "1.14.1" } }, - "node_modules/d3-delaunay": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", - "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "node_modules/@walletconnect/crypto/node_modules/aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" + }, + "node_modules/@walletconnect/crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/encoding": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@walletconnect/encoding/-/encoding-1.0.2.tgz", + "integrity": "sha512-CrwSBrjqJ7rpGQcTL3kU+Ief+Bcuu9PH6JLOb+wM6NITX1GTxR/MfNwnQfhLKK6xpRAyj2/nM04OOH6wS8Imag==", "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" + "is-typedarray": "1.0.0", + "tslib": "1.14.1", + "typedarray-to-buffer": "3.1.5" + } + }, + "node_modules/@walletconnect/encoding/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/environment": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@walletconnect/environment/-/environment-1.0.1.tgz", + "integrity": "sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==", + "dependencies": { + "tslib": "1.14.1" } }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "engines": { - "node": ">=12" - } + "node_modules/@walletconnect/environment/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "node_modules/@walletconnect/http-connection": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/http-connection/-/http-connection-1.8.0.tgz", + "integrity": "sha512-IziEr3c53qsMromK7jz0EkbKDHlryRbxXdFR+xaG+S5nfxtUdAfjzlZabvczXdDCgmTij6KbNsZAjBMqCBzACw==", "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" + "@walletconnect/types": "^1.8.0", + "@walletconnect/utils": "^1.8.0", + "eventemitter3": "4.0.7", + "xhr2-cookies": "1.1.0" } }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "node_modules/@walletconnect/iso-crypto": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/iso-crypto/-/iso-crypto-1.8.0.tgz", + "integrity": "sha512-pWy19KCyitpfXb70hA73r9FcvklS+FvO9QUIttp3c2mfW8frxgYeRXfxLRCIQTkaYueRKvdqPjbyhPLam508XQ==", "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" + "@walletconnect/crypto": "^1.0.2", + "@walletconnect/types": "^1.8.0", + "@walletconnect/utils": "^1.8.0" } }, - "node_modules/d3-dsv/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" + "node_modules/@walletconnect/jsonrpc-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.2.tgz", + "integrity": "sha512-CZe8tjJX73OWdHjrBHy7HtAapJ2tT0Q3TYhPBhRxi3643lwPIQWC9En45ldY14TZwgSewkbZ0FtGBZK0G7Bbyg==", + "dependencies": { + "keyvaluestorage-interface": "^1.0.0", + "tslib": "1.14.1" } }, - "node_modules/d3-dsv/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/@walletconnect/jsonrpc-types/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@walletconnect/jsonrpc-utils": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.6.tgz", + "integrity": "sha512-snp0tfkjPiDLQp/jrBewI+9SM33GPV4+Gjgldod6XQ7rFyQ5FZjnBxUkY4xWH0+arNxzQSi6v5iDXjCjSaorpg==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@walletconnect/environment": "^1.0.1", + "@walletconnect/jsonrpc-types": "^1.0.2", + "tslib": "1.14.1" } }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } + "node_modules/@walletconnect/jsonrpc-utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "node_modules/@walletconnect/mobile-registry": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@walletconnect/mobile-registry/-/mobile-registry-1.4.0.tgz", + "integrity": "sha512-ZtKRio4uCZ1JUF7LIdecmZt7FOLnX72RPSY7aUVu7mj7CSfxDwUn6gBuK6WGtH+NZCldBqDl5DenI5fFSvkKYw==", + "deprecated": "Deprecated in favor of dynamic registry available from: https://github.com/walletconnect/walletconnect-registry" + }, + "node_modules/@walletconnect/qrcode-modal": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/qrcode-modal/-/qrcode-modal-1.8.0.tgz", + "integrity": "sha512-BueaFefaAi8mawE45eUtztg3ZFbsAH4DDXh1UNwdUlsvFMjqcYzLUG0xZvDd6z2eOpbgDg2N3bl6gF0KONj1dg==", + "deprecated": "WalletConnect's v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/", "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" + "@walletconnect/browser-utils": "^1.8.0", + "@walletconnect/mobile-registry": "^1.4.0", + "@walletconnect/types": "^1.8.0", + "copy-to-clipboard": "^3.3.1", + "preact": "10.4.1", + "qrcode": "1.4.4" } }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "node_modules/@walletconnect/randombytes": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@walletconnect/randombytes/-/randombytes-1.0.3.tgz", + "integrity": "sha512-35lpzxcHFbTN3ABefC9W+uBpNZl1GC4Wpx0ed30gibfO/y9oLdy1NznbV96HARQKSBV9J9M/rrtIvf6a23jfYw==", "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" + "@walletconnect/encoding": "^1.0.2", + "@walletconnect/environment": "^1.0.1", + "randombytes": "^2.1.0", + "tslib": "1.14.1" } }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "engines": { - "node": ">=12" - } + "node_modules/@walletconnect/randombytes/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "node_modules/@walletconnect/safe-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@walletconnect/safe-json/-/safe-json-1.0.0.tgz", + "integrity": "sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg==" + }, + "node_modules/@walletconnect/socket-transport": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/socket-transport/-/socket-transport-1.8.0.tgz", + "integrity": "sha512-5DyIyWrzHXTcVp0Vd93zJ5XMW61iDM6bcWT4p8DTRfFsOtW46JquruMhxOLeCOieM4D73kcr3U7WtyR4JUsGuQ==", "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" + "@walletconnect/types": "^1.8.0", + "@walletconnect/utils": "^1.8.0", + "ws": "7.5.3" } }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "node_modules/@walletconnect/socket-transport/node_modules/ws": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", + "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" + "node": ">=8.3.0" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "engines": { - "node": ">=12" - } + "node_modules/@walletconnect/types": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-1.8.0.tgz", + "integrity": "sha512-Cn+3I0V0vT9ghMuzh1KzZvCkiAxTq+1TR2eSqw5E5AVWfmCtECFkVZBP6uUJZ8YjwLqXheI+rnjqPy7sVM4Fyg==", + "deprecated": "WalletConnect's v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/" }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "engines": { - "node": ">=12" + "node_modules/@walletconnect/utils": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/utils/-/utils-1.8.0.tgz", + "integrity": "sha512-zExzp8Mj1YiAIBfKNm5u622oNw44WOESzo6hj+Q3apSMIb0Jph9X3GDIdbZmvVZsNPxWDL7uodKgZcCInZv2vA==", + "dependencies": { + "@walletconnect/browser-utils": "^1.8.0", + "@walletconnect/encoding": "^1.0.1", + "@walletconnect/jsonrpc-utils": "^1.0.3", + "@walletconnect/types": "^1.8.0", + "bn.js": "4.11.8", + "js-sha3": "0.8.0", + "query-string": "6.13.5" } }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "engines": { - "node": ">=12" + "node_modules/@walletconnect/utils/node_modules/bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "node_modules/@walletconnect/web3-provider": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@walletconnect/web3-provider/-/web3-provider-1.8.0.tgz", + "integrity": "sha512-lqqEO0oRmCehH+c8ZPk3iH7I7YtbzmkWd58/Or2AgWAl869JamzndKCD3sTlNsPRQLxxPpraHQqzur7uclLWvg==", + "deprecated": "WalletConnect's v1 SDKs are now deprecated. Please upgrade to a v2 SDK. For details see: https://docs.walletconnect.com/", + "dependencies": { + "@walletconnect/client": "^1.8.0", + "@walletconnect/http-connection": "^1.8.0", + "@walletconnect/qrcode-modal": "^1.8.0", + "@walletconnect/types": "^1.8.0", + "@walletconnect/utils": "^1.8.0", + "web3-provider-engine": "16.0.1" } }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "engines": { - "node": ">=12" - } + "node_modules/@walletconnect/window-getters": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@walletconnect/window-getters/-/window-getters-1.0.0.tgz", + "integrity": "sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA==" }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "node_modules/@walletconnect/window-metadata": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz", + "integrity": "sha512-9eFvmJxIKCC3YWOL97SgRkKhlyGXkrHwamfechmqszbypFspaSk+t2jQXAEU7YClHF6Qjw5eYOmy1//zFi9/GA==", "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" + "@walletconnect/window-getters": "^1.0.0" } }, - "node_modules/d3-scale-chromatic": { + "node_modules/abort-controller": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" + "event-target-shim": "^5.0.0" }, "engines": { - "node": ">=12" + "node": ">=6.5" } }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "engines": { - "node": ">=12" - } + "node_modules/abortcontroller-polyfill": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "node_modules/abstract-level": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", + "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", + "dev": true, "dependencies": { - "d3-path": "^3.1.0" + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" }, "engines": { "node": ">=12" } }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { - "d3-array": "2 - 3" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">=12" + "node": ">= 0.6" } }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dependencies": { - "d3-time": "1 - 3" + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=12" + "node": ">=0.4.0" } }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" + "node_modules/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, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" } }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=12" + "node": ">=0.4.0" } }, - "node_modules/dash-ast": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", - "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" - }, + "node_modules/acorn-node/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", "engines": { - "node": ">=0.10" + "node": ">=0.4.0" } }, - "node_modules/data-uri-to-buffer": { - "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==", + "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==", "dev": true, "engines": { - "node": ">= 12" + "node": ">=0.4.0" } }, - "node_modules/dayjs": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", - "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" - }, - "node_modules/death": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", - "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", "dev": true, - "peer": true + "engines": { + "node": ">=0.3.0" + } }, - "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/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + }, + "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==", "dependencies": { - "ms": "2.1.2" + "debug": "4" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 6.0.0" } }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" + "node_modules/agentkeepalive": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", + "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", + "dependencies": { + "debug": "^4.1.0", + "depd": "^2.0.0", + "humanize-ms": "^1.2.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "engines": { - "node": ">=0.10" + "node": ">= 8.0.0" } }, - "node_modules/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==", + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, "dependencies": { - "mimic-response": "^3.1.0" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/decompress-response/node_modules/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==", - "engines": { - "node": ">=10" + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "node_modules/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==", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/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==", "dev": true }, - "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==", - "dependencies": { - "type-detect": "^4.0.0" - }, + "node_modules/ansi-align/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, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/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==", + "node_modules/ansi-align/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==", "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">=4.0.0" + "node": ">=8" } }, - "node_modules/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 - }, - "node_modules/deepmerge": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", - "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", + "node_modules/ansi-colors": { + "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==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "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==", "dev": true, "dependencies": { - "clone": "^1.0.2" + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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==", + "dev": true, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deferred-leveldown": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz", - "integrity": "sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==", + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "peer": true, "dependencies": { - "abstract-leveldown": "~6.2.1", - "inherits": "^2.0.3" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/deferred-leveldown/node_modules/abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "peer": true, "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=6" + "node": ">= 8" } }, - "node_modules/deferred-leveldown/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "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==", + "dev": true + }, + "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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "engines": { + "node": ">=6" } }, - "node_modules/deferred-leveldown/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, - "peer": true, "dependencies": { - "xtend": "^4.0.2" + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/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, "engines": { "node": ">=8" } }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "node_modules/array.prototype.map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.5.tgz", + "integrity": "sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==", + "dev": true, "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" }, "engines": { "node": ">= 0.4" @@ -12447,2266 +7130,2474 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" } }, - "node_modules/degenerator": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", - "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", - "dev": true, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/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/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dependencies": { - "ast-types": "^0.13.2", - "escodegen": "^1.8.1", - "esprima": "^4.0.0", - "vm2": "^3.9.8" - }, + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "engines": { - "node": ">= 6" + "node": ">=0.8" } }, - "node_modules/delaunator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", - "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", "dependencies": { - "robust-predicates": "^3.0.0" + "inherits": "2.0.1" } }, - "node_modules/delay": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", - "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, "engines": { - "node": ">=0.4.0" + "node": ">=4" } }, - "node_modules/depd": { + "node_modules/astral-regex": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } }, - "node_modules/deps-sort": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", - "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", + "node_modules/async-eventemitter": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", + "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", "dependencies": { - "JSONStream": "^1.0.3", - "shasum-object": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - }, - "bin": { - "deps-sort": "bin/cmd.js" + "async": "^2.4.0" } }, - "node_modules/des.js": { + "node_modules/async-limiter": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "node_modules/async-mutex": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.2.6.tgz", + "integrity": "sha512-Hs4R+4SPgamu6rSGW8C7cV9gaWUKEHykfzCCvIRuaVv636Ju10ZdeUbvb4TBEW0INuq2DHZqXbK4Nd3yG4RaRw==", "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "tslib": "^2.0.0" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "dependencies": { + "retry": "0.13.1" } }, - "node_modules/detect-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.2.0.tgz", - "integrity": "sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA==" + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "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, "engines": { - "node": ">=8" + "node": ">= 4.0.0" } }, - "node_modules/detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "dev": true, - "peer": true, - "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" - } - }, - "node_modules/detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], "dependencies": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" }, "bin": { - "detective": "bin/detective.js" + "autoprefixer": "bin/autoprefixer" }, "engines": { - "node": ">=0.8.0" + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "node_modules/aws-cdk": { + "version": "2.69.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.69.0.tgz", + "integrity": "sha512-wsocwG6gFpPq4WZhLc77khuD35qtDuSphV4kquirlPE7wBmXh7XKoC60sRJvz8IHjv5dvqygaoNL4HH2fLonaQ==", "dev": true, + "bin": { + "cdk": "bin/cdk" + }, "engines": { - "node": ">=0.3.1" + "node": ">= 14.15.0" + }, + "optionalDependencies": { + "fsevents": "2.3.2" } }, - "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", - "dev": true, + "node_modules/aws-cdk-lib": { + "version": "2.69.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.69.0.tgz", + "integrity": "sha512-VIwgMMpc8iHCZTmt1PuMdj20f0lTY8SI6Pltx7jvhYxyzvg04Dd0YAryBUuutj/khE3typJwiFzLlL7yoNo5AA==", + "bundleDependencies": [ + "@balena/dockerignore", + "case", + "fs-extra", + "ignore", + "jsonschema", + "minimatch", + "punycode", + "semver", + "yaml" + ], + "dependencies": { + "@aws-cdk/asset-awscli-v1": "^2.2.97", + "@aws-cdk/asset-kubectl-v20": "^2.1.1", + "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.77", + "@balena/dockerignore": "^1.0.2", + "case": "1.6.3", + "fs-extra": "^9.1.0", + "ignore": "^5.2.4", + "jsonschema": "^1.4.1", + "minimatch": "^3.1.2", + "punycode": "^2.3.0", + "semver": "^7.3.8", + "yaml": "1.10.2" + }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "node": ">= 14.15.0" + }, + "peerDependencies": { + "constructs": "^10.0.0" } }, - "node_modules/diffie-hellman/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/aws-cdk-lib/node_modules/@balena/dockerignore": { + "version": "1.0.2", + "inBundle": true, + "license": "Apache-2.0" }, - "node_modules/difflib": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", - "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", - "dev": true, - "peer": true, - "dependencies": { - "heap": ">= 0.2.0" - }, + "node_modules/aws-cdk-lib/node_modules/at-least-node": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": "*" + "node": ">= 4.0.0" } }, - "node_modules/dijkstrajs": { + "node_modules/aws-cdk-lib/node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz", - "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==" + "inBundle": true, + "license": "MIT" }, - "node_modules/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, + "node_modules/aws-cdk-lib/node_modules/brace-expansion": { + "version": "1.1.11", + "inBundle": true, + "license": "MIT", "dependencies": { - "path-type": "^4.0.0" - }, + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/aws-cdk-lib/node_modules/case": { + "version": "1.6.3", + "inBundle": true, + "license": "(MIT OR GPL-3.0-or-later)", "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "node_modules/aws-cdk-lib/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, + "node_modules/aws-cdk-lib/node_modules/fs-extra": { + "version": "9.1.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" } }, - "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + "node_modules/aws-cdk-lib/node_modules/graceful-fs": { + "version": "4.2.10", + "inBundle": true, + "license": "ISC" }, - "node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "node_modules/aws-cdk-lib/node_modules/ignore": { + "version": "5.2.4", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=0.4", - "npm": ">=1.2" + "node": ">= 4" } }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, + "node_modules/aws-cdk-lib/node_modules/jsonfile": { + "version": "6.1.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" + "universalify": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", - "dev": true, + "node_modules/aws-cdk-lib/node_modules/jsonschema": { + "version": "1.4.1", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "node_modules/aws-cdk-lib/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "readable-stream": "^2.0.2" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/duplexer2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/aws-cdk-lib/node_modules/minimatch": { + "version": "3.1.2", + "inBundle": true, + "license": "ISC", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/duplexer2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" + "node_modules/aws-cdk-lib/node_modules/punycode": { + "version": "2.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/dynamic-dedupe": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", - "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", - "dev": true, + "node_modules/aws-cdk-lib/node_modules/semver": { + "version": "7.3.8", + "inBundle": true, + "license": "ISC", "dependencies": { - "xtend": "^4.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "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 - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "node_modules/aws-cdk-lib/node_modules/universalify": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" + "node_modules/aws-cdk-lib/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/aws-cdk-lib/node_modules/yaml": { + "version": "1.10.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 6" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } }, - "node_modules/electron-to-chromium": { - "version": "1.4.330", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.330.tgz", - "integrity": "sha512-PqyefhybrVdjAJ45HaPLtuVaehiSw7C3ya0aad+rvmV53IVyXmYRk3pwIOb2TxTDTnmgQdn46NjMMaysx79/6Q==" + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, - "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==", + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" + "follow-redirects": "^1.14.0" } }, - "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/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "node_modules/babel-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", + "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", "dev": true, + "dependencies": { + "@jest/transform": "^29.5.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.8.0" } }, - "node_modules/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 - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/encoding-down": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz", - "integrity": "sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==", + "node_modules/babel-plugin-jest-hoist": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", + "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", "dev": true, - "peer": true, "dependencies": { - "abstract-leveldown": "^6.2.1", - "inherits": "^2.0.3", - "level-codec": "^9.0.0", - "level-errors": "^2.0.0" + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" }, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "dependencies": { - "once": "^1.4.0" + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "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==", + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, "dependencies": { - "ansi-colors": "^4.1.1" + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" }, - "engines": { - "node": ">=8.6" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "node_modules/babel-preset-jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", + "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.5.0", + "babel-preset-current-node-syntax": "^1.0.0" + }, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "node_modules/backoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/backoff/-/backoff-2.5.0.tgz", + "integrity": "sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==", "dependencies": { - "prr": "~1.0.1" + "precond": "0.2" }, - "bin": { - "errno": "cli.js" + "engines": { + "node": ">= 0.6" } }, - "node_modules/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, + "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==" + }, + "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==", "dependencies": { - "is-arrayish": "^0.2.1" + "safe-buffer": "^5.0.1" } }, - "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64-sol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/base64-sol/-/base64-sol-1.0.1.tgz", + "integrity": "sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg==" + }, + "node_modules/bchaddrjs": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/bchaddrjs/-/bchaddrjs-0.5.2.tgz", + "integrity": "sha512-OO7gIn3m7ea4FVx4cT8gdlWQR2+++EquhdpWQJH9BQjK63tJJ6ngB3QMZDO6DiBoXiIGUsTPHjlrHVxPGcGxLQ==", + "dependencies": { + "bs58check": "2.1.2", + "buffer": "^6.0.3", + "cashaddrjs": "0.4.4", + "stream-browserify": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.0.0" } }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", "dev": true }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, + "node_modules/big-integer": { + "version": "1.6.36", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", + "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bigint-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz", + "integrity": "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==", + "hasInstallScript": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" + "bindings": "^1.3.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "node_modules/bigint-crypto-utils": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz", + "integrity": "sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "bigint-mod-arith": "^3.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10.4.0" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/bigint-mod-arith": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz", + "integrity": "sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ==", "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10.4.0" } }, - "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "hasInstallScript": true, - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", "engines": { - "node": ">=0.10" + "node": "*" } }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "file-uri-to-path": "1.0.0" } }, - "node_modules/es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" + "node_modules/bindings/node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + "node_modules/bip174": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bip174/-/bip174-2.1.0.tgz", + "integrity": "sha512-lkc0XyiX9E9KiVAS1ZiOqK1xfiwvf4FXDDdkDq5crcDzOq+xGytY+14qCsqz7kCiy8rpN1CRNfacRhf9G3JNSA==", + "engines": { + "node": ">=8.0.0" + } }, - "node_modules/es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", + "node_modules/bip32": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz", + "integrity": "sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==", "dependencies": { - "es6-promise": "^4.0.3" + "@types/node": "10.12.18", + "bs58check": "^2.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "tiny-secp256k1": "^1.1.3", + "typeforce": "^1.11.5", + "wif": "^2.0.6" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "node_modules/bip32-path": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/bip32-path/-/bip32-path-0.4.2.tgz", + "integrity": "sha512-ZBMCELjJfcNMkz5bDuJ1WrYvjlhEF5k6mQ8vUr4N7MbVRsXei7ZOg8VhhwMfNiW68NWmLkgkc6WvTickrLGprQ==" + }, + "node_modules/bip32/node_modules/@types/node": { + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" + }, + "node_modules/bip66": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/bip66/-/bip66-1.1.5.tgz", + "integrity": "sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==", "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" + "safe-buffer": "^5.0.1" } }, - "node_modules/esbuild": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.11.tgz", - "integrity": "sha512-pAMImyokbWDtnA/ufPxjQg0fYo2DDuzAlqwnDvbXqHLphe+m80eF++perYKVm8LeTuj2zUuFXC+xgSVxyoHUdg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.11", - "@esbuild/android-arm64": "0.17.11", - "@esbuild/android-x64": "0.17.11", - "@esbuild/darwin-arm64": "0.17.11", - "@esbuild/darwin-x64": "0.17.11", - "@esbuild/freebsd-arm64": "0.17.11", - "@esbuild/freebsd-x64": "0.17.11", - "@esbuild/linux-arm": "0.17.11", - "@esbuild/linux-arm64": "0.17.11", - "@esbuild/linux-ia32": "0.17.11", - "@esbuild/linux-loong64": "0.17.11", - "@esbuild/linux-mips64el": "0.17.11", - "@esbuild/linux-ppc64": "0.17.11", - "@esbuild/linux-riscv64": "0.17.11", - "@esbuild/linux-s390x": "0.17.11", - "@esbuild/linux-x64": "0.17.11", - "@esbuild/netbsd-x64": "0.17.11", - "@esbuild/openbsd-x64": "0.17.11", - "@esbuild/sunos-x64": "0.17.11", - "@esbuild/win32-arm64": "0.17.11", - "@esbuild/win32-ia32": "0.17.11", - "@esbuild/win32-x64": "0.17.11" - } + "node_modules/bitcoin-ops": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz", + "integrity": "sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==" }, - "node_modules/esbuild-android-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/bitcoinjs-lib": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bitcoinjs-lib/-/bitcoinjs-lib-5.2.0.tgz", + "integrity": "sha512-5DcLxGUDejgNBYcieMIUfjORtUeNWl828VWLHJGVKZCb4zIS1oOySTUr0LGmcqJBQgTBz3bGbRQla4FgrdQEIQ==", + "dependencies": { + "bech32": "^1.1.2", + "bip174": "^2.0.1", + "bip32": "^2.0.4", + "bip66": "^1.1.0", + "bitcoin-ops": "^1.4.0", + "bs58check": "^2.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.3", + "merkle-lib": "^2.0.10", + "pushdata-bitcoin": "^1.0.1", + "randombytes": "^2.0.1", + "tiny-secp256k1": "^1.1.1", + "typeforce": "^1.11.3", + "varuint-bitcoin": "^1.0.4", + "wif": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8.0.0" } }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", - "cpu": [ - "arm64" - ], + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/blake-hash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/blake-hash/-/blake-hash-2.0.0.tgz", + "integrity": "sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2", + "readable-stream": "^3.6.0" + }, "engines": { - "node": ">=12" + "node": ">= 10" } }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/blake-hash/node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" + }, + "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==" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "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==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/borsh": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", + "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", + "dependencies": { + "bn.js": "^5.2.0", + "bs58": "^4.0.0", + "text-encoding-utf-8": "^1.0.2" } }, - "node_modules/esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", - "cpu": [ - "ia32" - ], + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "node_modules/boxen": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.2.tgz", + "integrity": "sha512-1Z4UJabXUP1/R9rLpoU3O2lEMnG3pPLAs/ZD2lF3t2q7qD5lM8rqbtnvtvm4N0wEyNlE+9yZVTVAGmd1V5jabg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.0", + "chalk": "^5.0.1", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, "engines": { - "node": ">=12" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esbuild-linux-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", - "cpu": [ - "x64" - ], + "node_modules/boxen/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", - "cpu": [ - "arm" - ], + "node_modules/boxen/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, - "optional": true, - "os": [ - "linux" - ], "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", - "cpu": [ - "arm64" - ], + "node_modules/boxen/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", - "cpu": [ - "mips64el" - ], + "node_modules/boxen/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", - "cpu": [ - "ppc64" - ], + "node_modules/boxen/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", - "cpu": [ - "riscv64" - ], + "node_modules/boxen/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", - "cpu": [ - "s390x" - ], + "node_modules/boxen/node_modules/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, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", - "cpu": [ - "x64" - ], + "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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "fill-range": "^7.0.1" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", - "cpu": [ - "x64" - ], + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/browser-level": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.1", + "module-error": "^1.0.2", + "run-parallel-limit": "^1.1.0" + } + }, + "node_modules/browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dependencies": { + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "JSONStream": "^1.0.3", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + }, + "bin": { + "browser-pack": "bin/cmd.js" + } + }, + "node_modules/browser-resolve": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", + "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dependencies": { + "resolve": "^1.17.0" + } + }, + "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==", + "dev": true + }, + "node_modules/browser-tabs-lock": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/browser-tabs-lock/-/browser-tabs-lock-1.2.15.tgz", + "integrity": "sha512-J8K9vdivK0Di+b8SBdE7EZxDr88TnATing7XoLw6+nFkXMQ6sVBh92K3NQvZlZU91AIkFRi0w3sztk5Z+vsswA==", + "hasInstallScript": true, + "dependencies": { + "lodash": ">=4.17.21" + } + }, + "node_modules/browserify": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", + "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", + "dependencies": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^2.0.0", + "browserify-zlib": "~0.2.0", + "buffer": "~5.2.1", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.1", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^3.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.2.1", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp-classic": "^0.5.2", + "module-deps": "^6.2.3", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "^1.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum-object": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^3.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.12.0", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "browserify": "bin/cmd.js" + }, "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/esbuild-plugins-node-modules-polyfill": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/esbuild-plugins-node-modules-polyfill/-/esbuild-plugins-node-modules-polyfill-1.0.10.tgz", - "integrity": "sha512-PtxxvxBNmVNOm+fzcyEoNSXd1YZh1o691cTdNNWErXq9DzDqy6I4MxjLNnQ5C/XqOQwRqoX3x4cz7ouQ+6Ig1A==", - "dev": true, + "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==", "dependencies": { - "modern-node-polyfills": "^0.1.0" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" + "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" } }, - "node_modules/esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "node_modules/esbuild-windows-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" } }, - "node_modules/esbuild/node_modules/@esbuild/android-arm": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.11.tgz", - "integrity": "sha512-CdyX6sRVh1NzFCsf5vw3kULwlAhfy9wVt8SZlrhQ7eL2qBjGbFhRBWkkAzuZm9IIEOCKJw4DXA6R85g+qc8RDw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.11.tgz", - "integrity": "sha512-aCWlq70Q7Nc9WDnormntGS1ar6ZFvUpqr8gXtO+HRejRYPweAFQN615PcgaSJkZjhHp61+MNLhzyVALSF2/Q0g==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dependencies": { + "pako": "~1.0.5" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" + "node_modules/browserify/node_modules/buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "dev": true, + "node_modules/browserify/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "node_modules/browserify/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, - "node_modules/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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/browserify/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/browserify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dev": true, + "node_modules/browserify/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/browserify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "safe-buffer": "~5.1.0" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" }, "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "browserslist": "cli.js" }, "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "fast-json-stable-stringify": "2.x" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 6" } }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" + "base-x": "^3.0.2" } }, - "node_modules/escodegen/node_modules/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, - "engines": { - "node": ">= 0.8.0" + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" } }, - "node_modules/escodegen/node_modules/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==", + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" + "node-int64": "^0.4.0" } }, - "node_modules/eslint": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", - "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.1", - "@eslint/js": "8.36.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "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.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.5.0", - "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", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "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.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", "bin": { - "eslint": "bin/eslint.js" + "btoa": "bin/btoa.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 0.4.0" } }, - "node_modules/eslint-plugin-vue": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz", - "integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==", - "dev": true, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "eslint-utils": "^3.0.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.0.1", - "postcss-selector-parser": "^6.0.9", - "semver": "^7.3.5", - "vue-eslint-parser": "^8.0.1" - }, + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" + }, + "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==" + }, + "node_modules/buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" + }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + "node": ">=4" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, + "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.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "hasInstallScript": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "node-gyp-build": "^4.3.0" }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/bufio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bufio/-/bufio-1.2.0.tgz", + "integrity": "sha512-UlFk8z/PwdhYQTXSQQagwGAdtRI83gib2n4uy4rQnenxUM2yQi8lBDzF230BNk+3wAoZDxYRoBwVVUPgHa9MCA==", "engines": { "node": ">=8.0.0" } }, - "node_modules/eslint-utils": { + "node_modules/builtin-status-codes": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "streamsearch": "^1.1.0" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "node": ">=10.16.0" + } + }, + "node_modules/bytebuffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ==", + "dependencies": { + "long": "~3" }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/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, "engines": { - "node": ">=10" + "node": ">=0.8" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, + "node_modules/bytebuffer/node_modules/long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=0.6" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.8" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true, "engines": { - "node": ">=4.0" + "node": ">=14.16" } }, - "node_modules/esno": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/esno/-/esno-0.16.3.tgz", - "integrity": "sha512-6slSBEV1lMKcX13DBifvnDFpNno5WXhw4j/ff7RI0y51BZiDqEe5dNhhjhIQ3iCOQuzsm2MbVzmwqbN78BBhPg==", + "node_modules/cacheable-request": { + "version": "10.2.8", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.8.tgz", + "integrity": "sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==", "dev": true, "dependencies": { - "tsx": "^3.2.1" + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" }, - "bin": { - "esno": "esno.js" + "engines": { + "node": ">=14.16" } }, - "node_modules/espree": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", - "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", - "dev": true, + "node_modules/cached-path-relative": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", + "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==" + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "engines": { - "node": ">=0.10" + "node": ">=6" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true, "engines": { - "node": ">=4.0" + "node": ">= 6" } }, - "node_modules/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, + "node_modules/caniuse-lite": { + "version": "1.0.30001466", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001466.tgz", + "integrity": "sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/cashaddrjs": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cashaddrjs/-/cashaddrjs-0.4.4.tgz", + "integrity": "sha512-xZkuWdNOh0uq/mxJIng6vYWfTowZLd9F4GMAlp2DwFHlcCqCm91NtuAc47RuV4L7r4PYcY5p6Cr2OKNb4hnkWA==", "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" + "big-integer": "1.6.36" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/catering": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", "dev": true, "engines": { - "node": ">=4.0" + "node": ">=6" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", "dev": true, + "dependencies": { + "nofilter": "^3.1.0" + }, "engines": { - "node": ">=4.0" + "node": ">=12.19" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "node_modules/eth-block-tracker": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz", - "integrity": "sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw==", - "dependencies": { - "@babel/plugin-transform-runtime": "^7.5.5", - "@babel/runtime": "^7.5.5", - "eth-query": "^2.1.0", - "json-rpc-random-id": "^1.0.1", - "pify": "^3.0.0", - "safe-event-emitter": "^1.0.1" + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chart.js": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.2.1.tgz", + "integrity": "sha512-6YbpQ0nt3NovAgOzbkSSeeAQu/3za1319dPUQTXn9WcOpywM8rGKxJHrhS8V8xEkAlk8YhEfjbuAPfUyp6jIsw==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": "^7.0.0" } }, - "node_modules/eth-block-tracker/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", "engines": { - "node": ">=4" + "node": "*" } }, - "node_modules/eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", + "node_modules/checkpoint-store": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/checkpoint-store/-/checkpoint-store-1.1.0.tgz", + "integrity": "sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg==", "dependencies": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" + "functional-red-black-tree": "^1.0.1" } }, - "node_modules/eth-ens-namehash/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" - }, - "node_modules/eth-gas-reporter": { - "version": "0.2.25", - "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", - "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==", + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, - "peer": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "@ethersproject/abi": "^5.0.0-beta.146", - "@solidity-parser/parser": "^0.14.0", - "cli-table3": "^0.5.0", - "colors": "1.4.0", - "ethereum-cryptography": "^1.0.3", - "ethers": "^4.0.40", - "fs-readdir-recursive": "^1.1.0", - "lodash": "^4.17.14", - "markdown-table": "^1.1.3", - "mocha": "^7.1.1", - "req-cwd": "^2.0.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "sha1": "^1.1.1", - "sync-request": "^6.0.0" + "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" }, - "peerDependencies": { - "@codechecks/client": "^0.1.0" + "engines": { + "node": ">= 8.10.0" }, - "peerDependenciesMeta": { - "@codechecks/client": { - "optional": true - } + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/eth-gas-reporter/node_modules/ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "node_modules/chokidar/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, - "peer": true, + "dependencies": { + "is-glob": "^4.0.1" + }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/eth-gas-reporter/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true, - "peer": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/eth-gas-reporter/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, - "peer": true, + "node_modules/cids": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { - "color-convert": "^1.9.0" + "buffer": "^5.5.0", + "class-is": "^1.1.0", + "multibase": "~0.6.0", + "multicodec": "^1.0.0", + "multihashes": "~0.4.15" }, "engines": { - "node": ">=4" + "node": ">=4.0.0", + "npm": ">=3.0.0" } }, - "node_modules/eth-gas-reporter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "peer": true, + "node_modules/cids/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "sprintf-js": "~1.0.2" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/eth-gas-reporter/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true, - "peer": true - }, - "node_modules/eth-gas-reporter/node_modules/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, - "peer": true, + "node_modules/cids/node_modules/multicodec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "buffer": "^5.6.0", + "varint": "^5.0.0" } }, - "node_modules/eth-gas-reporter/node_modules/chalk/node_modules/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, - "peer": true, + "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==", "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/eth-gas-reporter/node_modules/chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "node_modules/cjs-module-lexer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", + "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "dev": true + }, + "node_modules/class-is": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" + }, + "node_modules/classic-level": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", + "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", "dev": true, - "peer": true, + "hasInstallScript": true, "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "~2.0.0", + "node-gyp-build": "^4.3.0" }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.1" + "node": ">=12" } }, - "node_modules/eth-gas-reporter/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "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==", "dev": true, - "peer": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "engines": { + "node": ">=6" } }, - "node_modules/eth-gas-reporter/node_modules/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==", + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "dev": true, - "peer": true, - "dependencies": { - "color-name": "1.1.3" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eth-gas-reporter/node_modules/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, - "peer": true - }, - "node_modules/eth-gas-reporter/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, - "peer": true, "dependencies": { - "ms": "^2.1.1" + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/eth-gas-reporter/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "node_modules/cli-spinners": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", + "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", "dev": true, - "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eth-gas-reporter/node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, - "peer": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, "engines": { - "node": ">=0.3.1" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eth-gas-reporter/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true, - "peer": true - }, - "node_modules/eth-gas-reporter/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==", + "node_modules/cli-width": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz", + "integrity": "sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==", "dev": true, - "peer": true, "engines": { - "node": ">=0.8.0" + "node": ">= 12" } }, - "node_modules/eth-gas-reporter/node_modules/ethers": { - "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, - "peer": true, "dependencies": { - "aes-js": "3.0.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/eth-gas-reporter/node_modules/find-up": { + "node_modules/cliui/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==", + "dev": true + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "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, - "peer": true, - "dependencies": { - "locate-path": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/eth-gas-reporter/node_modules/flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "node_modules/cliui/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==", "dev": true, - "peer": true, "dependencies": { - "is-buffer": "~2.0.3" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "bin": { - "flat": "cli.js" + "engines": { + "node": ">=8" } }, - "node_modules/eth-gas-reporter/node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=0.8" } }, - "node_modules/eth-gas-reporter/node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "peer": true, + "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==", "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" + "mimic-response": "^1.0.0" }, - "engines": { - "node": "*" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eth-gas-reporter/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, - "peer": true, - "dependencies": { - "is-glob": "^4.0.1" - }, + "node_modules/clone-response/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==", "engines": { - "node": ">= 6" + "node": ">=4" } }, - "node_modules/eth-gas-reporter/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==", + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, - "peer": true, "engines": { - "node": ">=4" + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" } }, - "node_modules/eth-gas-reporter/node_modules/hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, - "peer": true, + "node_modules/co-body": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", + "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "inflation": "^2.0.0", + "qs": "^6.5.2", + "raw-body": "^2.3.3", + "type-is": "^1.6.16" } }, - "node_modules/eth-gas-reporter/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "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==", "dev": true, - "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=4" + "node": ">=7.0.0" } }, - "node_modules/eth-gas-reporter/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "dev": true, - "peer": true + "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==", + "dev": true }, - "node_modules/eth-gas-reporter/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "peer": true, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "node_modules/combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" } }, - "node_modules/eth-gas-reporter/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, + "node_modules/combine-source-map/node_modules/convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==" + }, + "node_modules/combine-source-map/node_modules/lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==" + }, + "node_modules/combine-source-map/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/eth-gas-reporter/node_modules/log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "peer": true, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { - "chalk": "^2.4.2" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/eth-gas-reporter/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "node_modules/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==", + "dev": true + }, + "node_modules/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, - "peer": true, "dependencies": { - "brace-expansion": "^1.1.7" + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" }, "engines": { - "node": "*" + "node": ">=4.0.0" } }, - "node_modules/eth-gas-reporter/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "node_modules/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, - "peer": true, "dependencies": { - "minimist": "^1.2.5" + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/eth-gas-reporter/node_modules/mocha": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", - "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", + "node_modules/command-line-usage/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, - "peer": true, "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" + "color-convert": "^1.9.0" }, "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": ">=4" } }, - "node_modules/eth-gas-reporter/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "node_modules/command-line-usage/node_modules/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, - "peer": true + "engines": { + "node": ">=8" + } }, - "node_modules/eth-gas-reporter/node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "node_modules/command-line-usage/node_modules/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, - "peer": true, "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">= 0.4" + "node": ">=4" } }, - "node_modules/eth-gas-reporter/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/command-line-usage/node_modules/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, - "peer": true, "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "color-name": "1.1.3" } }, - "node_modules/eth-gas-reporter/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/command-line-usage/node_modules/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 + }, + "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, - "peer": true, - "dependencies": { - "p-limit": "^2.0.0" - }, "engines": { - "node": ">=6" + "node": ">=0.8.0" } }, - "node_modules/eth-gas-reporter/node_modules/path-exists": { + "node_modules/command-line-usage/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "peer": true, "engines": { "node": ">=4" } }, - "node_modules/eth-gas-reporter/node_modules/readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "node_modules/command-line-usage/node_modules/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, - "peer": true, "dependencies": { - "picomatch": "^2.0.4" + "has-flag": "^3.0.0" }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/eth-gas-reporter/node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "node_modules/command-line-usage/node_modules/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, - "peer": true + "engines": { + "node": ">=8" + } }, - "node_modules/eth-gas-reporter/node_modules/scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", + "node_modules/commander": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", + "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", "dev": true, - "peer": true + "engines": { + "node": ">=14" + } }, - "node_modules/eth-gas-reporter/node_modules/setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", - "dev": true, - "peer": true + "node_modules/compare-versions": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.3.tgz", + "integrity": "sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==", + "dev": true }, - "node_modules/eth-gas-reporter/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "peer": true, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "node_modules/eth-gas-reporter/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "peer": true, + "node_modules/concat-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/eth-gas-reporter/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==", + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/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, - "peer": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" } }, - "node_modules/eth-gas-reporter/node_modules/supports-color": { + "node_modules/config-chain/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 + }, + "node_modules/configstore": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", "dev": true, - "peer": true, "dependencies": { - "has-flag": "^3.0.0" + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" } }, - "node_modules/eth-gas-reporter/node_modules/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "peer": true - }, - "node_modules/eth-gas-reporter/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/configstore/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, - "peer": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" + }, + "node_modules/constructs": { + "version": "10.1.278", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.1.278.tgz", + "integrity": "sha512-F1JfBAglyMTAbtrA74z1tOST9RYSETkMVZcoYCggtPTMNEZsAMnu9qFxA5Z19m75XcAWLSAts8cLNJZH27alTA==", + "engines": { + "node": ">= 14.17.0" } }, - "node_modules/eth-gas-reporter/node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true, - "peer": true - }, - "node_modules/eth-gas-reporter/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "peer": true, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "safe-buffer": "5.2.1" }, "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/eth-gas-reporter/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true, - "peer": true - }, - "node_modules/eth-gas-reporter/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "peer": true, + "node_modules/content-hash": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "cids": "^0.7.1", + "multicodec": "^0.5.5", + "multihashes": "^0.4.15" } }, - "node_modules/eth-gas-reporter/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "peer": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" } }, - "node_modules/eth-gas-reporter/node_modules/yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "peer": true, - "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/eth-json-rpc-filters": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz", - "integrity": "sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw==", + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==" + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", "dependencies": { - "@metamask/safe-event-emitter": "^2.0.0", - "async-mutex": "^0.2.6", - "eth-json-rpc-middleware": "^6.0.0", - "eth-query": "^2.1.2", - "json-rpc-engine": "^6.1.0", - "pify": "^5.0.0" + "toggle-selection": "^1.0.6" } }, - "node_modules/eth-json-rpc-filters/node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "engines": { - "node": ">=10" + "node_modules/core-js-compat": { + "version": "3.29.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.1.tgz", + "integrity": "sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA==", + "dependencies": { + "browserslist": "^4.21.5" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/eth-json-rpc-infura": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz", - "integrity": "sha512-THzLye3PHUSGn1EXMhg6WTLW9uim7LQZKeKaeYsS9+wOBcamRiCQVGHa6D2/4P0oS0vSaxsBnU/J6qvn0MPdow==", - "dependencies": { - "eth-json-rpc-middleware": "^6.0.0", - "eth-rpc-errors": "^3.0.0", - "json-rpc-engine": "^5.3.0", - "node-fetch": "^2.6.0" - } + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, - "node_modules/eth-json-rpc-infura/node_modules/json-rpc-engine": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz", - "integrity": "sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g==", + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dependencies": { - "eth-rpc-errors": "^3.0.0", - "safe-event-emitter": "^1.0.1" + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/eth-json-rpc-infura/node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "node_modules/cosmiconfig": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.0.tgz", + "integrity": "sha512-0tLZ9URlPGU7JsKq0DQOQ3FoRsYX8xDZ7xMiATQfaiGMz7EHowNkbU9u1coAOmnh9p/1ySpm0RB3JNWRXM5GCg==", + "dev": true, "dependencies": { - "whatwg-url": "^5.0.0" + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" }, "engines": { - "node": "4.x || >=6.0.0" + "node": ">=14" }, - "peerDependencies": { - "encoding": "^0.1.0" + "funding": { + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "engines": { + "node": ">=0.8" } }, - "node_modules/eth-json-rpc-middleware": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz", - "integrity": "sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ==", + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dependencies": { - "btoa": "^1.2.1", - "clone": "^2.1.1", - "eth-query": "^2.1.2", - "eth-rpc-errors": "^3.0.0", - "eth-sig-util": "^1.4.2", - "ethereumjs-util": "^5.1.2", - "json-rpc-engine": "^5.3.0", - "json-stable-stringify": "^1.0.1", - "node-fetch": "^2.6.1", - "pify": "^3.0.0", - "safe-event-emitter": "^1.0.1" + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" } }, - "node_modules/eth-json-rpc-middleware/node_modules/bn.js": { + "node_modules/create-ecdh/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/eth-json-rpc-middleware/node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/eth-json-rpc-middleware/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==", + "node_modules/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==", "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" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, - "node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "node_modules/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==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "node_modules/eth-json-rpc-middleware/node_modules/json-rpc-engine": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz", - "integrity": "sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g==", + "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==", + "dev": true + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", "dependencies": { - "eth-rpc-errors": "^3.0.0", - "safe-event-emitter": "^1.0.1" + "node-fetch": "2.6.7" } }, - "node_modules/eth-json-rpc-middleware/node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -14722,903 +9613,927 @@ } } }, - "node_modules/eth-json-rpc-middleware/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "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==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, "engines": { - "node": ">=4" + "node": ">= 8" } }, - "node_modules/eth-lib": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" } }, - "node_modules/eth-lib/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/eth-lib/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" }, - "node_modules/eth-lib/node_modules/ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eth-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", - "integrity": "sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==", - "dependencies": { - "json-rpc-random-id": "^1.0.0", - "xtend": "^4.0.1" + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eth-rpc-errors": { + "node_modules/cssesc": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz", - "integrity": "sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg==", - "dependencies": { - "fast-safe-stringify": "^2.0.6" - } - }, - "node_modules/eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw==", - "deprecated": "Deprecated in favor of '@metamask/eth-sig-util'", - "dependencies": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "ethereumjs-util": "^5.1.1" - } - }, - "node_modules/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/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" + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" } }, - "node_modules/eth-sig-util/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } + "node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" }, - "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==", + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dependencies": { - "js-sha3": "^0.8.0" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, - "node_modules/ethereum-common": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", - "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==" - }, - "node_modules/ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", - "dev": true, + "node_modules/d3": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.2.tgz", + "integrity": "sha512-WXty7qOGSHb7HR7CfOzwN1Gw04MUOzN8qh9ZUsvwycIMb4DYMpY9xczZ6jUorGtO6bR9BPMPaueIKwiDxu9uiQ==", "dependencies": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/ethereum-waffle": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz", - "integrity": "sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ==", - "dev": true, - "peer": true, + "node_modules/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ==", "dependencies": { - "@ethereum-waffle/chai": "4.0.10", - "@ethereum-waffle/compiler": "4.0.3", - "@ethereum-waffle/mock-contract": "4.0.4", - "@ethereum-waffle/provider": "4.0.5", - "solc": "0.8.15", - "typechain": "^8.0.0" - }, - "bin": { - "waffle": "bin/waffle" + "internmap": "1 - 2" }, "engines": { - "node": ">=10.0" - }, - "peerDependencies": { - "ethers": "*" + "node": ">=12" } }, - "node_modules/ethereum-waffle/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "peer": true, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", "engines": { - "node": ">= 12" - } - }, - "node_modules/ethereum-waffle/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver" + "node": ">=12" } }, - "node_modules/ethereum-waffle/node_modules/solc": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.15.tgz", - "integrity": "sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w==", - "dev": true, - "peer": true, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", "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" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" }, "engines": { - "node": ">=10.0.0" + "node": ">=12" } }, - "node_modules/ethereumjs-abi": { - "version": "0.6.8", - "resolved": "git+ssh://git@github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0", - "license": "MIT", + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", "dependencies": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" } }, - "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-account": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", - "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", - "dependencies": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" } }, - "node_modules/ethereumjs-account/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-account/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==", + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", "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" + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/ethereumjs-account/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "node_modules/d3-delaunay": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "delaunator": "5" + }, + "engines": { + "node": ">=12" } }, - "node_modules/ethereumjs-block": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", - "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", - "deprecated": "New package name format for new versions: @ethereumjs/block. Please update.", - "dependencies": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" } }, - "node_modules/ethereumjs-block/node_modules/abstract-leveldown": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", - "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "dependencies": { - "xtend": "~4.0.0" + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/ethereumjs-block/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-block/node_modules/deferred-leveldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", - "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", "dependencies": { - "abstract-leveldown": "~2.6.0" + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" } }, - "node_modules/ethereumjs-block/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/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" } }, - "node_modules/ethereumjs-block/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ethereumjs-block/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/ethereumjs-block/node_modules/level-codec": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", - "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" - }, - "node_modules/ethereumjs-block/node_modules/level-errors": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", - "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", "dependencies": { - "errno": "~0.1.1" + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/ethereumjs-block/node_modules/level-iterator-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", - "integrity": "sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==", + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", "dependencies": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/ethereumjs-block/node_modules/level-iterator-stream/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } }, - "node_modules/ethereumjs-block/node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/ethereumjs-block/node_modules/level-iterator-stream/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } }, - "node_modules/ethereumjs-block/node_modules/level-ws": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", - "integrity": "sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==", + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "dependencies": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/ethereumjs-block/node_modules/level-ws/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } }, - "node_modules/ethereumjs-block/node_modules/level-ws/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" } }, - "node_modules/ethereumjs-block/node_modules/level-ws/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } }, - "node_modules/ethereumjs-block/node_modules/level-ws/node_modules/xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "dependencies": { - "object-keys": "~0.4.0" + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" }, "engines": { - "node": ">=0.4" + "node": ">=12" } }, - "node_modules/ethereumjs-block/node_modules/levelup": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", "dependencies": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/ethereumjs-block/node_modules/memdown": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", - "integrity": "sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==", - "dependencies": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" } }, - "node_modules/ethereumjs-block/node_modules/memdown/node_modules/abstract-leveldown": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", - "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", "dependencies": { - "xtend": "~4.0.0" + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" } }, - "node_modules/ethereumjs-block/node_modules/merkle-patricia-tree": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", - "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "dependencies": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/ethereumjs-block/node_modules/merkle-patricia-tree/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" - }, - "node_modules/ethereumjs-block/node_modules/object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" - }, - "node_modules/ethereumjs-block/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" } }, - "node_modules/ethereumjs-block/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/ethereumjs-block/node_modules/semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "bin": { - "semver": "bin/semver" + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" } }, - "node_modules/ethereumjs-block/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "dependencies": { - "safe-buffer": "~5.1.0" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/ethereumjs-common": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz", - "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==", - "deprecated": "New package name format for new versions: @ethereumjs/common. Please update." + "node_modules/dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" }, - "node_modules/ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", - "deprecated": "New package name format for new versions: @ethereumjs/tx. Please update.", + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dependencies": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/ethereumjs-tx/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/data-uri-to-buffer": { + "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==", + "dev": true, + "engines": { + "node": ">= 12" + } }, - "node_modules/ethereumjs-tx/node_modules/ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ==" + "node_modules/dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" }, - "node_modules/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==", + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "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" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/ethereumjs-tx/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", - "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/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" } }, - "node_modules/ethereumjs-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==", + "node_modules/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==", "dependencies": { - "@types/node": "*" + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ethereumjs-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/decompress-response/node_modules/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "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==", + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true + }, + "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==", "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" + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/ethereumjs-vm": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", - "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", - "deprecated": "New package name format for new versions: @ethereumjs/vm. Please update.", - "dependencies": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" + "node_modules/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, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/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 + }, + "node_modules/deepmerge": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", + "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ethereumjs-vm/node_modules/abstract-leveldown": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", - "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, "dependencies": { - "xtend": "~4.0.0" + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ethereumjs-vm/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/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==", + "engines": { + "node": ">=10" + } }, - "node_modules/ethereumjs-vm/node_modules/deferred-leveldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", - "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", - "dependencies": { - "abstract-leveldown": "~2.6.0" + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/ethereumjs-vm/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==", + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "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" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ethereumjs-vm/node_modules/ethereumjs-block": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", - "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", - "deprecated": "New package name format for new versions: @ethereumjs/block. Please update.", - "dependencies": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "node_modules/degenerator": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", + "dev": true, "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.8" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", - "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", - "deprecated": "New package name format for new versions: @ethereumjs/tx. Please update.", + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", "dependencies": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" + "robust-predicates": "^3.0.0" } }, - "node_modules/ethereumjs-vm/node_modules/isarray": { + "node_modules/delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } }, - "node_modules/ethereumjs-vm/node_modules/level-codec": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", - "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } }, - "node_modules/ethereumjs-vm/node_modules/level-errors": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", - "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "node_modules/deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", "dependencies": { - "errno": "~0.1.1" + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + }, + "bin": { + "deps-sort": "bin/cmd.js" } }, - "node_modules/ethereumjs-vm/node_modules/level-iterator-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", - "integrity": "sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==", + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "dependencies": { "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" + "minimalistic-assert": "^1.0.0" } }, - "node_modules/ethereumjs-vm/node_modules/level-iterator-stream/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, - "node_modules/ethereumjs-vm/node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "node_modules/detect-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.2.0.tgz", + "integrity": "sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA==" + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" } }, - "node_modules/ethereumjs-vm/node_modules/level-iterator-stream/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/ethereumjs-vm/node_modules/level-ws": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", - "integrity": "sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==", + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dependencies": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, - "node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "node_modules/diffie-hellman/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-vm/node_modules/level-ws/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "node_modules/dijkstrajs": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz", + "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==" + }, + "node_modules/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, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true }, - "node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, "dependencies": { - "object-keys": "~0.4.0" + "esutils": "^2.0.2" }, "engines": { - "node": ">=0.4" + "node": ">=6.0.0" } }, - "node_modules/ethereumjs-vm/node_modules/levelup": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", - "dependencies": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" }, - "node_modules/ethereumjs-vm/node_modules/memdown": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", - "integrity": "sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==", - "dependencies": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" } }, - "node_modules/ethereumjs-vm/node_modules/memdown/node_modules/abstract-leveldown": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", - "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dev": true, "dependencies": { - "xtend": "~4.0.0" + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", - "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", - "dependencies": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "dev": true, + "engines": { + "node": ">=12" } }, - "node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true }, - "node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "readable-stream": "^2.0.2" } }, - "node_modules/ethereumjs-vm/node_modules/object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" + "node_modules/duplexer2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, - "node_modules/ethereumjs-vm/node_modules/readable-stream": { + "node_modules/duplexer2/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", @@ -15632,20 +10547,12 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/ethereumjs-vm/node_modules/safe-buffer": { + "node_modules/duplexer2/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/ethereumjs-vm/node_modules/semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/ethereumjs-vm/node_modules/string_decoder": { + "node_modules/duplexer2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", @@ -15653,3037 +10560,3038 @@ "safe-buffer": "~5.1.0" } }, - "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" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/dynamic-dedupe": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", + "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", + "dev": true, "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" + "xtend": "^4.0.0" } }, - "node_modules/ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "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 + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dependencies": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/ethjs-unit/node_modules/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==" - }, - "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==", + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", "dependencies": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "safe-buffer": "^5.0.1" } }, - "node_modules/event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", - "dev": true, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.330", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.330.tgz", + "integrity": "sha512-PqyefhybrVdjAJ45HaPLtuVaehiSw7C3ya0aad+rvmV53IVyXmYRk3pwIOb2TxTDTnmgQdn46NjMMaysx79/6Q==" + }, + "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==", "dependencies": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.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" } }, - "node_modules/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==", + "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/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "node_modules/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 }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { - "node": ">=0.8.x" + "node": ">= 0.8" } }, - "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==", + "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==", "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "once": "^1.4.0" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "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==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "ansi-colors": "^4.1.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">=8.6" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, "engines": { - "node": ">= 0.8.0" + "node": ">=6" } }, - "node_modules/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", - "dev": true, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dependencies": { - "@jest/expect-utils": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" + "prr": "~1.0.1" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "bin": { + "errno": "cli.js" } }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "node_modules/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, "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, "dependencies": { - "ms": "2.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, "dependencies": { - "type": "^2.7.2" + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, "engines": { - "node": "> 0.1.90" + "node": ">=0.10" } }, - "node_modules/fake-merkle-patricia-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz", - "integrity": "sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA==", + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "dependencies": { - "checkpoint-store": "^1.1.0" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, - "node_modules/fast-deep-equal": { + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==" + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/es6-symbol": { "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==" + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "node_modules/esbuild": { + "version": "0.17.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.11.tgz", + "integrity": "sha512-pAMImyokbWDtnA/ufPxjQg0fYo2DDuzAlqwnDvbXqHLphe+m80eF++perYKVm8LeTuj2zUuFXC+xgSVxyoHUdg==", "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=8.6.0" + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.11", + "@esbuild/android-arm64": "0.17.11", + "@esbuild/android-x64": "0.17.11", + "@esbuild/darwin-arm64": "0.17.11", + "@esbuild/darwin-x64": "0.17.11", + "@esbuild/freebsd-arm64": "0.17.11", + "@esbuild/freebsd-x64": "0.17.11", + "@esbuild/linux-arm": "0.17.11", + "@esbuild/linux-arm64": "0.17.11", + "@esbuild/linux-ia32": "0.17.11", + "@esbuild/linux-loong64": "0.17.11", + "@esbuild/linux-mips64el": "0.17.11", + "@esbuild/linux-ppc64": "0.17.11", + "@esbuild/linux-riscv64": "0.17.11", + "@esbuild/linux-s390x": "0.17.11", + "@esbuild/linux-x64": "0.17.11", + "@esbuild/netbsd-x64": "0.17.11", + "@esbuild/openbsd-x64": "0.17.11", + "@esbuild/sunos-x64": "0.17.11", + "@esbuild/win32-arm64": "0.17.11", + "@esbuild/win32-ia32": "0.17.11", + "@esbuild/win32-x64": "0.17.11" } }, - "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==", + "node_modules/esbuild-android-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 6" + "node": ">=12" } }, - "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==" - }, - "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 - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" - }, - "node_modules/fast-stable-stringify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", - "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==" - }, - "node_modules/fast-xml-parser": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.1.2.tgz", - "integrity": "sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg==", - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - }, - "funding": { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" + "node_modules/esbuild-android-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "node_modules/esbuild-darwin-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "reusify": "^1.0.4" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "node_modules/esbuild-darwin-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "bser": "2.1.1" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "node_modules/esbuild-freebsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", + "cpu": [ + "x64" + ], "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } + "optional": true, + "os": [ + "freebsd" ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, "engines": { - "node": "^12.20 || >= 14.13" + "node": ">=12" } }, - "node_modules/figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "node_modules/esbuild-freebsd-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "node_modules/esbuild-linux-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", + "cpu": [ + "ia32" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/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==", + "node_modules/esbuild-linux-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12" } }, - "node_modules/file-uri-to-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", - "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "node_modules/esbuild-linux-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", + "cpu": [ + "arm" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 6" + "node": ">=12" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/esbuild-linux-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node_modules/esbuild-linux-ppc64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/esbuild-linux-riscv64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/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==", + "node_modules/esbuild-linux-s390x": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "array-back": "^3.0.1" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=4.0.0" + "node": ">=12" } }, - "node_modules/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==", + "node_modules/esbuild-openbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "node_modules/esbuild-plugins-node-modules-polyfill": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/esbuild-plugins-node-modules-polyfill/-/esbuild-plugins-node-modules-polyfill-1.0.10.tgz", + "integrity": "sha512-PtxxvxBNmVNOm+fzcyEoNSXd1YZh1o691cTdNNWErXq9DzDqy6I4MxjLNnQ5C/XqOQwRqoX3x4cz7ouQ+6Ig1A==", "dev": true, - "bin": { - "flat": "cli.js" + "dependencies": { + "modern-node-polyfills": "^0.1.0" } }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "node_modules/esbuild-sunos-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12" } }, - "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 - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } + "node_modules/esbuild-windows-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" ], "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node": ">=12" } }, - "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==", - "dependencies": { - "is-callable": "^1.1.3" + "node_modules/esbuild-windows-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "node_modules/esbuild-windows-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "*" + "node": ">=12" } }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.17.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.11.tgz", + "integrity": "sha512-CdyX6sRVh1NzFCsf5vw3kULwlAhfy9wVt8SZlrhQ7eL2qBjGbFhRBWkkAzuZm9IIEOCKJw4DXA6R85g+qc8RDw==", + "cpu": [ + "arm" + ], "dev": true, - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 6" + "node": ">=12" } }, - "node_modules/form-data-encoder": { - "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==", + "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.17.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.11.tgz", + "integrity": "sha512-aCWlq70Q7Nc9WDnormntGS1ar6ZFvUpqr8gXtO+HRejRYPweAFQN615PcgaSJkZjhHp61+MNLhzyVALSF2/Q0g==", + "cpu": [ + "loong64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 14.17" + "node": ">=12" } }, - "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==", - "dev": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "engines": { - "node": ">=12.20.0" + "node": ">=6" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", - "dev": true + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "node_modules/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==", "dev": true, "engines": { - "node": "*" + "node": ">=10" }, "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, "engines": { - "node": ">= 0.6" + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", - "dev": true - }, - "node_modules/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==", + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">= 0.8.0" } }, - "node_modules/fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, "dependencies": { - "minipass": "^2.6.0" + "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" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "node_modules/escodegen/node_modules/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, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "node_modules/escodegen/node_modules/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, - "peer": true - }, - "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==" + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/eslint": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "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.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.5.0", + "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", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "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.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "node_modules/eslint-plugin-vue": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz", + "integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==", "dev": true, "dependencies": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" + "eslint-utils": "^3.0.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.0.1", + "postcss-selector-parser": "^6.0.9", + "semver": "^7.3.5", + "vue-eslint-parser": "^8.0.1" }, "engines": { - "node": ">=0.8.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/ftp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/ftp/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/ftp/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "node_modules/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, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" - }, - "node_modules/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==", + "node_modules/eslint-utils/node_modules/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, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10" } }, - "node_modules/ganache": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/ganache/-/ganache-7.7.7.tgz", - "integrity": "sha512-kZUuOcgDQBtbxzs4iB3chg1iAc28s2ffdOdzyTTzo4vr9sb843w4PbWd5v1hsIqtcNjurcpLaW8XRp/cw2u++g==", - "bundleDependencies": [ - "@trufflesuite/bigint-buffer", - "keccak", - "leveldown", - "secp256k1" - ], + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", "dev": true, - "hasShrinkwrap": true, - "dependencies": { - "@trufflesuite/bigint-buffer": "1.1.10", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "5.1.1", - "@types/seedrandom": "3.0.1", - "abstract-level": "1.0.3", - "abstract-leveldown": "7.2.0", - "async-eventemitter": "0.2.4", - "emittery": "0.10.0", - "keccak": "3.0.2", - "leveldown": "6.1.0", - "secp256k1": "4.0.3" - }, - "bin": { - "ganache": "dist/node/cli.js", - "ganache-cli": "dist/node/cli.js" - }, - "optionalDependencies": { - "bufferutil": "4.0.5", - "utf-8-validate": "5.0.7" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz", - "integrity": "sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "Apache-2.0", "dependencies": { - "node-gyp-build": "4.4.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 14.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer/node_modules/node-gyp-build": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", - "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "engines": { + "node": ">=4.0" } }, - "node_modules/ganache/node_modules/@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", + "node_modules/esno": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/esno/-/esno-0.16.3.tgz", + "integrity": "sha512-6slSBEV1lMKcX13DBifvnDFpNno5WXhw4j/ff7RI0y51BZiDqEe5dNhhjhIQ3iCOQuzsm2MbVzmwqbN78BBhPg==", "dev": true, "dependencies": { - "@types/node": "*" + "tsx": "^3.2.1" + }, + "bin": { + "esno": "esno.js" } }, - "node_modules/ganache/node_modules/@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "dev": true - }, - "node_modules/ganache/node_modules/@types/node": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", - "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", - "dev": true - }, - "node_modules/ganache/node_modules/@types/seedrandom": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.1.tgz", - "integrity": "sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw==", - "dev": true - }, - "node_modules/ganache/node_modules/abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", + "node_modules/espree": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", + "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", "dev": true, "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/ganache/node_modules/abstract-level/node_modules/level-supports": { + "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "dev": true + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/ganache/node_modules/abstract-leveldown": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", - "integrity": "sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==", + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, - "inBundle": true, - "license": "MIT", "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.0.0", - "is-buffer": "^2.0.5", - "level-concat-iterator": "^3.0.0", - "level-supports": "^2.0.1", - "queue-microtask": "^1.2.3" + "estraverse": "^5.1.0" }, "engines": { - "node": ">=10" + "node": ">=0.10" } }, - "node_modules/ganache/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "dependencies": { - "lodash": "^4.17.14" + "engines": { + "node": ">=4.0" } }, - "node_modules/ganache/node_modules/async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", + "node_modules/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, "dependencies": { - "async": "^2.4.0" + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" } }, - "node_modules/ganache/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==", + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "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" - } - ], - "inBundle": true, - "license": "MIT" + "engines": { + "node": ">=4.0" + } }, - "node_modules/ganache/node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "inBundle": true, - "license": "MIT" + "engines": { + "node": ">=4.0" + } }, - "node_modules/ganache/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "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" - } - ], - "inBundle": true, - "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eth-block-tracker": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz", + "integrity": "sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw==", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "@babel/plugin-transform-runtime": "^7.5.5", + "@babel/runtime": "^7.5.5", + "eth-query": "^2.1.0", + "json-rpc-random-id": "^1.0.1", + "pify": "^3.0.0", + "safe-event-emitter": "^1.0.1" + } + }, + "node_modules/eth-block-tracker/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", + "dependencies": { + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" } }, - "node_modules/ganache/node_modules/bufferutil": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", - "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", - "dev": true, - "hasInstallScript": true, - "optional": true, + "node_modules/eth-ens-namehash/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + }, + "node_modules/eth-json-rpc-filters": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz", + "integrity": "sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw==", "dependencies": { - "node-gyp-build": "^4.3.0" + "@metamask/safe-event-emitter": "^2.0.0", + "async-mutex": "^0.2.6", + "eth-json-rpc-middleware": "^6.0.0", + "eth-query": "^2.1.2", + "json-rpc-engine": "^6.1.0", + "pify": "^5.0.0" } }, - "node_modules/ganache/node_modules/catering": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.0.tgz", - "integrity": "sha512-M5imwzQn6y+ODBfgi+cfgZv2hIUI6oYU/0f35Mdb1ujGeqeoI5tOnl9Q13DTH7LW+7er+NYq8stNOKZD/Z3U/A==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "queue-tick": "^1.0.0" - }, + "node_modules/eth-json-rpc-filters/node_modules/pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ganache/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==", - "dev": true, - "inBundle": true, - "license": "MIT", + "node_modules/eth-json-rpc-infura": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz", + "integrity": "sha512-THzLye3PHUSGn1EXMhg6WTLW9uim7LQZKeKaeYsS9+wOBcamRiCQVGHa6D2/4P0oS0vSaxsBnU/J6qvn0MPdow==", "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" + "eth-json-rpc-middleware": "^6.0.0", + "eth-rpc-errors": "^3.0.0", + "json-rpc-engine": "^5.3.0", + "node-fetch": "^2.6.0" } }, - "node_modules/ganache/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==", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/emittery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", - "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", - "dev": true - }, - "node_modules/ganache/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==", - "dev": true, - "inBundle": true, - "license": "MIT", + "node_modules/eth-json-rpc-infura/node_modules/json-rpc-engine": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz", + "integrity": "sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g==", "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "eth-rpc-errors": "^3.0.0", + "safe-event-emitter": "^1.0.1" } }, - "node_modules/ganache/node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "inBundle": true, - "license": "MIT", + "node_modules/eth-json-rpc-infura/node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/ganache/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" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" + "node_modules/eth-json-rpc-middleware": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz", + "integrity": "sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ==", + "dependencies": { + "btoa": "^1.2.1", + "clone": "^2.1.1", + "eth-query": "^2.1.2", + "eth-rpc-errors": "^3.0.0", + "eth-sig-util": "^1.4.2", + "ethereumjs-util": "^5.1.2", + "json-rpc-engine": "^5.3.0", + "json-stable-stringify": "^1.0.1", + "node-fetch": "^2.6.1", + "pify": "^3.0.0", + "safe-event-emitter": "^1.0.1" + } }, - "node_modules/ganache/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "inBundle": true, - "license": "ISC" + "node_modules/eth-json-rpc-middleware/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/ganache/node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "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" - } - ], - "inBundle": true, - "license": "MIT", + "node_modules/eth-json-rpc-middleware/node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "engines": { - "node": ">=4" + "node": ">=0.8" } }, - "node_modules/ganache/node_modules/keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", + "node_modules/eth-json-rpc-middleware/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": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10.0.0" + "@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/ganache/node_modules/level-concat-iterator": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz", - "integrity": "sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==", - "dev": true, - "inBundle": true, - "license": "MIT", + "node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", "dependencies": { - "catering": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ganache/node_modules/level-supports": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz", - "integrity": "sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/ganache/node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dev": true, + "node_modules/eth-json-rpc-middleware/node_modules/json-rpc-engine": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz", + "integrity": "sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g==", "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" + "eth-rpc-errors": "^3.0.0", + "safe-event-emitter": "^1.0.1" } }, - "node_modules/ganache/node_modules/leveldown": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-6.1.0.tgz", - "integrity": "sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w==", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", + "node_modules/eth-json-rpc-middleware/node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", "dependencies": { - "abstract-leveldown": "^7.2.0", - "napi-macros": "~2.0.0", - "node-gyp-build": "^4.3.0" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">=10.12.0" + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/ganache/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "node_modules/eth-json-rpc-middleware/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "engines": { + "node": ">=4" + } }, - "node_modules/ganache/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==", - "dev": true, - "inBundle": true, - "license": "ISC" + "node_modules/eth-lib": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" + } }, - "node_modules/ganache/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": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true, - "inBundle": true, - "license": "MIT" + "node_modules/eth-lib/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/ganache/node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "dev": true + "node_modules/eth-lib/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/ganache/node_modules/napi-macros": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "dev": true, - "inBundle": true, - "license": "MIT" + "node_modules/eth-lib/node_modules/ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } }, - "node_modules/ganache/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==", - "dev": true, - "inBundle": true, - "license": "MIT" + "node_modules/eth-query": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", + "integrity": "sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==", + "dependencies": { + "json-rpc-random-id": "^1.0.0", + "xtend": "^4.0.1" + } }, - "node_modules/ganache/node_modules/node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "node_modules/eth-rpc-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz", + "integrity": "sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg==", + "dependencies": { + "fast-safe-stringify": "^2.0.6" } }, - "node_modules/ganache/node_modules/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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" + "node_modules/eth-sig-util": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", + "integrity": "sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw==", + "deprecated": "Deprecated in favor of '@metamask/eth-sig-util'", + "dependencies": { + "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", + "ethereumjs-util": "^5.1.1" + } }, - "node_modules/ganache/node_modules/queue-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.0.tgz", - "integrity": "sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==", - "dev": true, - "inBundle": true, - "license": "MIT" + "node_modules/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/ganache/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "inBundle": true, - "license": "MIT", + "node_modules/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": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "@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/ganache/node_modules/safe-buffer": { + "node_modules/eth-sig-util/node_modules/ethereumjs-util": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dependencies": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/ganache/node_modules/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==", - "dev": true, - "inBundle": true, - "license": "MIT", + "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==", "dependencies": { - "safe-buffer": "~5.2.0" + "js-sha3": "^0.8.0" } }, - "node_modules/ganache/node_modules/utf-8-validate": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", - "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", + "node_modules/ethereum-common": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", + "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==" + }, + "node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", "dev": true, - "hasInstallScript": true, - "optional": true, "dependencies": { - "node-gyp-build": "^4.3.0" + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" } }, - "node_modules/ganache/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.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/get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + "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/get-caller-file": { + "node_modules/ethereumjs-account": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" + "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", + "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", + "dependencies": { + "ethereumjs-util": "^5.0.0", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "engines": { - "node": "*" - } + "node_modules/ethereumjs-account/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/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "node_modules/ethereumjs-account/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": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" + "@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/get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" + "node_modules/ethereumjs-account/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dependencies": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/ethereumjs-block": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", + "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", + "deprecated": "New package name format for new versions: @ethereumjs/block. Please update.", + "dependencies": { + "async": "^2.0.1", + "ethereum-common": "0.2.0", + "ethereumjs-tx": "^1.2.2", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, + "node_modules/ethereumjs-block/node_modules/abstract-leveldown": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", + "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "xtend": "~4.0.0" } }, - "node_modules/get-tsconfig": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.4.0.tgz", - "integrity": "sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "node_modules/ethereumjs-block/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-block/node_modules/deferred-leveldown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", + "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", + "dependencies": { + "abstract-leveldown": "~2.6.0" } }, - "node_modules/get-uri": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", - "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", - "dev": true, + "node_modules/ethereumjs-block/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": { - "@tootallnate/once": "1", - "data-uri-to-buffer": "3", - "debug": "4", - "file-uri-to-path": "2", - "fs-extra": "^8.1.0", - "ftp": "^0.3.10" - }, - "engines": { - "node": ">= 6" + "@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/get-uri/node_modules/data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", - "dev": true, - "engines": { - "node": ">= 6" + "node_modules/ethereumjs-block/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dependencies": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" - } + "node_modules/ethereumjs-block/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, - "node_modules/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, - "peer": true, + "node_modules/ethereumjs-block/node_modules/level-codec": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", + "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" + }, + "node_modules/ethereumjs-block/node_modules/level-errors": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", + "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", "dependencies": { - "chalk": "^2.4.2", - "node-emoji": "^1.10.0" - }, - "bin": { - "testrpc-sc": "index.js" + "errno": "~0.1.1" } }, - "node_modules/ghost-testrpc/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, - "peer": true, + "node_modules/ethereumjs-block/node_modules/level-iterator-stream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", + "integrity": "sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==", "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "inherits": "^2.0.1", + "level-errors": "^1.0.3", + "readable-stream": "^1.0.33", + "xtend": "^4.0.0" } }, - "node_modules/ghost-testrpc/node_modules/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, - "peer": true, + "node_modules/ethereumjs-block/node_modules/level-iterator-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/ethereumjs-block/node_modules/level-iterator-stream/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/ghost-testrpc/node_modules/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, - "peer": true, + "node_modules/ethereumjs-block/node_modules/level-iterator-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/ethereumjs-block/node_modules/level-ws": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", + "integrity": "sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==", "dependencies": { - "color-name": "1.1.3" + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" } }, - "node_modules/ghost-testrpc/node_modules/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, - "peer": true + "node_modules/ethereumjs-block/node_modules/level-ws/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, - "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, - "peer": true, - "engines": { - "node": ">=0.8.0" + "node_modules/ethereumjs-block/node_modules/level-ws/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/ghost-testrpc/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, - "peer": true, - "engines": { - "node": ">=4" - } + "node_modules/ethereumjs-block/node_modules/level-ws/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" }, - "node_modules/ghost-testrpc/node_modules/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, - "peer": true, + "node_modules/ethereumjs-block/node_modules/level-ws/node_modules/xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", "dependencies": { - "has-flag": "^3.0.0" + "object-keys": "~0.4.0" }, "engines": { - "node": ">=4" + "node": ">=0.4" } }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "dev": true, + "node_modules/ethereumjs-block/node_modules/levelup": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", + "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" + "deferred-leveldown": "~1.2.1", + "level-codec": "~7.0.0", + "level-errors": "~1.0.3", + "level-iterator-stream": "~1.3.0", + "prr": "~1.0.1", + "semver": "~5.4.1", + "xtend": "~4.0.0" } }, - "node_modules/git-url-parse": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", - "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", - "dev": true, + "node_modules/ethereumjs-block/node_modules/memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==", "dependencies": { - "git-up": "^7.0.0" + "abstract-leveldown": "~2.7.1", + "functional-red-black-tree": "^1.0.1", + "immediate": "^3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" } }, - "node_modules/glob": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.0.tgz", - "integrity": "sha512-EAZejC7JvnQINayvB/7BJbpZpNOJ8Lrw2OZNEvQxe0vaLn1SuwMcfV7/MNaX8L/T0wmptBFI4YMtDvSBxYDc7w==", - "dev": true, + "node_modules/ethereumjs-block/node_modules/memdown/node_modules/abstract-leveldown": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", + "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^7.4.1", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "xtend": "~4.0.0" } }, - "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==", - "dev": true, + "node_modules/ethereumjs-block/node_modules/merkle-patricia-tree": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", + "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" + "async": "^1.4.2", + "ethereumjs-util": "^5.0.0", + "level-ws": "0.0.0", + "levelup": "^1.2.1", + "memdown": "^1.0.0", + "readable-stream": "^2.0.0", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" } }, - "node_modules/glob/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, - "dependencies": { - "balanced-match": "^1.0.0" - } + "node_modules/ethereumjs-block/node_modules/merkle-patricia-tree/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" }, - "node_modules/glob/node_modules/minimatch": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.2.tgz", - "integrity": "sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "node_modules/ethereumjs-block/node_modules/object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" }, - "node_modules/global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "node_modules/ethereumjs-block/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/ethereumjs-block/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/ethereumjs-block/node_modules/semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "bin": { + "semver": "bin/semver" } }, - "node_modules/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, - "peer": true, + "node_modules/ethereumjs-block/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" + "safe-buffer": "~5.1.0" } }, - "node_modules/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, - "peer": true, + "node_modules/ethereumjs-common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz", + "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==", + "deprecated": "New package name format for new versions: @ethereumjs/common. Please update." + }, + "node_modules/ethereumjs-tx": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", + "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", + "deprecated": "New package name format for new versions: @ethereumjs/tx. Please update.", "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" + "ethereum-common": "^0.0.18", + "ethereumjs-util": "^5.0.0" } }, - "node_modules/global-prefix/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, - "peer": true + "node_modules/ethereumjs-tx/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/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "peer": true, + "node_modules/ethereumjs-tx/node_modules/ethereum-common": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", + "integrity": "sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ==" + }, + "node_modules/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": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "@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/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, + "node_modules/ethereumjs-tx/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, + "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==", "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@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/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, + "node_modules/ethereumjs-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==", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/node": "*" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/ethereumjs-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/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": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@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/got": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.0.tgz", - "integrity": "sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==", - "dev": true, + "node_modules/ethereumjs-vm": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", + "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", + "deprecated": "New package name format for new versions: @ethereumjs/vm. Please update.", "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "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": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "async": "^2.1.2", + "async-eventemitter": "^0.2.2", + "ethereumjs-account": "^2.0.3", + "ethereumjs-block": "~2.2.0", + "ethereumjs-common": "^1.1.0", + "ethereumjs-util": "^6.0.0", + "fake-merkle-patricia-tree": "^1.0.1", + "functional-red-black-tree": "^1.0.1", + "merkle-patricia-tree": "^2.3.2", + "rustbn.js": "~0.2.0", + "safe-buffer": "^5.1.1" } }, - "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==" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.x" + "node_modules/ethereumjs-vm/node_modules/abstract-leveldown": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", + "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", + "dependencies": { + "xtend": "~4.0.0" } }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, + "node_modules/ethereumjs-vm/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-vm/node_modules/deferred-leveldown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", + "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" + "abstract-leveldown": "~2.6.0" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" + "node_modules/ethereumjs-vm/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/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", + "node_modules/ethereumjs-vm/node_modules/ethereumjs-block": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", + "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", + "deprecated": "New package name format for new versions: @ethereumjs/block. Please update.", "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" + "async": "^2.0.1", + "ethereumjs-common": "^1.5.0", + "ethereumjs-tx": "^2.1.1", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" } }, - "node_modules/hardhat": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", - "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", - "dev": true, + "node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-evm": "^1.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "@nomicfoundation/ethereumjs-vm": "^6.0.0", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", - "abort-controller": "^3.0.0", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "chalk": "^2.4.2", - "chokidar": "^3.4.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": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "qs": "^6.7.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "bin": { - "hardhat": "internal/cli/bootstrap.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "ts-node": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/hardhat-gas-reporter": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", - "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", - "dev": true, - "peer": true, + "node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", + "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", + "deprecated": "New package name format for new versions: @ethereumjs/tx. Please update.", "dependencies": { - "array-uniq": "1.0.3", - "eth-gas-reporter": "^0.2.25", - "sha1": "^1.1.1" - }, - "peerDependencies": { - "hardhat": "^2.0.2" + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" } }, - "node_modules/hardhat/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, + "node_modules/ethereumjs-vm/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/ethereumjs-vm/node_modules/level-codec": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", + "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" + }, + "node_modules/ethereumjs-vm/node_modules/level-errors": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", + "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "errno": "~0.1.1" } }, - "node_modules/hardhat/node_modules/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, + "node_modules/ethereumjs-vm/node_modules/level-iterator-stream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", + "integrity": "sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "inherits": "^2.0.1", + "level-errors": "^1.0.3", + "readable-stream": "^1.0.33", + "xtend": "^4.0.0" } }, - "node_modules/hardhat/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==", - "dev": true + "node_modules/ethereumjs-vm/node_modules/level-iterator-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, - "node_modules/hardhat/node_modules/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, + "node_modules/ethereumjs-vm/node_modules/level-iterator-stream/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "dependencies": { - "color-name": "1.1.3" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/hardhat/node_modules/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 + "node_modules/ethereumjs-vm/node_modules/level-iterator-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" }, - "node_modules/hardhat/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, - "engines": { - "node": ">=0.8.0" + "node_modules/ethereumjs-vm/node_modules/level-ws": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", + "integrity": "sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==", + "dependencies": { + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" } }, - "node_modules/hardhat/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, + "node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "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==", - "dev": true, + "node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "object-keys": "~0.4.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=0.4" } }, - "node_modules/hardhat/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, + "node_modules/ethereumjs-vm/node_modules/levelup": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", + "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "deferred-leveldown": "~1.2.1", + "level-codec": "~7.0.0", + "level-errors": "~1.0.3", + "level-iterator-stream": "~1.3.0", + "prr": "~1.0.1", + "semver": "~5.4.1", + "xtend": "~4.0.0" } }, - "node_modules/hardhat/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, - "engines": { - "node": ">=4" + "node_modules/ethereumjs-vm/node_modules/memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==", + "dependencies": { + "abstract-leveldown": "~2.7.1", + "functional-red-black-tree": "^1.0.1", + "immediate": "^3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" } }, - "node_modules/hardhat/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, + "node_modules/ethereumjs-vm/node_modules/memdown/node_modules/abstract-leveldown": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", + "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" + "xtend": "~4.0.0" } }, - "node_modules/hardhat/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, + "node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", + "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" + "async": "^1.4.2", + "ethereumjs-util": "^5.0.0", + "level-ws": "0.0.0", + "levelup": "^1.2.1", + "memdown": "^1.0.0", + "readable-stream": "^2.0.0", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" } }, - "node_modules/hardhat/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, + "node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" + }, + "node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/hardhat/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" + "node_modules/ethereumjs-vm/node_modules/object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" + }, + "node_modules/ethereumjs-vm/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/hardhat/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" + "node_modules/ethereumjs-vm/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/ethereumjs-vm/node_modules/semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "bin": { + "semver": "bin/semver" } }, - "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==", - "dev": true, + "node_modules/ethereumjs-vm/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "safe-buffer": "~5.1.0" } }, - "node_modules/hardhat/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "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" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/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/node_modules/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, + "node_modules/ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", "dependencies": { - "has-flag": "^3.0.0" + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" }, "engines": { - "node": ">=4" + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/ethjs-unit/node_modules/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==" + }, + "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==", "dependencies": { - "function-bind": "^1.1.1" + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" }, "engines": { - "node": ">= 0.4.0" + "node": ">=6.5.0", + "npm": ">=3" } }, - "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==", + "node_modules/event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/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, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.8.x" } }, - "node_modules/has-symbols": { + "node_modules/evp_bytestokey": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, - "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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==", "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=4" - } - }, - "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==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/heap": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", - "dev": true, - "peer": true - }, - "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==", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, - "peer": true - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==", "engines": { - "node": ">=0.10" + "node": ">= 0.8.0" } }, - "node_modules/http-basic": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", - "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "node_modules/expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", "dev": true, - "peer": true, "dependencies": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" + "@jest/expect-utils": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" }, "engines": { - "node": ">=6.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/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==" - }, - "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==", + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", "depd": "2.0.0", - "inherits": "2.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", - "toidentifier": "1.0.1" + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.10.0" } }, - "node_modules/http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" + "ms": "2.0.0" } }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" + "type": "^2.7.2" } }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } + "node": ">=4" } }, - "node_modules/http-response-object": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", - "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "^10.0.3" - } + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] }, - "node_modules/http-response-object/node_modules/@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", - "dev": true, - "peer": true + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "engines": { + "node": "> 0.1.90" + } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "node_modules/fake-merkle-patricia-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz", + "integrity": "sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA==", "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "checkpoint-store": "^1.1.0" } }, - "node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "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==" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" + "@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" }, "engines": { - "node": ">=10.19.0" + "node": ">=8.6.0" } }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" - }, - "node_modules/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==", + "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, "dependencies": { - "agent-base": "6", - "debug": "4" + "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, - "node_modules/human-signals": { + "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dependencies": { - "ms": "^2.0.0" - } + "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 }, - "node_modules/husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", - "dev": true, - "bin": { - "husky": "lib/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" }, - "node_modules/iconoir": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/iconoir/-/iconoir-5.5.2.tgz", - "integrity": "sha512-198g3lHrs1nMr4FBfJL3cBMl89NhJat342c684JVYJPlPpjFY2RBZAzD/rpAtg8LIOGXzNjcZzIb+IQCfY4Dqw==" + "node_modules/fast-stable-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", + "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==" }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/fast-xml-parser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.1.2.tgz", + "integrity": "sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "strnum": "^1.0.5" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "dependencies": { - "punycode": "2.1.0" + "bin": { + "fxparser": "src/cli/cli.js" }, - "engines": { - "node": ">=4.0.0" + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" } }, - "node_modules/idna-uts46-hx/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==", - "engines": { - "node": ">=6" + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "url": "https://github.com/sponsors/jimmywarting" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "paypal", + "url": "https://paypal.me/jimmywarting" } - ] - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, "engines": { - "node": ">= 4" + "node": "^12.20 || >= 14.13" } }, - "node_modules/immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" - }, - "node_modules/immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", - "dev": true - }, - "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==", + "node_modules/figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", "dev": true, "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" }, "engines": { - "node": ">=6" + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "node_modules/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, "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "flat-cache": "^3.0.4" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", "dev": true, "engines": { - "node": ">=0.8.19" + "node": ">= 6" } }, - "node_modules/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==", + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/inflation": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", - "integrity": "sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==", + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.8" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "ms": "2.0.0" } }, - "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/ini": { + "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/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, + "dependencies": { + "array-back": "^3.0.1" + }, "engines": { - "node": ">=10" + "node": ">=4.0.0" } }, - "node_modules/inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", + "node_modules/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==", + "dev": true, "dependencies": { - "source-map": "~0.5.3" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inline-source-map/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" } }, - "node_modules/inquirer": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.1.4.tgz", - "integrity": "sha512-9hiJxE5gkK/cM2d1mTEnuurGTAoHebbkX0BYl3h7iEg7FYfuNIom+nDfBCSWtvSnoSrWCeBxqqBZu26xdlJlXA==", + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "dependencies": { - "ansi-escapes": "^6.0.0", - "chalk": "^5.1.2", - "cli-cursor": "^4.0.0", - "cli-width": "^4.0.0", - "external-editor": "^3.0.3", - "figures": "^5.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^6.1.2", - "run-async": "^2.4.0", - "rxjs": "^7.5.7", - "string-width": "^5.1.2", - "strip-ansi": "^7.0.1", - "through": "^2.3.6", - "wrap-ansi": "^8.0.1" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "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 + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "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==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "engines": { - "node": ">=12.0.0" + "node": "*" } }, - "node_modules/inquirer/node_modules/ansi-escapes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.0.0.tgz", - "integrity": "sha512-IG23inYII3dWlU2EyiAiGj6Bwal5GzsgPMwjYGvc1HPE2dgbj4ZB5ToWBKSquKw74nB3TIuOwaI6/jSULzfgrw==", + "node_modules/form-data-encoder": { + "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, + "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==", "dev": true, "dependencies": { - "type-fest": "^3.0.0" + "fetch-blob": "^3.1.2" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12.20.0" } }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">= 0.6" } }, - "node_modules/inquirer/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==", + "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==", + "dev": true + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", "dev": true, "engines": { - "node": ">=12" + "node": "*" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "patreon", + "url": "https://www.patreon.com/infusion" } }, - "node_modules/inquirer/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">= 0.6" } }, - "node_modules/inquirer/node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "dev": true + }, + "node_modules/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, "dependencies": { - "restore-cursor": "^4.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6 <7 || >=8" } }, - "node_modules/inquirer/node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, + "node_modules/fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, + "minipass": "^2.6.0" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.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==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "readable-stream": "1.1.x", + "xregexp": "2.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=0.8.0" } }, - "node_modules/inquirer/node_modules/type-fest": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.6.1.tgz", - "integrity": "sha512-htXWckxlT6U4+ilVgweNliPqlsVSSucbxVexRYllyMVJDtf5rTjv6kF/s+qAd4QSL1BZcnJPEJavYBPQiWuZDA==", + "node_modules/ftp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/ftp/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/inquirer/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/ftp/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dev": true, "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/insert-module-globals": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", - "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + }, + "node_modules/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, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ganache": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/ganache/-/ganache-7.7.7.tgz", + "integrity": "sha512-kZUuOcgDQBtbxzs4iB3chg1iAc28s2ffdOdzyTTzo4vr9sb843w4PbWd5v1hsIqtcNjurcpLaW8XRp/cw2u++g==", + "bundleDependencies": [ + "@trufflesuite/bigint-buffer", + "keccak", + "leveldown", + "secp256k1" + ], + "dev": true, + "hasShrinkwrap": true, "dependencies": { - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "JSONStream": "^1.0.3", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" + "@trufflesuite/bigint-buffer": "1.1.10", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "5.1.1", + "@types/seedrandom": "3.0.1", + "abstract-level": "1.0.3", + "abstract-leveldown": "7.2.0", + "async-eventemitter": "0.2.4", + "emittery": "0.10.0", + "keccak": "3.0.2", + "leveldown": "6.1.0", + "secp256k1": "4.0.3" }, "bin": { - "insert-module-globals": "bin/cmd.js" - } - }, - "node_modules/insert-module-globals/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/int64-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-1.0.1.tgz", - "integrity": "sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw==", - "engines": { - "node": ">= 4.5.0" + "ganache": "dist/node/cli.js", + "ganache-cli": "dist/node/cli.js" + }, + "optionalDependencies": { + "bufferutil": "4.0.5", + "utf-8-validate": "5.0.7" } }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz", + "integrity": "sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw==", "dev": true, + "hasInstallScript": true, + "inBundle": true, + "license": "Apache-2.0", "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "node-gyp-build": "4.4.0" }, "engines": { - "node": ">= 0.4" - } - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" + "node": ">= 14.0.0" } }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer/node_modules/node-gyp-build": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", + "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" + "inBundle": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/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==", + "node_modules/ganache/node_modules/@types/bn.js": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", + "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", "dev": true, "dependencies": { - "fp-ts": "^1.0.0" + "@types/node": "*" } }, - "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "node_modules/ganache/node_modules/@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", "dev": true }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } + "node_modules/ganache/node_modules/@types/node": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", + "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", + "dev": true }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/ganache/node_modules/@types/seedrandom": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.1.tgz", + "integrity": "sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw==", + "dev": true }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "node_modules/ganache/node_modules/abstract-level": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", + "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "node_modules/ganache/node_modules/abstract-level/node_modules/level-supports": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", "dev": true }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/ganache/node_modules/abstract-leveldown": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", + "integrity": "sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==", "dev": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "buffer": "^6.0.3", + "catering": "^2.0.0", + "is-buffer": "^2.0.5", + "level-concat-iterator": "^3.0.0", + "level-supports": "^2.0.1", + "queue-microtask": "^1.2.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10" } }, - "node_modules/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==", + "node_modules/ganache/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" + "lodash": "^4.17.14" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "node_modules/ganache/node_modules/async-eventemitter": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", + "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "async": "^2.4.0" } }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "node_modules/ganache/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": [ { @@ -18699,4399 +13607,4525 @@ "url": "https://feross.org/support" } ], - "engines": { - "node": ">=4" - } - }, - "node_modules/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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "inBundle": true, + "license": "MIT" }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "node_modules/ganache/node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } + "inBundle": true, + "license": "MIT" }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "node_modules/ganache/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" + } + ], + "inBundle": true, + "license": "MIT", "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "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==", + "node_modules/ganache/node_modules/bufferutil": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", + "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", "dev": true, + "hasInstallScript": true, + "optional": true, "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node-gyp-build": "^4.3.0" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "node_modules/ganache/node_modules/catering": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.0.tgz", + "integrity": "sha512-M5imwzQn6y+ODBfgi+cfgZv2hIUI6oYU/0f35Mdb1ujGeqeoI5tOnl9Q13DTH7LW+7er+NYq8stNOKZD/Z3U/A==", "dev": true, - "bin": { - "is-docker": "cli.js" + "inBundle": true, + "license": "MIT", + "dependencies": { + "queue-tick": "^1.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/ganache/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==", "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz", - "integrity": "sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg==", - "engines": { - "node": ">=0.10.0" + "inBundle": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, - "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==", + "node_modules/ganache/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==", "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "inBundle": true, + "license": "MIT" }, - "node_modules/is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + "node_modules/ganache/node_modules/emittery": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", + "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", + "dev": true }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "node_modules/ganache/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==", "dev": true, - "engines": { - "node": ">=6" - } - }, - "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==", + "inBundle": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/ganache/node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/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==", - "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "node_modules/ganache/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, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "BSD-3-Clause" }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "node_modules/ganache/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "inBundle": true, + "license": "ISC" }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "node_modules/ganache/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" } }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "node_modules/ganache/node_modules/keccak": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", + "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", + "dev": true, + "hasInstallScript": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10.0.0" } }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "node_modules/ganache/node_modules/level-concat-iterator": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz", + "integrity": "sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==", "dev": true, - "engines": { - "node": ">= 0.4" + "inBundle": true, + "license": "MIT", + "dependencies": { + "catering": "^2.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10" } }, - "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "node_modules/ganache/node_modules/level-supports": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz", + "integrity": "sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==", "dev": true, + "inBundle": true, + "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "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==", + "node_modules/ganache/node_modules/level-transcoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", "dev": true, - "engines": { - "node": ">=0.12.0" + "dependencies": { + "buffer": "^6.0.3", + "module-error": "^1.0.1" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/ganache/node_modules/leveldown": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-6.1.0.tgz", + "integrity": "sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w==", "dev": true, + "hasInstallScript": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "abstract-leveldown": "^7.2.0", + "napi-macros": "~2.0.0", + "node-gyp-build": "^4.3.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10.12.0" } }, - "node_modules/is-obj": { + "node_modules/ganache/node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/ganache/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==", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/ganache/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": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/module-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", + "dev": true + }, + "node_modules/ganache/node_modules/napi-macros": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", "dev": true, - "engines": { - "node": ">=8" - } + "inBundle": true, + "license": "MIT" }, - "node_modules/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==", + "node_modules/ganache/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==", "dev": true, - "engines": { - "node": ">=8" - } + "inBundle": true, + "license": "MIT" }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "node_modules/ganache/node_modules/node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "inBundle": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/ganache/node_modules/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, - "engines": { - "node": ">=0.10.0" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/ganache/node_modules/queue-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.0.tgz", + "integrity": "sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "node_modules/ganache/node_modules/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==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/ganache/node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "dev": true, + "hasInstallScript": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "node_modules/ganache/node_modules/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==", "dev": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "safe-buffer": "~5.2.0" } }, - "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "node_modules/ganache/node_modules/utf-8-validate": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", + "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", "dev": true, + "hasInstallScript": true, + "optional": true, "dependencies": { - "protocols": "^2.0.1" + "node-gyp-build": "^4.3.0" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/ganache/node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, + "node_modules/get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + }, + "node_modules/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==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "*" } }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "engines": { - "node": ">=12" + "node": ">=8.0.0" + } + }, + "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==", + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true, - "peer": true - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "dev": true, - "peer": true - }, - "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==", + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/get-tsconfig": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.4.0.tgz", + "integrity": "sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ==", "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "node_modules/get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, "engines": { - "node": ">=12" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "peerDependencies": { - "ws": "*" + "node": ">= 6" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "node_modules/get-uri/node_modules/data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" + "assert-plus": "^1.0.0" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/git-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" + "node_modules/git-url-parse": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", + "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", + "dev": true, + "dependencies": { + "git-up": "^7.0.0" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "node_modules/glob": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.0.tgz", + "integrity": "sha512-EAZejC7JvnQINayvB/7BJbpZpNOJ8Lrw2OZNEvQxe0vaLn1SuwMcfV7/MNaX8L/T0wmptBFI4YMtDvSBxYDc7w==", "dev": true, "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "fs.realpath": "^1.0.0", + "minimatch": "^7.4.1", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "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==", "dev": true, "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=8" + "node": ">=10.13.0" } }, - "node_modules/iterate-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", - "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", + "node_modules/glob/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, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/iterate-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", - "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "node_modules/glob/node_modules/minimatch": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.2.tgz", + "integrity": "sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==", "dev": true, "dependencies": { - "es-get-iterator": "^1.0.2", - "iterate-iterator": "^1.0.1" + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jayson": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/jayson/-/jayson-3.7.0.tgz", - "integrity": "sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ==", + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", "dependencies": { - "@types/connect": "^3.4.33", - "@types/node": "^12.12.54", - "@types/ws": "^7.4.4", - "commander": "^2.20.3", - "delay": "^5.0.0", - "es6-promisify": "^5.0.0", - "eyes": "^0.1.8", - "isomorphic-ws": "^4.0.1", - "json-stringify-safe": "^5.0.1", - "JSONStream": "^1.3.5", - "lodash": "^4.17.20", - "uuid": "^8.3.2", - "ws": "^7.4.5" - }, - "bin": { - "jayson": "bin/jayson.js" - }, - "engines": { - "node": ">=8" + "min-document": "^2.19.0", + "process": "^0.11.10" } }, - "node_modules/jayson/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" - }, - "node_modules/jayson/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", "dev": true, "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", - "import-local": "^3.0.2", - "jest-cli": "^29.5.0" - }, - "bin": { - "jest": "bin/jest.js" + "ini": "2.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": ">=10" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-changed-files": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", - "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "dependencies": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" + "type-fest": "^0.20.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "node": ">=8" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-cli": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, "dependencies": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" + "define-properties": "^1.1.3" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-config": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=10" }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-config/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/got": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.0.tgz", + "integrity": "sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==", "dev": true, "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" + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "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": "^3.0.0" }, "engines": { - "node": "*" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "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==" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "node_modules/jest-docblock": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", - "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", - "dev": true, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", "dependencies": { - "detect-newline": "^3.0.0" + "ajv": "^6.12.3", + "har-schema": "^2.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6" } }, - "node_modules/jest-each": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "node_modules/hardhat": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", + "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-vm": "^6.0.0", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "abort-controller": "^3.0.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "chokidar": "^3.4.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": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "qs": "^6.7.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "bin": { + "hardhat": "internal/cli/bootstrap.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=14.0.0" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } } }, - "node_modules/jest-environment-node": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "node_modules/hardhat/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, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "color-convert": "^1.9.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "node_modules/hardhat/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "node_modules/hardhat/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==", + "dev": true + }, + "node_modules/hardhat/node_modules/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, "dependencies": { - "@jest/types": "^29.5.0", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "color-name": "1.1.3" } }, - "node_modules/jest-leak-detector": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "node_modules/hardhat/node_modules/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 + }, + "node_modules/hardhat/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, - "dependencies": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.8.0" } }, - "node_modules/jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "node_modules/hardhat/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "locate-path": "^2.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "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==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6 <7 || >=8" } }, - "node_modules/jest-mock": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "node_modules/hardhat/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "jest-util": "^29.5.0" + "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" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" + "node": "*" }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/jest-regex-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", - "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "node_modules/hardhat/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, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "node_modules/hardhat/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/jest-resolve-dependencies": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "node_modules/hardhat/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "dependencies": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" + "p-try": "^1.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/jest-runner": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "node_modules/hardhat/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" + "p-limit": "^1.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "node": ">=4" } }, - "node_modules/jest-runtime": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", + "node_modules/hardhat/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "dev": true, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/jest-runtime/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/hardhat/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, - "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": ">=4" } }, - "node_modules/jest-snapshot": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "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==", "dev": true, "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.5.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" + "path-parse": "^1.0.6" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "node_modules/hardhat/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/hardhat/node_modules/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, "dependencies": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "has-flag": "^3.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/jest-validate": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", - "dev": true, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dependencies": { - "@jest/types": "^29.5.0", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "leven": "^3.1.0", - "pretty-format": "^29.5.0" + "function-bind": "^1.1.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4.0" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "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, - "engines": { - "node": ">=10" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-watcher": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.5.0", - "string-length": "^4.0.1" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", - "dev": true, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dependencies": { - "@types/node": "*", - "jest-util": "^29.5.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "get-intrinsic": "^1.1.1" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-worker/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==", + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jose": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.6.tgz", - "integrity": "sha512-FVoPY7SflDodE4lknJmbAHSUjLCzE2H1F6MS0RYKMQ8SR+lNccpMf8R4eqkNYyyUjR5qZReOzZo5C5YiHOCjjg==", + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dependencies": { - "@panva/asn1.js": "^1.0.0" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=10.13.0 < 13 || >=13.7.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/panva" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==" + "node_modules/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==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "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==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, + "bin": { + "he": "bin/he" + } + }, + "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==", "dependencies": { - "argparse": "^2.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/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==" + }, + "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==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">= 0.8" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + "node_modules/http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">=8.0.0" } }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, - "peer": true, "dependencies": { - "bignumber.js": "^9.0.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/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==" - }, - "node_modules/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 - }, - "node_modules/json-rpc-engine": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz", - "integrity": "sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==", + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, "dependencies": { - "@metamask/safe-event-emitter": "^2.0.0", - "eth-rpc-errors": "^4.0.2" + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" }, "engines": { - "node": ">=10.0.0" + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, - "node_modules/json-rpc-engine/node_modules/eth-rpc-errors": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz", - "integrity": "sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==", + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dependencies": { - "fast-safe-stringify": "^2.0.6" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "node_modules/json-rpc-random-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", - "integrity": "sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/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==" - }, - "node_modules/json-stable-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz", - "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==", + "node_modules/http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", "dependencies": { - "jsonify": "^0.0.1" + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10.19.0" } }, - "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 + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" }, - "node_modules/json-stringify-safe": { + "node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" } }, - "node_modules/jsonify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": { + "ms": "^2.0.0" } }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/jsonschema": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz", - "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==", + "node_modules/husky": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, "engines": { - "node": "*" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" } }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "node_modules/iconoir": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/iconoir/-/iconoir-5.5.2.tgz", + "integrity": "sha512-198g3lHrs1nMr4FBfJL3cBMl89NhJat342c684JVYJPlPpjFY2RBZAzD/rpAtg8LIOGXzNjcZzIb+IQCfY4Dqw==" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "node_modules/idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", "dependencies": { - "jws": "^3.2.2", - "lodash": "^4.17.21", - "ms": "^2.1.1", - "semver": "^7.3.8" + "punycode": "2.1.0" }, "engines": { - "node": ">=12", - "npm": ">=6" + "node": ">=4.0.0" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, + "node_modules/idna-uts46-hx/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==", "engines": { - "node": ">=0.6.0" + "node": ">=6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" } }, - "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" }, - "node_modules/jwks-rsa": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-2.1.5.tgz", - "integrity": "sha512-IODtn1SwEm7n6GQZnQLY0oxKDrMh7n/jRH1MzE8mlxWMrh2NnMyOsXTebu8vJ1qCpmuTJcL4DdiE0E4h8jnwsA==", + "node_modules/immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", + "dev": true + }, + "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==", + "dev": true, "dependencies": { - "@types/express": "^4.17.14", - "@types/jsonwebtoken": "^8.5.9", - "debug": "^4.3.4", - "jose": "^2.0.6", - "limiter": "^1.1.5", - "lru-memoizer": "^2.1.4" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=10 < 13 || >=14" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/keccak": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", - "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", - "hasInstallScript": true, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dependencies": { - "json-buffer": "3.0.1" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/keyvaluestorage-interface": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz", - "integrity": "sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==" - }, - "node_modules/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==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.19" } }, - "node_modules/klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "node_modules/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==", "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.9" + "engines": { + "node": ">=8" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, + "node_modules/inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==", "engines": { - "node": ">=6" + "node": ">= 0.8.0" } }, - "node_modules/labeled-stream-splicer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", - "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { - "inherits": "^2.0.1", - "stream-splicer": "^2.0.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/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==", + "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/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "dev": true, - "dependencies": { - "package-json": "^8.1.0" - }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", - "dev": true, - "peer": true, + "node_modules/inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", "dependencies": { - "invert-kv": "^1.0.0" - }, + "source-map": "~0.5.3" + } + }, + "node_modules/inline-source-map/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "engines": { "node": ">=0.10.0" } }, - "node_modules/level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", + "node_modules/inquirer": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.1.4.tgz", + "integrity": "sha512-9hiJxE5gkK/cM2d1mTEnuurGTAoHebbkX0BYl3h7iEg7FYfuNIom+nDfBCSWtvSnoSrWCeBxqqBZu26xdlJlXA==", "dev": true, "dependencies": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" + "ansi-escapes": "^6.0.0", + "chalk": "^5.1.2", + "cli-cursor": "^4.0.0", + "cli-width": "^4.0.0", + "external-editor": "^3.0.3", + "figures": "^5.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^6.1.2", + "run-async": "^2.4.0", + "rxjs": "^7.5.7", + "string-width": "^5.1.2", + "strip-ansi": "^7.0.1", + "through": "^2.3.6", + "wrap-ansi": "^8.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" + "node": ">=12.0.0" } }, - "node_modules/level-codec": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz", - "integrity": "sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==", + "node_modules/inquirer/node_modules/ansi-escapes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.0.0.tgz", + "integrity": "sha512-IG23inYII3dWlU2EyiAiGj6Bwal5GzsgPMwjYGvc1HPE2dgbj4ZB5ToWBKSquKw74nB3TIuOwaI6/jSULzfgrw==", "dev": true, - "peer": true, "dependencies": { - "buffer": "^5.6.0" + "type-fest": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/level-codec/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "node_modules/inquirer/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "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" - } - ], - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/level-concat-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz", - "integrity": "sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==", + "node_modules/inquirer/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, - "peer": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/level-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz", - "integrity": "sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==", + "node_modules/inquirer/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", "dev": true, - "peer": true, - "dependencies": { - "errno": "~0.1.1" - }, "engines": { - "node": ">=6" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/level-iterator-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz", - "integrity": "sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==", + "node_modules/inquirer/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, - "peer": true, "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.4.0", - "xtend": "^4.0.2" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/level-mem": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz", - "integrity": "sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg==", + "node_modules/inquirer/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, - "peer": true, "dependencies": { - "level-packager": "^5.0.3", - "memdown": "^5.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/level-packager": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz", - "integrity": "sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==", + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, - "peer": true, "dependencies": { - "encoding-down": "^6.3.0", - "levelup": "^4.3.2" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", + "node_modules/inquirer/node_modules/type-fest": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.6.1.tgz", + "integrity": "sha512-htXWckxlT6U4+ilVgweNliPqlsVSSucbxVexRYllyMVJDtf5rTjv6kF/s+qAd4QSL1BZcnJPEJavYBPQiWuZDA==", "dev": true, "engines": { - "node": ">=12" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", + "node_modules/inquirer/node_modules/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, "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/level-ws": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz", - "integrity": "sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA==", - "dev": true, - "peer": true, + "node_modules/insert-module-globals": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", + "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^3.1.0", - "xtend": "^4.0.1" + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" }, + "bin": { + "insert-module-globals": "bin/cmd.js" + } + }, + "node_modules/insert-module-globals/node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/int64-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-1.0.1.tgz", + "integrity": "sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw==", "engines": { - "node": ">=6" + "node": ">= 4.5.0" } }, - "node_modules/levelup": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz", - "integrity": "sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==", + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, - "peer": true, "dependencies": { - "deferred-leveldown": "~5.3.0", - "level-errors": "~2.0.0", - "level-iterator-stream": "~4.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" }, "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/levelup/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", - "dev": true, - "peer": true, - "dependencies": { - "xtend": "^4.0.2" - }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, "engines": { - "node": ">=6" + "node": ">= 0.10" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/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==", "dev": true, "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" + "fp-ts": "^1.0.0" } }, - "node_modules/libphonenumber-js": { - "version": "1.10.24", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.24.tgz", - "integrity": "sha512-3Dk8f5AmrcWqg+oHhmm9hwSTqpWHBdSqsHmjCJGroULFubi0+x7JEIGmRZCuL3TI8Tx39xaKqfnhsDQ4ALa/Nw==" + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "engines": { - "node": ">=10" + "node": ">= 0.10" } }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" - }, - "node_modules/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 + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/lint-staged": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.0.tgz", - "integrity": "sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==", + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "dependencies": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", - "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.1" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" }, - "engines": { - "node": "^14.13.1 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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 + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" }, "funding": { - "url": "https://opencollective.com/lint-staged" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "node_modules/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==", "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "dependencies": { + "binary-extensions": "^2.0.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/lint-staged/node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lint-staged/node_modules/human-signals": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.0.tgz", - "integrity": "sha512-zyzVyMjpGBX2+6cDVZeFPCdtOtdsxOeseRhB9tkQ6xXmGUNrcnBzdEKPy3VPNYz+4gy1oukVOXcrJCunSyc6QQ==", + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", "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" + } + ], "engines": { - "node": ">=14.18.0" + "node": ">=4" } }, - "node_modules/lint-staged/node_modules/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, + "node_modules/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==", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lint-staged/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "ci-info": "^3.2.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "is-ci": "bin.js" } }, - "node_modules/lint-staged/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "has": "^1.0.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lint-staged/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "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==", "dev": true, "dependencies": { - "mimic-fn": "^4.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lint-staged/node_modules/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==", + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, + "bin": { + "is-docker": "cli.js" + }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lint-staged/node_modules/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==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/listr2": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", - "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", - "dev": true, - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, + "node_modules/is-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz", + "integrity": "sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg==", "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/listr2/node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "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, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/listr2/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==", - "dev": true + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" }, - "node_modules/listr2/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==", + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/listr2/node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, + "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==", "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/listr2/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==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "engines": { + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "dev": true, - "peer": true, "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, - "peer": true, - "dependencies": { - "error-ex": "^1.2.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/load-json-file/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", - "dev": true, - "peer": true, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", "dependencies": { - "is-utf8": "^0.2.0" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/local-pkg": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", - "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, "engines": { - "node": ">=14" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/localtunnel": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", - "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", "dev": true, - "dependencies": { - "axios": "0.21.4", - "debug": "4.3.2", - "openurl": "1.1.1", - "yargs": "17.1.1" - }, - "bin": { - "lt": "bin/lt.js" - }, "engines": { - "node": ">=8.3.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/localtunnel/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "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==", "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "engines": { + "node": ">=0.12.0" } }, - "node_modules/localtunnel/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "dependencies": { - "ms": "2.1.2" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=6.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/localtunnel/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==", - "dev": true - }, - "node_modules/localtunnel/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==", + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/localtunnel/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==", + "node_modules/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, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { "node": ">=8" } }, - "node_modules/localtunnel/node_modules/yargs": { - "version": "17.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", - "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/localtunnel/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/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==", + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "dependencies": { - "p-locate": "^5.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==", + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", "dev": true, - "peer": true - }, - "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 - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "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 + "node_modules/is-ssh": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "dev": true, + "dependencies": { + "protocols": "^2.0.1" + } }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "peer": true + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/log-update/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==", - "dev": true + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, - "node_modules/log-update/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==", + "node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/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==", + "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==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" + "call-bind": "^1.0.2" }, "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/log-update/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==", + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "is-docker": "^2.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, - "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dependencies": { - "get-func-name": "^2.0.0" - } + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "peerDependencies": { + "ws": "*" } }, - "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==", - "dev": true + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/lru-memoizer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.2.0.tgz", - "integrity": "sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==", + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "~4.0.0" + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/lru-memoizer/node_modules/lru-cache": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", - "integrity": "sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==", - "dependencies": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/lru-memoizer/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - }, - "node_modules/ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==" - }, - "node_modules/macos-release": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.1.0.tgz", - "integrity": "sha512-/M/R0gCDgM+Cv1IuBG1XGdfTFnMEG6PZeT+KGWHO/OG+imqmaD9CH5vHBTycEM3+Kc4uG2Il+tFAuUWLqQOeUA==", + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, "dependencies": { - "sourcemap-codec": "^1.4.8" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { "node": ">=8" - }, + } + }, + "node_modules/iterate-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", + "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", + "dev": true, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", "dev": true, + "dependencies": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jayson": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-3.7.0.tgz", + "integrity": "sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ==", + "dependencies": { + "@types/connect": "^3.4.33", + "@types/node": "^12.12.54", + "@types/ws": "^7.4.4", + "commander": "^2.20.3", + "delay": "^5.0.0", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "isomorphic-ws": "^4.0.1", + "json-stringify-safe": "^5.0.1", + "JSONStream": "^1.3.5", + "lodash": "^4.17.20", + "uuid": "^8.3.2", + "ws": "^7.4.5" + }, "bin": { - "semver": "bin/semver.js" + "jayson": "bin/jayson.js" + }, + "engines": { + "node": ">=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==", - "dev": true + "node_modules/jayson/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "node_modules/jayson/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", "dev": true, "dependencies": { - "tmpl": "1.0.5" + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", + "import-local": "^3.0.2", + "jest-cli": "^29.5.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", - "dev": true - }, - "node_modules/markdown-table": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", - "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", + "node_modules/jest-changed-files": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", "dev": true, - "peer": true + "dependencies": { + "execa": "^5.0.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/mcl-wasm": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", + "node_modules/jest-circus": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", + "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", "dev": true, + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.5.0", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.5.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, "engines": { - "node": ">=8.9.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/jest-cli": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", + "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "dev": true, "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "@jest/core": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "node_modules/jest-config": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", + "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.5.0", + "@jest/types": "^29.5.0", + "babel-jest": "^29.5.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.5.0", + "jest-environment-node": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">= 0.6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/memdown": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz", - "integrity": "sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw==", + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "dependencies": { - "abstract-leveldown": "~6.2.1", - "functional-red-black-tree": "~1.0.1", - "immediate": "~3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.2.0" + "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": ">=6" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/memdown/node_modules/abstract-leveldown": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz", - "integrity": "sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==", + "node_modules/jest-diff": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", + "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", "dev": true, - "peer": true, "dependencies": { - "buffer": "^5.5.0", - "immediate": "^3.2.3", - "level-concat-iterator": "~2.0.0", - "level-supports": "~1.0.0", - "xtend": "~4.0.0" + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" }, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/memdown/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "node_modules/jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", "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" - } - ], - "peer": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/memdown/node_modules/immediate": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz", - "integrity": "sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg==", - "dev": true, - "peer": true - }, - "node_modules/memdown/node_modules/level-supports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz", - "integrity": "sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==", + "node_modules/jest-each": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", + "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", "dev": true, - "peer": true, "dependencies": { - "xtend": "^4.0.2" + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.5.0", + "pretty-format": "^29.5.0" }, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/memory-level": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", - "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", + "node_modules/jest-environment-node": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", + "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", "dev": true, "dependencies": { - "abstract-level": "^1.0.0", - "functional-red-black-tree": "^1.0.1", - "module-error": "^1.0.1" + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" }, "engines": { - "node": ">=12" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", "dev": true, "engines": { - "node": ">= 0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/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 - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/jest-haste-map": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", + "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", "dev": true, + "dependencies": { + "@jest/types": "^29.5.0", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, "engines": { - "node": ">= 8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/merkle-lib": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", - "integrity": "sha512-XrNQvUbn1DL5hKNe46Ccs+Tu3/PYOlrcZILuGUhb95oKBPjc/nmIC8D462PQkipVDGKRvwhn+QFg2cCdIvmDJA==" + "node_modules/jest-leak-detector": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", + "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/merkle-patricia-tree": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz", - "integrity": "sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w==", + "node_modules/jest-matcher-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", + "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", "dev": true, - "peer": true, "dependencies": { - "@types/levelup": "^4.3.0", - "ethereumjs-util": "^7.1.4", - "level-mem": "^5.0.1", - "level-ws": "^2.0.0", - "readable-stream": "^3.6.0", - "semaphore-async-await": "^1.5.1" + "chalk": "^4.0.0", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/merkle-patricia-tree/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==", + "node_modules/jest-message-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", + "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", "dev": true, - "peer": 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" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.5.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/merkle-patricia-tree/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "node_modules/jest-mock": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", + "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", "dev": true, - "peer": true, "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-util": "^29.5.0" }, "engines": { - "node": ">=10.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/jest-resolve": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", + "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", "dev": true, "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=8.6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "node_modules/jest-resolve-dependencies": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", + "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "dev": true, "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/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/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.5.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/jest-runner": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", + "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "dev": true, "dependencies": { - "mime-db": "1.52.0" + "@jest/console": "^29.5.0", + "@jest/environment": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-leak-detector": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-resolve": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-util": "^29.5.0", + "jest-watcher": "^29.5.0", + "jest-worker": "^29.5.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" }, "engines": { - "node": ">= 0.6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/mimic-response": { - "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==", + "node_modules/jest-runtime": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", + "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", "dependencies": { - "dom-walk": "^0.1.0" + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/globals": "^29.5.0", + "@jest/source-map": "^29.4.3", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==" - }, - "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==" - }, - "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/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "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": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", + "node_modules/jest-snapshot": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", + "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.5.0", + "semver": "^7.3.5" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "node_modules/jest-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", + "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "dev": true, "dependencies": { - "minipass": "^2.9.0" + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/minizlib/node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "node_modules/jest-validate": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", + "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "dev": true, "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "@jest/types": "^29.5.0", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "node_modules/mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", - "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", + "node_modules/jest-watcher": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", + "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "dev": true, "dependencies": { - "mkdirp": "*" + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.5.0", + "string-length": "^4.0.1" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/mnemonist": { - "version": "0.38.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", - "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", + "node_modules/jest-worker": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", "dev": true, "dependencies": { - "obliterator": "^2.0.0" + "@types/node": "*", + "jest-util": "^29.5.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.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==", + "node_modules/jest-worker/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==", "dev": true, "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" + "has-flag": "^4.0.0" }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jose": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.6.tgz", + "integrity": "sha512-FVoPY7SflDodE4lknJmbAHSUjLCzE2H1F6MS0RYKMQ8SR+lNccpMf8R4eqkNYyyUjR5qZReOzZo5C5YiHOCjjg==", + "dependencies": { + "@panva/asn1.js": "^1.0.0" }, "engines": { - "node": ">= 14.0.0" + "node": ">=10.13.0 < 13 || >=13.7.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "url": "https://github.com/sponsors/panva" } }, - "node_modules/mocha/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==", + "node_modules/js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", "dev": true, - "engines": { - "node": ">=6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" } }, - "node_modules/mocha/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "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==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "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==", - "dev": true, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, "engines": { - "node": ">=0.3.1" + "node": ">=4" } }, - "node_modules/mocha/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==", + "node_modules/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==" + }, + "node_modules/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 }, - "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, + "node_modules/json-rpc-engine": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz", + "integrity": "sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==", "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" + "@metamask/safe-event-emitter": "^2.0.0", + "eth-rpc-errors": "^4.0.2" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10.0.0" } }, - "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==", - "dev": true, + "node_modules/json-rpc-engine/node_modules/eth-rpc-errors": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz", + "integrity": "sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "fast-safe-stringify": "^2.0.6" } }, - "node_modules/mocha/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, - "engines": { - "node": ">=8" - } + "node_modules/json-rpc-random-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", + "integrity": "sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==" }, - "node_modules/mocha/node_modules/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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, - "node_modules/mocha/node_modules/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==", - "dev": true, + "node_modules/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==" + }, + "node_modules/json-stable-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz", + "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" + "jsonify": "^0.0.1" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mocha/node_modules/minimatch": { + "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 + }, + "node_modules/json-stringify-safe": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "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==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/mocha/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==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/jsonschema": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz", + "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==", "engines": { - "node": ">=8" + "node": "*" } }, - "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==", - "dev": true, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dependencies": { - "has-flag": "^4.0.0" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" }, - "engines": { - "node": ">=10" + "bin": { + "JSONStream": "bin.js" }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "engines": { + "node": "*" } }, - "node_modules/mocha/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, + "node_modules/jsonwebtoken": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" }, "engines": { - "node": ">=10" + "node": ">=12", + "npm": ">=6" } }, - "node_modules/mocha/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==", - "dev": true, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, "engines": { - "node": ">=10" + "node": ">=0.6.0" } }, - "node_modules/mock-fs": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", - "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" - }, - "node_modules/modern-node-polyfills": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/modern-node-polyfills/-/modern-node-polyfills-0.1.0.tgz", - "integrity": "sha512-/Z9mlC56KBxjLZvdNSLqSEFw9jSav43dsUxhLYLN3bZgcSX5VFdixat+QGjb/4NxaGCwW09ABJhZA5oHFj4W4A==", - "dev": true, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", "dependencies": { - "@jspm/core": "2.0.0-beta.24", - "@rollup/plugin-inject": "^4.0.4", - "acorn": "^8.8.0", - "esbuild": "^0.14.47", - "local-pkg": "^0.4.1", - "rollup": "^2.75.7" + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" } }, - "node_modules/modern-node-polyfills/node_modules/@esbuild/linux-loong64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", - "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/jwks-rsa": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-2.1.5.tgz", + "integrity": "sha512-IODtn1SwEm7n6GQZnQLY0oxKDrMh7n/jRH1MzE8mlxWMrh2NnMyOsXTebu8vJ1qCpmuTJcL4DdiE0E4h8jnwsA==", + "dependencies": { + "@types/express": "^4.17.14", + "@types/jsonwebtoken": "^8.5.9", + "debug": "^4.3.4", + "jose": "^2.0.6", + "limiter": "^1.1.5", + "lru-memoizer": "^2.1.4" + }, "engines": { - "node": ">=12" + "node": ">=10 < 13 || >=14" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", - "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", - "dev": true, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/keccak": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", + "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/linux-loong64": "0.14.54", - "esbuild-android-64": "0.14.54", - "esbuild-android-arm64": "0.14.54", - "esbuild-darwin-64": "0.14.54", - "esbuild-darwin-arm64": "0.14.54", - "esbuild-freebsd-64": "0.14.54", - "esbuild-freebsd-arm64": "0.14.54", - "esbuild-linux-32": "0.14.54", - "esbuild-linux-64": "0.14.54", - "esbuild-linux-arm": "0.14.54", - "esbuild-linux-arm64": "0.14.54", - "esbuild-linux-mips64le": "0.14.54", - "esbuild-linux-ppc64le": "0.14.54", - "esbuild-linux-riscv64": "0.14.54", - "esbuild-linux-s390x": "0.14.54", - "esbuild-netbsd-64": "0.14.54", - "esbuild-openbsd-64": "0.14.54", - "esbuild-sunos-64": "0.14.54", - "esbuild-windows-32": "0.14.54", - "esbuild-windows-64": "0.14.54", - "esbuild-windows-arm64": "0.14.54" + "node": ">=10.0.0" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-android-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", - "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "node_modules/keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dependencies": { + "json-buffer": "3.0.1" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-android-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", - "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", - "cpu": [ - "arm64" - ], + "node_modules/keyvaluestorage-interface": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz", + "integrity": "sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==" + }, + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "optionalDependencies": { + "graceful-fs": "^4.1.9" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-darwin-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", - "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", - "cpu": [ - "x64" - ], + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-darwin-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", - "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", - "cpu": [ - "arm64" - ], + "node_modules/labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "dependencies": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } + }, + "node_modules/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, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "package-json": "^8.1.0" + }, "engines": { - "node": ">=12" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-freebsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", - "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", - "cpu": [ - "x64" - ], + "node_modules/level": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" + }, "engines": { "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/level" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-freebsd-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", - "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", - "cpu": [ - "arm64" - ], + "node_modules/level-supports": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], "engines": { "node": ">=12" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-linux-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", - "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", - "cpu": [ - "ia32" - ], + "node_modules/level-transcoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "buffer": "^6.0.3", + "module-error": "^1.0.1" + }, "engines": { "node": ">=12" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-linux-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", - "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", - "cpu": [ - "x64" - ], + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-linux-arm": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", - "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", - "cpu": [ - "arm" - ], + "node_modules/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, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.8.0" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-linux-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", - "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", - "cpu": [ - "arm64" - ], + "node_modules/libphonenumber-js": { + "version": "1.10.24", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.24.tgz", + "integrity": "sha512-3Dk8f5AmrcWqg+oHhmm9hwSTqpWHBdSqsHmjCJGroULFubi0+x7JEIGmRZCuL3TI8Tx39xaKqfnhsDQ4ALa/Nw==" + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-linux-mips64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", - "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", - "cpu": [ - "mips64el" - ], + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + }, + "node_modules/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 + }, + "node_modules/lint-staged": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.0.tgz", + "integrity": "sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "chalk": "5.2.0", + "cli-truncate": "^3.1.0", + "commander": "^10.0.0", + "debug": "^4.3.4", + "execa": "^7.0.0", + "lilconfig": "2.1.0", + "listr2": "^5.0.7", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.3", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.2.1" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, "engines": { - "node": ">=12" + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-linux-ppc64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", - "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", - "cpu": [ - "ppc64" - ], + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-linux-riscv64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", - "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", - "cpu": [ - "riscv64" - ], + "node_modules/lint-staged/node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-linux-s390x": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", - "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", - "cpu": [ - "s390x" - ], + "node_modules/lint-staged/node_modules/human-signals": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.0.tgz", + "integrity": "sha512-zyzVyMjpGBX2+6cDVZeFPCdtOtdsxOeseRhB9tkQ6xXmGUNrcnBzdEKPy3VPNYz+4gy1oukVOXcrJCunSyc6QQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=14.18.0" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-netbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", - "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", - "cpu": [ - "x64" - ], + "node_modules/lint-staged/node_modules/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, - "optional": true, - "os": [ - "netbsd" - ], "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-openbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", - "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", - "cpu": [ - "x64" - ], + "node_modules/lint-staged/node_modules/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, - "optional": true, - "os": [ - "openbsd" - ], "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-sunos-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", - "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", - "cpu": [ - "x64" - ], + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "dependencies": { + "path-key": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-windows-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", - "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", - "cpu": [ - "ia32" - ], + "node_modules/lint-staged/node_modules/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, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "mimic-fn": "^4.0.0" + }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-windows-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", - "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", - "cpu": [ - "x64" - ], + "node_modules/lint-staged/node_modules/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, - "optional": true, - "os": [ - "win32" - ], "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-windows-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", - "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", - "cpu": [ - "arm64" - ], + "node_modules/lint-staged/node_modules/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, - "optional": true, - "os": [ - "win32" - ], "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/module-deps": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", - "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", + "node_modules/listr2": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "dev": true, "dependencies": { - "browser-resolve": "^2.0.0", - "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.2.0", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "JSONStream": "^1.0.3", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" + "cli-truncate": "^2.1.0", + "colorette": "^2.0.19", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.8.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" }, - "bin": { - "module-deps": "bin/cmd.js" + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/module-deps/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "node_modules/listr2/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==", + "dev": true }, - "node_modules/module-deps/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "node_modules/listr2/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, + "engines": { + "node": ">=8" } }, - "node_modules/module-deps/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/module-deps/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/listr2/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", + "node_modules/listr2/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==", "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "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/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } }, - "node_modules/multibase": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", - "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/localtunnel": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", + "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", + "dev": true, "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" + "axios": "0.21.4", + "debug": "4.3.2", + "openurl": "1.1.1", + "yargs": "17.1.1" + }, + "bin": { + "lt": "bin/lt.js" + }, + "engines": { + "node": ">=8.3.0" } }, - "node_modules/multibase/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/localtunnel/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/multicodec": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", - "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/localtunnel/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, "dependencies": { - "varint": "^5.0.0" + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/multihashes": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", - "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", - "dependencies": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" + "node_modules/localtunnel/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==", + "dev": true + }, + "node_modules/localtunnel/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, + "engines": { + "node": ">=8" } }, - "node_modules/multihashes/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/localtunnel/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==", + "dev": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/multihashes/node_modules/multibase": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", - "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/localtunnel/node_modules/yargs": { + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", + "dev": true, "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" + "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" + }, + "engines": { + "node": ">=12" } }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" - }, - "node_modules/nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" + "node_modules/localtunnel/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } }, - "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==", + "node_modules/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==", "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" + "dependencies": { + "p-locate": "^5.0.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/napi-macros": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "dev": true + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "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 }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, - "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==", + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "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 + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true, - "engines": { - "node": ">= 0.4.0" - } + "peer": true }, - "node_modules/new-github-release-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", - "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", + "node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", "dev": true, "dependencies": { - "type-fest": "^2.5.1" + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/new-github-release-url/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", "dev": true, "engines": { - "node": ">=12.20" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "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==" - }, - "node_modules/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_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, "engines": { - "node": ">=10.5.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/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==", + "node_modules/log-update/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==", + "dev": true + }, + "node_modules/log-update/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, - "peer": true, - "dependencies": { - "lodash": "^4.17.21" + "engines": { + "node": ">=8" } }, - "node_modules/node-environment-flags": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "node_modules/log-update/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, - "peer": true, "dependencies": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/node-environment-flags/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/log-update/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==", "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver" + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/node-fetch": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", - "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "node": ">=8" } }, - "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "loose-envify": "cli.js" } }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dependencies": { + "get-func-name": "^2.0.0" + } }, - "node_modules/nodemailer": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.1.tgz", - "integrity": "sha512-qHw7dOiU5UKNnQpXktdgQ1d3OFgRAekuvbJLcdG5dnEo/GtcTHRYM7+UfJARdOFU9WUQO8OiIamgWPmiSFHYAA==", + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "engines": { - "node": ">=6.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nofilter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", - "dev": true, - "engines": { - "node": ">=12.19" + "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==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" } }, - "node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", - "dev": true, - "peer": true, + "node_modules/lru-memoizer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.2.0.tgz", + "integrity": "sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==", "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "lodash.clonedeep": "^4.5.0", + "lru-cache": "~4.0.0" } }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "peer": true, + "node_modules/lru-memoizer/node_modules/lru-cache": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", + "integrity": "sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==", "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "pseudomap": "^1.0.1", + "yallist": "^2.0.0" } }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver" - } + "node_modules/lru-memoizer/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==" + }, + "node_modules/macos-release": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.1.0.tgz", + "integrity": "sha512-/M/R0gCDgM+Cv1IuBG1XGdfTFnMEG6PZeT+KGWHO/OG+imqmaD9CH5vHBTycEM3+Kc4uG2Il+tFAuUWLqQOeUA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" } }, - "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, "engines": { - "node": ">=14.16" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "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==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "tmpl": "1.0.5" } }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "node_modules/map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", + "dev": true + }, + "node_modules/mcl-wasm": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", + "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", "dev": true, - "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=8.9.0" } }, - "node_modules/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==", + "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==", "dependencies": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/number-to-bn/node_modules/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==" - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "engines": { - "node": "*" + "node": ">= 0.6" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/memory-level": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", + "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", + "dev": true, + "dependencies": { + "abstract-level": "^1.0.0", + "functional-red-black-tree": "^1.0.1", + "module-error": "^1.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "dev": true, "engines": { - "node": ">= 6" + "node": ">= 0.10.0" } }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, + "node_modules/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 + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 8" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/merkle-lib": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", + "integrity": "sha512-XrNQvUbn1DL5hKNe46Ccs+Tu3/PYOlrcZILuGUhb95oKBPjc/nmIC8D462PQkipVDGKRvwhn+QFg2cCdIvmDJA==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "engines": { - "node": ">= 0.4" + "node": ">= 0.6" } }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.6" } }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", - "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", - "dev": true, - "peer": true, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dependencies": { - "array.prototype.reduce": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.8" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "miller-rabin": "bin/miller-rabin" } }, - "node_modules/obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", - "dev": true + "node_modules/miller-rabin/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/oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", - "dependencies": { - "http-https": "^1.0.0" + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, - "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==", + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "wrappy": "1" + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, "engines": { "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "node_modules/mimic-response": { + "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, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/openurl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", - "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", - "dev": true - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", "dependencies": { - "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.3" - }, - "engines": { - "node": ">= 0.8.0" + "dom-walk": "^0.1.0" } }, - "node_modules/ora": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", - "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", - "dev": true, + "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==" + }, + "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==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "bl": "^5.0.0", - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ora/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "node_modules/minipass": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", + "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", "dev": true, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=8" } }, - "node_modules/ora/node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, + "node_modules/minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dependencies": { - "restore-cursor": "^4.0.0" + "minipass": "^2.9.0" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", + "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", + "dependencies": { + "mkdirp": "*" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, - "node_modules/ora/node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "node_modules/mnemonist": { + "version": "0.38.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", + "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", "dev": true, "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "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==", + "dev": true, + "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" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 14.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "node_modules/mocha/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==", "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=6" } }, - "node_modules/ordinal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", - "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, - "peer": true - }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "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==", "dev": true, - "peer": true, - "dependencies": { - "lcid": "^1.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=0.3.1" } }, - "node_modules/os-name": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.1.0.tgz", - "integrity": "sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==", + "node_modules/mocha/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==", + "dev": true + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "dependencies": { - "macos-release": "^3.1.0", - "windows-release": "^5.0.1" + "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" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "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==", "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/p-cancelable": { + "node_modules/mocha/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "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, - "dependencies": { - "yocto-queue": "^0.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/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==", + "node_modules/mocha/node_modules/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==", "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, "engines": { "node": ">=10" }, @@ -23099,13 +18133,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/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==", + "node_modules/mocha/node_modules/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==", "dev": true, "dependencies": { - "aggregate-error": "^3.0.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { "node": ">=10" @@ -23114,648 +18149,660 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pac-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", - "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4", - "get-uri": "3", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "5", - "pac-resolver": "^5.0.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "5" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/pac-resolver": { + "node_modules/mocha/node_modules/minimatch": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", - "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dev": true, "dependencies": { - "degenerator": "^3.0.2", - "ip": "^1.1.5", - "netmask": "^2.0.2" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 8" + "node": ">=10" } }, - "node_modules/package-json": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", - "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", + "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==", "dev": true, "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "balanced-match": "^1.0.0" } }, - "node_modules/packet-reader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, - "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==", + "node_modules/mocha/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==", "dev": true, "dependencies": { - "callsites": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" - } - }, - "node_modules/parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", - "dependencies": { - "path-platform": "~0.11.15" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "node": ">=8" } }, - "node_modules/parse-cache-control": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", - "dev": true, - "peer": true - }, - "node_modules/parse-headers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" - }, - "node_modules/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==", + "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==", "dev": true, "dependencies": { - "@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" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "dependencies": { - "protocols": "^2.0.0" + "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" + }, + "engines": { + "node": ">=10" } }, - "node_modules/parse-uri": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/parse-uri/-/parse-uri-1.0.7.tgz", - "integrity": "sha512-eWuZCMKNlVkXrEoANdXxbmqhu2SQO9jUMCSpdbJDObin0JxISn6e400EWsSRbr/czdKvWKkhZnMKEGUwf/Plmg==", + "node_modules/mocha/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==", + "dev": true, "engines": { - "node": ">= 0.10" + "node": ">=10" } }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "node_modules/mock-fs": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" + }, + "node_modules/modern-node-polyfills": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/modern-node-polyfills/-/modern-node-polyfills-0.1.0.tgz", + "integrity": "sha512-/Z9mlC56KBxjLZvdNSLqSEFw9jSav43dsUxhLYLN3bZgcSX5VFdixat+QGjb/4NxaGCwW09ABJhZA5oHFj4W4A==", "dev": true, "dependencies": { - "parse-path": "^7.0.0" + "@jspm/core": "2.0.0-beta.24", + "@rollup/plugin-inject": "^4.0.4", + "acorn": "^8.8.0", + "esbuild": "^0.14.47", + "local-pkg": "^0.4.1", + "rollup": "^2.75.7" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/modern-node-polyfills/node_modules/@esbuild/linux-loong64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", + "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" - }, - "node_modules/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==", + "node_modules/modern-node-polyfills/node_modules/esbuild": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", + "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/linux-loong64": "0.14.54", + "esbuild-android-64": "0.14.54", + "esbuild-android-arm64": "0.14.54", + "esbuild-darwin-64": "0.14.54", + "esbuild-darwin-arm64": "0.14.54", + "esbuild-freebsd-64": "0.14.54", + "esbuild-freebsd-arm64": "0.14.54", + "esbuild-linux-32": "0.14.54", + "esbuild-linux-64": "0.14.54", + "esbuild-linux-arm": "0.14.54", + "esbuild-linux-arm64": "0.14.54", + "esbuild-linux-mips64le": "0.14.54", + "esbuild-linux-ppc64le": "0.14.54", + "esbuild-linux-riscv64": "0.14.54", + "esbuild-linux-s390x": "0.14.54", + "esbuild-netbsd-64": "0.14.54", + "esbuild-openbsd-64": "0.14.54", + "esbuild-sunos-64": "0.14.54", + "esbuild-windows-32": "0.14.54", + "esbuild-windows-64": "0.14.54", + "esbuild-windows-arm64": "0.14.54" } }, - "node_modules/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==", + "node_modules/modern-node-polyfills/node_modules/esbuild-android-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", + "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/modern-node-polyfills/node_modules/esbuild-android-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", + "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "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==" - }, - "node_modules/path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", + "node_modules/modern-node-polyfills/node_modules/esbuild-darwin-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", + "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 0.8.0" + "node": ">=12" } }, - "node_modules/path-scurry": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.1.tgz", - "integrity": "sha512-OW+5s+7cw6253Q4E+8qQ/u1fVvcJQCJo/VFD8pje+dbJCF1n5ZRMV2AEHbGp+5Q7jxQIYJxkHopnj6nzdGeZLA==", + "node_modules/modern-node-polyfills/node_modules/esbuild-darwin-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", + "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "lru-cache": "^7.14.1", - "minipass": "^4.0.2" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=12" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/modern-node-polyfills/node_modules/esbuild-freebsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", + "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { "node": ">=12" } }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/modern-node-polyfills/node_modules/esbuild-freebsd-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", + "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "node_modules/modern-node-polyfills/node_modules/esbuild-linux-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", + "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "*" + "node": ">=12" } }, - "node_modules/pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "node_modules/modern-node-polyfills/node_modules/esbuild-linux-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", + "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "through": "~2.3" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.12" + "node": ">=12" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "node_modules/pg": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.10.0.tgz", - "integrity": "sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==", - "dependencies": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-connection-string": "^2.5.0", - "pg-pool": "^3.6.0", - "pg-protocol": "^1.6.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" - }, + "node_modules/modern-node-polyfills/node_modules/esbuild-linux-arm": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", + "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } + "node": ">=12" } }, - "node_modules/pg-connection-string": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", - "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "node_modules/modern-node-polyfills/node_modules/esbuild-linux-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", + "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4.0.0" + "node": ">=12" } }, - "node_modules/pg-pool": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", - "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", - "peerDependencies": { - "pg": ">=8.0" + "node_modules/modern-node-polyfills/node_modules/esbuild-linux-mips64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", + "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/pg-protocol": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", - "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" - }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, + "node_modules/modern-node-polyfills/node_modules/esbuild-linux-ppc64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", + "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "dependencies": { - "split2": "^4.1.0" + "node_modules/modern-node-polyfills/node_modules/esbuild-linux-riscv64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", + "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/modern-node-polyfills/node_modules/esbuild-linux-s390x": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", + "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", + "cpu": [ + "s390x" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=12" } }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "node_modules/modern-node-polyfills/node_modules/esbuild-netbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", + "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", + "cpu": [ + "x64" + ], "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=0.10" + "node": ">=12" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/modern-node-polyfills/node_modules/esbuild-openbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", + "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", + "cpu": [ + "x64" + ], "dev": true, - "peer": true, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "node_modules/modern-node-polyfills/node_modules/esbuild-sunos-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", + "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", + "cpu": [ + "x64" + ], "dev": true, - "peer": true, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "node_modules/modern-node-polyfills/node_modules/esbuild-windows-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", + "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", + "cpu": [ + "ia32" + ], "dev": true, - "peer": true, - "dependencies": { - "pinkie": "^2.0.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "node_modules/modern-node-polyfills/node_modules/esbuild-windows-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 6" + "node": ">=12" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/modern-node-polyfills/node_modules/esbuild-windows-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", + "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, + "node_modules/module-deps": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", + "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "browser-resolve": "^2.0.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.2.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "module-deps": "bin/cmd.js" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, + "node_modules/module-deps/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/module-deps/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, + "node_modules/module-deps/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/module-deps/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "safe-buffer": "~5.1.0" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/module-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "engines": { - "node": ">=4.0.0" + "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/multibase": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" } }, - "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "node_modules/multibase/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } ], "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/postcss-load-config/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" + "node_modules/multicodec": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", + "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "varint": "^5.0.0" } }, - "node_modules/postcss-nested": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", - "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", - "dev": true, + "node_modules/multihashes": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" + "buffer": "^5.5.0", + "multibase": "^0.7.0", + "varint": "^5.0.0" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", - "dev": true, + "node_modules/multihashes/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "node_modules/multihashes/node_modules/multibase": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", + "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" + }, + "node_modules/nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" + }, + "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==", + "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -23763,1853 +18810,1831 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/postgres-array": { + "node_modules/napi-macros": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "engines": { - "node": ">=4" - } + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", + "dev": true }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "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 + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "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 + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4.0" } }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "node_modules/new-github-release-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", + "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", + "dev": true, "dependencies": { - "xtend": "^4.0.0" + "type-fest": "^2.5.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/preact": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.4.1.tgz", - "integrity": "sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q==", + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==", + "node_modules/new-github-release-url/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "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==" + }, + "node_modules/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==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], "engines": { - "node": ">= 0.8.0" + "node": ">=10.5.0" } }, - "node_modules/prettier": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", - "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", - "bin": { - "prettier": "bin-prettier.js" + "node_modules/node-fetch": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", + "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": ">=10.13.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, - "node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, + "node_modules/node-gyp-build": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + }, + "node_modules/nodemailer": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.1.tgz", + "integrity": "sha512-qHw7dOiU5UKNnQpXktdgQ1d3OFgRAekuvbJLcdG5dnEo/GtcTHRYM7+UfJARdOFU9WUQO8OiIamgWPmiSFHYAA==", "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6.0.0" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=12.19" } }, - "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==", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "engines": { - "node": ">= 0.6.0" + "node": ">=0.10.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, - "peer": true, - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/promise-to-callback": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz", - "integrity": "sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA==", - "dependencies": { - "is-fn": "^1.0.0", - "set-immediate-shim": "^1.0.1" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/promise.allsettled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.6.tgz", - "integrity": "sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==", + "node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", "dev": true, - "dependencies": { - "array.prototype.map": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "iterate-value": "^1.0.2" - }, "engines": { - "node": ">= 0.4" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "path-key": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "node_modules/proper-lockfile/node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/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 - }, - "node_modules/protobufjs": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", - "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", - "hasInstallScript": true, + "node_modules/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==", "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" + "engines": { + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true + "node_modules/number-to-bn/node_modules/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==" }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "engines": { - "node": ">= 0.10" + "node": "*" } }, - "node_modules/proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", - "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.0", - "debug": "4", - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "lru-cache": "^5.1.1", - "pac-proxy-agent": "^5.0.0", - "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^5.0.0" - }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { - "node": ">= 8" + "node": ">=0.10.0" } }, - "node_modules/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 - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" - }, - "node_modules/ps-tree": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", - "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true, - "dependencies": { - "event-stream": "=3.3.4" - }, - "bin": { - "ps-tree": "bin/ps-tree.js" - }, "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" + "node": ">= 6" } }, - "node_modules/public-encrypt/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/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "dependencies": { - "escape-goat": "^4.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=12.20" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pure-rand": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", - "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] + "node_modules/obliterator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", + "dev": true }, - "node_modules/pushdata-bitcoin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz", - "integrity": "sha512-hw7rcYTJRAl4olM8Owe8x0fBuJJ+WGbMhQuLWOXEMN3PxPCKQHRkhfL+XG0+iXUmSHjkMmb3Ba55Mt21cZc9kQ==", + "node_modules/oboe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", + "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", "dependencies": { - "bitcoin-ops": "^1.3.0" + "http-https": "^1.0.0" } }, - "node_modules/qrcode": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz", - "integrity": "sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==", + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { - "buffer": "^5.4.3", - "buffer-alloc": "^1.2.0", - "buffer-from": "^1.1.1", - "dijkstrajs": "^1.0.1", - "isarray": "^2.0.1", - "pngjs": "^3.3.0", - "yargs": "^13.2.4" - }, - "bin": { - "qrcode": "bin/qrcode" + "ee-first": "1.1.1" }, "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/qrcode/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "engines": { - "node": ">=6" + "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==", + "dependencies": { + "wrappy": "1" } }, - "node_modules/qrcode/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==", + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/qrcode/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/qrcode/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } + "node_modules/openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", + "dev": true }, - "node_modules/qrcode/node_modules/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==", + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/qrcode/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/qrcode/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "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.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/qrcode/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - }, - "node_modules/qrcode/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/ora": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", + "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", + "dev": true, "dependencies": { - "locate-path": "^3.0.0" + "bl": "^5.0.0", + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/qrcode/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/qrcode/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, + "node_modules/ora/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true, "engines": { - "node": ">=6" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/qrcode/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/ora/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, "dependencies": { - "p-try": "^2.0.0" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/qrcode/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/ora/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, "dependencies": { - "p-limit": "^2.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=6" - } - }, - "node_modules/qrcode/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/qrcode/node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "node_modules/qrcode/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/qrcode/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/qrcode/node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" }, - "node_modules/qrcode/node_modules/wrap-ansi": { + "node_modules/os-name": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.1.0.tgz", + "integrity": "sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==", + "dev": true, "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "macos-release": "^3.1.0", + "windows-release": "^5.0.1" }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/qrcode/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/qrcode/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "engines": { + "node": ">=12.20" } }, - "node_modules/qrcode/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/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==", + "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=0.6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/query-string": { - "version": "6.13.5", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.5.tgz", - "integrity": "sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q==", + "node_modules/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==", + "dev": true, "dependencies": { - "decode-uri-component": "^0.2.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "engines": { - "node": ">=0.4.x" + "node": ">=6" } }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "node_modules/pac-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + }, "engines": { - "node": ">=0.4.x" + "node": ">= 8" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/pac-resolver": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", "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" - } - ] + "dependencies": { + "degenerator": "^3.0.2", + "ip": "^1.1.5", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 8" + } }, - "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==", + "node_modules/package-json": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", + "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", + "dev": true, + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "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, "dependencies": { - "safe-buffer": "^5.1.0" + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "node_modules/parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "path-platform": "~0.11.15" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "node_modules/parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + }, + "node_modules/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, "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "@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" }, "engines": { - "node": ">= 0.8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "node_modules/parse-path": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", "dev": true, "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" + "protocols": "^2.0.0" } }, - "node_modules/rc/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 + "node_modules/parse-uri": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/parse-uri/-/parse-uri-1.0.7.tgz", + "integrity": "sha512-eWuZCMKNlVkXrEoANdXxbmqhu2SQO9jUMCSpdbJDObin0JxISn6e400EWsSRbr/czdKvWKkhZnMKEGUwf/Plmg==", + "engines": { + "node": ">= 0.10" + } }, - "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==", + "node_modules/parse-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", "dev": true, + "dependencies": { + "parse-path": "^7.0.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "node_modules/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==", "dev": true, - "dependencies": { - "pify": "^2.3.0" + "engines": { + "node": ">=8" } }, - "node_modules/read-cache/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, + "node_modules/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==", "engines": { "node": ">=0.10.0" } }, - "node_modules/read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", - "dependencies": { - "readable-stream": "^2.0.2" + "node_modules/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, + "engines": { + "node": ">=8" } }, - "node_modules/read-only-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "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==" }, - "node_modules/read-only-stream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "node_modules/path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/read-only-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/read-only-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/path-scurry": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.1.tgz", + "integrity": "sha512-OW+5s+7cw6253Q4E+8qQ/u1fVvcJQCJo/VFD8pje+dbJCF1n5ZRMV2AEHbGp+5Q7jxQIYJxkHopnj6nzdGeZLA==", + "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "lru-cache": "^7.14.1", + "minipass": "^4.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "peer": true, - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "engines": { + "node": "*" } }, - "node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", "dev": true, - "peer": true, "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "through": "~2.3" } }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", - "dev": true, - "peer": true, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.12" } }, - "node_modules/read-pkg-up/node_modules/path-exists": { + "node_modules/performance-now": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", - "dev": true, - "peer": true, - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", - "dev": true, - "peer": true, + "node_modules/pg": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.10.0.tgz", + "integrity": "sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==", "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.5.0", + "pg-pool": "^3.6.0", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8.0.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } } }, - "node_modules/read-pkg/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/pg-connection-string": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", + "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" }, - "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==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", "engines": { - "node": ">= 6" + "node": ">=4.0.0" } }, - "node_modules/readdirp": { + "node_modules/pg-pool": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", + "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", + "peerDependencies": { + "pg": ">=8.0" } }, - "node_modules/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, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" }, - "node_modules/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, - "peer": true, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", "dependencies": { - "minimatch": "^3.0.5" + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=4" } }, - "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, - "engines": { - "node": ">=6" + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, "engines": { - "node": ">= 0.4" + "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" + "bin": { + "pidtree": "bin/pidtree.js" }, "engines": { - "node": ">=14" + "node": ">=0.10" } }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", "dev": true, - "dependencies": { - "rc": "1.2.8" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, - "node_modules/release-it": { - "version": "15.8.0", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-15.8.0.tgz", - "integrity": "sha512-eJwYY/vXefcnWn7OHlZRcQJYPSJw/fdO+29C/Re5MZE8FZReCHu+EYq3yB0Bm39/3cTVz/5I/2Fk5rtAsVFU1g==", + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "dependencies": { - "@iarna/toml": "2.2.5", - "@octokit/rest": "19.0.7", - "async-retry": "1.3.3", - "chalk": "5.2.0", - "cosmiconfig": "8.1.0", - "execa": "7.0.0", - "git-url-parse": "13.1.0", - "globby": "13.1.3", - "got": "12.6.0", - "inquirer": "9.1.4", - "is-ci": "3.0.1", - "lodash": "4.17.21", - "mime-types": "2.1.35", - "new-github-release-url": "2.0.0", - "node-fetch": "3.3.0", - "open": "8.4.2", - "ora": "6.1.2", - "os-name": "5.1.0", - "promise.allsettled": "1.0.6", - "proxy-agent": "5.0.0", - "semver": "7.3.8", - "shelljs": "0.8.5", - "update-notifier": "6.0.2", - "url-join": "5.0.0", - "wildcard-match": "5.1.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "release-it": "bin/release-it.js" + "find-up": "^4.0.0" }, "engines": { - "node": ">=14.9" + "node": ">=8" } }, - "node_modules/release-it/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=8" } }, - "node_modules/release-it/node_modules/execa": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.0.0.tgz", - "integrity": "sha512-tQbH0pH/8LHTnwTrsKWideqi6rFB/QNUawEwrn+WHyz7PX1Tuz2u7wfTvbaNBdP5JD5LVWxNo8/A8CHNZ3bV6g==", + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">=8" } }, - "node_modules/release-it/node_modules/globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it/node_modules/human-signals": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.0.tgz", - "integrity": "sha512-zyzVyMjpGBX2+6cDVZeFPCdtOtdsxOeseRhB9tkQ6xXmGUNrcnBzdEKPy3VPNYz+4gy1oukVOXcrJCunSyc6QQ==", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, "engines": { - "node": ">=14.18.0" + "node": ">=8" } }, - "node_modules/release-it/node_modules/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, + "node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=4.0.0" + } + }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^10 || ^12 || >=14" } }, - "node_modules/release-it/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, "engines": { - "node": ">=12" + "node": ">=10.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.0.0" } }, - "node_modules/release-it/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", "dev": true, "dependencies": { - "path-key": "^4.0.0" + "camelcase-css": "^2.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^12 || ^14 || >= 16" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" } }, - "node_modules/release-it/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", "dev": true, "dependencies": { - "mimic-fn": "^4.0.0" + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" }, "engines": { - "node": ">=12" + "node": ">= 10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/release-it/node_modules/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==", + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, - "node_modules/release-it/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "node_modules/postcss-nested": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, "engines": { - "node": ">=12" + "node": ">=12.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" } }, - "node_modules/release-it/node_modules/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==", + "node_modules/postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, "engines": { - "node": ">=12" + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "bin": { + "nanoid": "bin/nanoid.cjs" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/req-cwd": { + "node_modules/postgres-array": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", - "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", - "dev": true, - "peer": true, + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", "dependencies": { - "req-from": "^2.0.0" + "xtend": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" + } + }, + "node_modules/preact": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.4.1.tgz", + "integrity": "sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" } }, - "node_modules/req-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", - "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", - "dev": true, - "peer": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, + "node_modules/precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==", "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/req-from/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "node_modules/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, - "peer": true, "engines": { - "node": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "node_modules/prettier": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "bin": { + "prettier": "bin-prettier.js" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", "dev": true, - "peer": true, "dependencies": { - "lodash": "^4.17.19" + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "peer": true, - "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "node": ">=10" }, - "engines": { - "node": ">= 0.12" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "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==", "engines": { - "node": ">=0.6" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" + "node": ">= 0.6.0" } }, - "node_modules/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==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "node_modules/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, + "node_modules/promise-to-callback": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz", + "integrity": "sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA==", + "dependencies": { + "is-fn": "^1.0.0", + "set-immediate-shim": "^1.0.1" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "node_modules/promise.allsettled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.6.tgz", + "integrity": "sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==", "dev": true, - "peer": true - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "array.prototype.map": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "iterate-value": "^1.0.2" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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==" - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "dependencies": { - "resolve-from": "^5.0.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" } }, - "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==", + "node_modules/proper-lockfile/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, "engines": { - "node": ">=4" + "node": ">= 4" } }, - "node_modules/resolve.exports": { + "node_modules/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 + }, + "node_modules/protobufjs": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/protocols": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.1.tgz", - "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==", - "dev": true, + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, "engines": { - "node": ">=10" + "node": ">= 0.10" } }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "node_modules/proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", "dev": true, "dependencies": { - "lowercase-keys": "^3.0.0" + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/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 + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" + }, + "node_modules/ps-tree": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", + "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", "dev": true, "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "event-stream": "=3.3.4" + }, + "bin": { + "ps-tree": "bin/ps-tree.js" }, "engines": { - "node": ">=8" + "node": ">= 0.10" } }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true + "node_modules/public-encrypt/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/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, + "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==", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "end-of-stream": "^1.1.0", + "once": "^1.3.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==", + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", "dev": true, "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" + "escape-goat": "^4.0.0" }, "engines": { - "node": "*" + "node": ">=12.20" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "node_modules/pure-rand": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", + "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/pushdata-bitcoin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz", + "integrity": "sha512-hw7rcYTJRAl4olM8Owe8x0fBuJJ+WGbMhQuLWOXEMN3PxPCKQHRkhfL+XG0+iXUmSHjkMmb3Ba55Mt21cZc9kQ==", "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "bitcoin-ops": "^1.3.0" } }, - "node_modules/ripple-address-codec": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.2.5.tgz", - "integrity": "sha512-SZ96zZH+0REeyEcYVFl0vqcsGRXiFXS2RUgHupHhtVkOEk6men53vngVjJwBrSnY+oa6Cri15q1zSni3DEoxNw==", + "node_modules/qrcode": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz", + "integrity": "sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==", "dependencies": { - "base-x": "^3.0.9", - "create-hash": "^1.1.2" + "buffer": "^5.4.3", + "buffer-alloc": "^1.2.0", + "buffer-from": "^1.1.1", + "dijkstrajs": "^1.0.1", + "isarray": "^2.0.1", + "pngjs": "^3.3.0", + "yargs": "^13.2.4" + }, + "bin": { + "qrcode": "bin/qrcode" }, "engines": { - "node": ">= 10" + "node": ">=4" } }, - "node_modules/ripple-binary-codec": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-1.4.3.tgz", - "integrity": "sha512-P4ALjAJWBJpRApTQO+dJCrHE6mZxm7ypZot9OS0a3RCKOWTReNw0pDWfdhCGh1qXh71TeQnAk4CHdMLwR/76oQ==", + "node_modules/qrcode/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode/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==", "dependencies": { - "assert": "^2.0.0", - "big-integer": "^1.6.48", - "buffer": "5.6.0", - "create-hash": "^1.2.0", - "decimal.js": "^10.2.0", - "ripple-address-codec": "^4.2.5" + "color-convert": "^1.9.0" }, "engines": { - "node": ">= 10" + "node": ">=4" } }, - "node_modules/ripple-binary-codec/node_modules/assert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "node_modules/qrcode/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/ripple-binary-codec/node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "engines": { - "node": ">=0.6" + "node_modules/qrcode/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "node_modules/ripple-binary-codec/node_modules/buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "node_modules/qrcode/node_modules/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==", "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "color-name": "1.1.3" } }, - "node_modules/ripple-keypairs": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.1.5.tgz", - "integrity": "sha512-wLJXIBsMVazn2Yp/7oP4PvgA4Gd1HtuZLftdEJFNOLgraf82phqa2AnNK3t9f3XeQnApW1jAe/FcFFOY6QUn5w==", - "dependencies": { - "bn.js": "^5.1.1", - "brorand": "^1.0.5", - "elliptic": "^6.5.4", - "hash.js": "^1.0.3", - "ripple-address-codec": "^4.2.5" - }, + "node_modules/qrcode/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/qrcode/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "engines": { - "node": ">= 10" + "node": ">=0.10.0" } }, - "node_modules/ripple-lib": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/ripple-lib/-/ripple-lib-1.10.1.tgz", - "integrity": "sha512-OQk+Syl2JfxKxV2KuF/kBMtnh012I5tNnziP3G4WDGCGSIAgeqkOgkR59IQ0YDNrs1YW8GbApxrdMSRi/QClcA==", + "node_modules/qrcode/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/qrcode/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dependencies": { - "@types/lodash": "^4.14.136", - "@types/ws": "^7.2.0", - "bignumber.js": "^9.0.0", - "https-proxy-agent": "^5.0.0", - "jsonschema": "1.2.2", - "lodash": "^4.17.4", - "ripple-address-codec": "^4.1.1", - "ripple-binary-codec": "^1.1.3", - "ripple-keypairs": "^1.0.3", - "ripple-lib-transactionparser": "0.8.2", - "ws": "^7.2.0" + "locate-path": "^3.0.0" }, "engines": { - "node": ">=10.13.0", - "yarn": "^1.15.2" + "node": ">=6" } }, - "node_modules/ripple-lib-transactionparser": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/ripple-lib-transactionparser/-/ripple-lib-transactionparser-0.8.2.tgz", - "integrity": "sha512-1teosQLjYHLyOQrKUQfYyMjDR3MAq/Ga+MJuLUfpBMypl4LZB4bEoMcmG99/+WVTEiZOezJmH9iCSvm/MyxD+g==", - "dependencies": { - "bignumber.js": "^9.0.0", - "lodash": "^4.17.15" + "node_modules/qrcode/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" } }, - "node_modules/rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "node_modules/qrcode/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dependencies": { - "bn.js": "^5.2.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" }, - "bin": { - "rlp": "bin/rlp" + "engines": { + "node": ">=6" } }, - "node_modules/robust-predicates": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", - "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" - }, - "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" + "node_modules/qrcode/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=6" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/rollup-plugin-inject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", - "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", - "dev": true, + "node_modules/qrcode/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dependencies": { - "estree-walker": "^0.6.1", - "magic-string": "^0.25.3", - "rollup-pluginutils": "^2.8.1" + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/rollup-plugin-inject/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - }, - "node_modules/rollup-plugin-node-polyfills": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", - "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", - "dev": true, - "dependencies": { - "rollup-plugin-inject": "^3.0.0" + "node_modules/qrcode/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" } }, - "node_modules/rollup-plugin-polyfill-node": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-polyfill-node/-/rollup-plugin-polyfill-node-0.11.0.tgz", - "integrity": "sha512-5t+qhq4LAQKQBgbPOQJEoxxGzU5b+zLfvzpUAGy9u0MCMs8y+mrjUAv8+xrkWdxnwXQwJtjmCMnA9lCflsMzNw==", - "dev": true, + "node_modules/qrcode/node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/qrcode/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dependencies": { - "@rollup/plugin-inject": "^5.0.1" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0" + "engines": { + "node": ">=6" } }, - "node_modules/rollup-plugin-polyfill-node/node_modules/@rollup/plugin-inject": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.3.tgz", - "integrity": "sha512-411QlbL+z2yXpRWFXSmw/teQRMkXcAAC8aYTemc15gwJRpvEVDQwoe+N/HTFD8RFG8+88Bme9DK2V9CVm7hJdA==", - "dev": true, + "node_modules/qrcode/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "estree-walker": "^2.0.2", - "magic-string": "^0.27.0" + "ansi-regex": "^4.1.0" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "node": ">=6" } }, - "node_modules/rollup-plugin-polyfill-node/node_modules/@rollup/pluginutils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", - "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", - "dev": true, + "node_modules/qrcode/node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + }, + "node_modules/qrcode/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "node": ">=6" } }, - "node_modules/rollup-plugin-polyfill-node/node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "dev": true + "node_modules/qrcode/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, - "node_modules/rollup-plugin-polyfill-node/node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, + "node_modules/qrcode/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, + "node_modules/qrcode/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dependencies": { - "estree-walker": "^0.6.1" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } }, - "node_modules/rollup-pluginutils/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - }, - "node_modules/rpc-websockets": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.5.1.tgz", - "integrity": "sha512-kGFkeTsmd37pHPMaHIgN1LVKXMi0JD782v4Ds9ZKtLlwdTKjn+CxM9A9/gLT2LaOuEcEFGL98h1QWQtlOIdW0w==", + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { - "@babel/runtime": "^7.17.2", - "eventemitter3": "^4.0.7", - "uuid": "^8.3.2", - "ws": "^8.5.0" + "side-channel": "^1.0.4" }, - "funding": { - "type": "paypal", - "url": "https://paypal.me/kozjak" + "engines": { + "node": ">=0.6" }, - "optionalDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rpc-websockets/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==", - "engines": { - "node": ">=10.0.0" + "node_modules/query-string": { + "version": "6.13.5", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.5.tgz", + "integrity": "sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q==", + "dependencies": { + "decode-uri-component": "^0.2.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "engines": { + "node": ">=6" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", "engines": { - "node": ">=0.12.0" + "node": ">=0.4.x" } }, - "node_modules/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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "engines": { + "node": ">=0.4.x" } }, - "node_modules/run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/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, "funding": [ { @@ -25624,1562 +20649,1603 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } + ] }, - "node_modules/rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } }, - "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dev": true, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dependencies": { - "tslib": "^2.1.0" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, - "node_modules/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==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/safe-event-emitter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz", - "integrity": "sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==", - "deprecated": "Renamed to @metamask/safe-event-emitter", + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { - "events": "^3.0.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "rc": "cli.js" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "node_modules/rc/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 + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true }, - "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==", + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, - "peer": true, "dependencies": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "istanbul": "lib/cli.js" + "pify": "^2.3.0" } }, - "node_modules/sc-istanbul/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", "dependencies": { - "sprintf-js": "~1.0.2" + "readable-stream": "^2.0.2" } }, - "node_modules/sc-istanbul/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true, - "peer": true + "node_modules/read-only-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, - "node_modules/sc-istanbul/node_modules/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, - "peer": true, + "node_modules/read-only-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=0.12.0" - }, - "optionalDependencies": { - "source-map": "~0.2.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "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==", - "dev": true, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/read-only-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/sc-istanbul/node_modules/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, - "peer": true, - "engines": { - "node": ">=0.10.0" + "node_modules/read-only-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/sc-istanbul/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "dev": true, - "peer": true, + "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==", "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": "*" + "node": ">= 6" } }, - "node_modules/sc-istanbul/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "peer": true, + "dependencies": { + "picomatch": "^2.2.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8.10.0" } }, - "node_modules/sc-istanbul/node_modules/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==", + "node_modules/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, - "peer": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "resolve": "^1.1.6" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">= 0.10" } }, - "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "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, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/sc-istanbul/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, - "peer": true, "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" }, "engines": { - "node": ">= 0.8.0" - } - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "minimist": "^1.2.6" + "node": ">= 0.4" }, - "bin": { - "mkdirp": "bin/cmd.js" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sc-istanbul/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", "dev": true, - "peer": true, "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "@pnpm/npm-conf": "^2.1.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=14" } }, - "node_modules/sc-istanbul/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "node_modules/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, - "peer": true, + "dependencies": { + "rc": "1.2.8" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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, - "peer": true - }, - "node_modules/sc-istanbul/node_modules/source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "node_modules/release-it": { + "version": "15.8.0", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-15.8.0.tgz", + "integrity": "sha512-eJwYY/vXefcnWn7OHlZRcQJYPSJw/fdO+29C/Re5MZE8FZReCHu+EYq3yB0Bm39/3cTVz/5I/2Fk5rtAsVFU1g==", "dev": true, - "optional": true, - "peer": true, "dependencies": { - "amdefine": ">=0.0.4" + "@iarna/toml": "2.2.5", + "@octokit/rest": "19.0.7", + "async-retry": "1.3.3", + "chalk": "5.2.0", + "cosmiconfig": "8.1.0", + "execa": "7.0.0", + "git-url-parse": "13.1.0", + "globby": "13.1.3", + "got": "12.6.0", + "inquirer": "9.1.4", + "is-ci": "3.0.1", + "lodash": "4.17.21", + "mime-types": "2.1.35", + "new-github-release-url": "2.0.0", + "node-fetch": "3.3.0", + "open": "8.4.2", + "ora": "6.1.2", + "os-name": "5.1.0", + "promise.allsettled": "1.0.6", + "proxy-agent": "5.0.0", + "semver": "7.3.8", + "shelljs": "0.8.5", + "update-notifier": "6.0.2", + "url-join": "5.0.0", + "wildcard-match": "5.1.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "release-it": "bin/release-it.js" }, "engines": { - "node": ">=0.8.0" + "node": ">=14.9" } }, - "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==", + "node_modules/release-it/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^1.0.0" - }, "engines": { - "node": ">=0.8.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/sc-istanbul/node_modules/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==", + "node_modules/release-it/node_modules/execa": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.0.0.tgz", + "integrity": "sha512-tQbH0pH/8LHTnwTrsKWideqi6rFB/QNUawEwrn+WHyz7PX1Tuz2u7wfTvbaNBdP5JD5LVWxNo8/A8CHNZ3bV6g==", "dev": true, - "peer": true, "dependencies": { - "prelude-ls": "~1.1.2" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/sc-istanbul/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "peer": true, - "dependencies": { - "isexe": "^2.0.0" + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" }, - "bin": { - "which": "bin/which" + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/scmp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.1.0.tgz", - "integrity": "sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==" - }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, - "node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "hasInstallScript": true, + "node_modules/release-it/node_modules/globby": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "dev": true, "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" }, "engines": { - "node": ">=10.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "node_modules/release-it/node_modules/human-signals": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.0.tgz", + "integrity": "sha512-zyzVyMjpGBX2+6cDVZeFPCdtOtdsxOeseRhB9tkQ6xXmGUNrcnBzdEKPy3VPNYz+4gy1oukVOXcrJCunSyc6QQ==", "dev": true, - "peer": true - }, - "node_modules/semaphore": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", - "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", "engines": { - "node": ">=0.8.0" + "node": ">=14.18.0" } }, - "node_modules/semaphore-async-await": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz", - "integrity": "sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg==", + "node_modules/release-it/node_modules/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, - "peer": true, "engines": { - "node": ">=4.1" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, + "node_modules/release-it/node_modules/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, "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "node_modules/release-it/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "dependencies": { - "semver": "^7.3.5" + "path-key": "^4.0.0" }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver/node_modules/lru-cache": { + "node_modules/release-it/node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, "dependencies": { - "yallist": "^4.0.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/semver/node_modules/yallist": { + "node_modules/release-it/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, "engines": { - "node": ">= 0.8.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node_modules/release-it/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "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==", + "node_modules/release-it/node_modules/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, - "dependencies": { - "randombytes": "^2.1.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 6" } }, - "node_modules/servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dependencies": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=6" + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } }, - "node_modules/set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==", + "node_modules/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==", "engines": { "node": ">=0.10.0" } }, - "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==" + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, - "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==", + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/sha1": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", - "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", - "dev": true, - "peer": true, - "dependencies": { - "charenc": ">= 0.0.1", - "crypt": ">= 0.0.1" + "resolve": "bin/resolve" }, - "engines": { - "node": "*" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/shasum-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", - "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", - "dependencies": { - "fast-safe-stringify": "^2.0.7" - } + "node_modules/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==" }, - "node_modules/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==", + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "dependencies": { - "shebang-regex": "^3.0.0" + "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", - "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "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, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, "engines": { "node": ">=4" } }, - "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==", + "node_modules/resolve.exports": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.1.tgz", + "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==", "dev": true, - "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": ">=10" } }, - "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==", + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", - "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", - "dependencies": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/simple-get/node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, "dependencies": { - "mimic-response": "^1.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/simple-get/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==", + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, "engines": { - "node": ">=4" + "node": ">= 4" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, "engines": { - "node": ">=8" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "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==", + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" + "glob": "^7.1.3" }, - "engines": { - "node": ">=12" + "bin": { + "rimraf": "bin.js" }, "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "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==", "dev": true, + "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": ">=12" + "node": "*" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "node_modules/ripple-address-codec": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.2.5.tgz", + "integrity": "sha512-SZ96zZH+0REeyEcYVFl0vqcsGRXiFXS2RUgHupHhtVkOEk6men53vngVjJwBrSnY+oa6Cri15q1zSni3DEoxNw==", "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" + "base-x": "^3.0.9", + "create-hash": "^1.1.2" }, "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" + "node": ">= 10" } }, - "node_modules/socks-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", - "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", - "dev": true, + "node_modules/ripple-binary-codec": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-1.4.3.tgz", + "integrity": "sha512-P4ALjAJWBJpRApTQO+dJCrHE6mZxm7ypZot9OS0a3RCKOWTReNw0pDWfdhCGh1qXh71TeQnAk4CHdMLwR/76oQ==", "dependencies": { - "agent-base": "^6.0.2", - "debug": "4", - "socks": "^2.3.3" + "assert": "^2.0.0", + "big-integer": "^1.6.48", + "buffer": "5.6.0", + "create-hash": "^1.2.0", + "decimal.js": "^10.2.0", + "ripple-address-codec": "^4.2.5" }, "engines": { - "node": ">= 6" + "node": ">= 10" } }, - "node_modules/socks/node_modules/ip": { + "node_modules/ripple-binary-codec/node_modules/assert": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" - }, - "node_modules/solc": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", - "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", - "dev": true, + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", "dependencies": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "follow-redirects": "^1.12.1", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "bin": { - "solcjs": "solcjs" - }, - "engines": { - "node": ">=8.0.0" + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" } }, - "node_modules/solc/node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true + "node_modules/ripple-binary-codec/node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } }, - "node_modules/solc/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "dev": true, + "node_modules/ripple-binary-codec/node_modules/buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, - "node_modules/solc/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, + "node_modules/ripple-keypairs": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.1.5.tgz", + "integrity": "sha512-wLJXIBsMVazn2Yp/7oP4PvgA4Gd1HtuZLftdEJFNOLgraf82phqa2AnNK3t9f3XeQnApW1jAe/FcFFOY6QUn5w==", "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" + "bn.js": "^5.1.1", + "brorand": "^1.0.5", + "elliptic": "^6.5.4", + "hash.js": "^1.0.3", + "ripple-address-codec": "^4.2.5" }, "engines": { - "node": "*" + "node": ">= 10" + } + }, + "node_modules/ripple-lib": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/ripple-lib/-/ripple-lib-1.10.1.tgz", + "integrity": "sha512-OQk+Syl2JfxKxV2KuF/kBMtnh012I5tNnziP3G4WDGCGSIAgeqkOgkR59IQ0YDNrs1YW8GbApxrdMSRi/QClcA==", + "dependencies": { + "@types/lodash": "^4.14.136", + "@types/ws": "^7.2.0", + "bignumber.js": "^9.0.0", + "https-proxy-agent": "^5.0.0", + "jsonschema": "1.2.2", + "lodash": "^4.17.4", + "ripple-address-codec": "^4.1.1", + "ripple-binary-codec": "^1.1.3", + "ripple-keypairs": "^1.0.3", + "ripple-lib-transactionparser": "0.8.2", + "ws": "^7.2.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=10.13.0", + "yarn": "^1.15.2" } }, - "node_modules/solc/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/ripple-lib-transactionparser": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/ripple-lib-transactionparser/-/ripple-lib-transactionparser-0.8.2.tgz", + "integrity": "sha512-1teosQLjYHLyOQrKUQfYyMjDR3MAq/Ga+MJuLUfpBMypl4LZB4bEoMcmG99/+WVTEiZOezJmH9iCSvm/MyxD+g==", + "dependencies": { + "bignumber.js": "^9.0.0", + "lodash": "^4.17.15" } }, - "node_modules/solc/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, + "node_modules/rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", "dependencies": { - "glob": "^7.1.3" + "bn.js": "^5.2.0" }, "bin": { - "rimraf": "bin.js" + "rlp": "bin/rlp" } }, - "node_modules/solc/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + }, + "node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "dev": true, "bin": { - "semver": "bin/semver" + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/solidity-ast": { - "version": "0.4.46", - "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.46.tgz", - "integrity": "sha512-MlPZQfPhjWXqh7YxWcBGDXaPZIfMYCOHYoLEhGDWulNwEPIQQZuB7mA9eP17CU0jY/bGR4avCEUVVpvHtT2gbA==", + "node_modules/rollup-plugin-inject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", + "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1", + "magic-string": "^0.25.3", + "rollup-pluginutils": "^2.8.1" + } + }, + "node_modules/rollup-plugin-inject/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", "dev": true }, - "node_modules/solidity-coverage": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", - "integrity": "sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==", + "node_modules/rollup-plugin-node-polyfills": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", + "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + "dev": true, + "dependencies": { + "rollup-plugin-inject": "^3.0.0" + } + }, + "node_modules/rollup-plugin-polyfill-node": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-polyfill-node/-/rollup-plugin-polyfill-node-0.11.0.tgz", + "integrity": "sha512-5t+qhq4LAQKQBgbPOQJEoxxGzU5b+zLfvzpUAGy9u0MCMs8y+mrjUAv8+xrkWdxnwXQwJtjmCMnA9lCflsMzNw==", "dev": true, - "peer": true, "dependencies": { - "@ethersproject/abi": "^5.0.9", - "@solidity-parser/parser": "^0.14.1", - "chalk": "^2.4.2", - "death": "^1.1.0", - "detect-port": "^1.3.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.15", - "mocha": "7.1.2", - "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" - }, - "bin": { - "solidity-coverage": "plugins/bin.js" + "@rollup/plugin-inject": "^5.0.1" }, "peerDependencies": { - "hardhat": "^2.11.0" + "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0" } }, - "node_modules/solidity-coverage/node_modules/ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "node_modules/rollup-plugin-polyfill-node/node_modules/@rollup/plugin-inject": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.3.tgz", + "integrity": "sha512-411QlbL+z2yXpRWFXSmw/teQRMkXcAAC8aYTemc15gwJRpvEVDQwoe+N/HTFD8RFG8+88Bme9DK2V9CVm7hJdA==", "dev": true, - "peer": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "estree-walker": "^2.0.2", + "magic-string": "^0.27.0" + }, "engines": { - "node": ">=6" + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/solidity-coverage/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/rollup-plugin-polyfill-node/node_modules/@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", "dev": true, - "peer": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, "engines": { - "node": ">=6" + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "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==", + "node_modules/rollup-plugin-polyfill-node/node_modules/@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, + "node_modules/rollup-plugin-polyfill-node/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", "dev": true, - "peer": true, "dependencies": { - "color-convert": "^1.9.0" + "@jridgewell/sourcemap-codec": "^1.4.13" }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/solidity-coverage/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", "dev": true, - "peer": true, "dependencies": { - "sprintf-js": "~1.0.2" + "estree-walker": "^0.6.1" } }, - "node_modules/solidity-coverage/node_modules/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, - "peer": true, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/rpc-websockets": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.5.1.tgz", + "integrity": "sha512-kGFkeTsmd37pHPMaHIgN1LVKXMi0JD782v4Ds9ZKtLlwdTKjn+CxM9A9/gLT2LaOuEcEFGL98h1QWQtlOIdW0w==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/runtime": "^7.17.2", + "eventemitter3": "^4.0.7", + "uuid": "^8.3.2", + "ws": "^8.5.0" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/kozjak" }, + "optionalDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + } + }, + "node_modules/rpc-websockets/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==", "engines": { - "node": ">=4" + "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/solidity-coverage/node_modules/chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true, - "peer": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.1" + "node": ">=0.12.0" } }, - "node_modules/solidity-coverage/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "node_modules/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, - "peer": 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" + } + ], "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "queue-microtask": "^1.2.2" } }, - "node_modules/solidity-coverage/node_modules/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==", + "node_modules/run-parallel-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", + "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", "dev": true, - "peer": 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" + } + ], "dependencies": { - "color-name": "1.1.3" + "queue-microtask": "^1.2.2" } }, - "node_modules/solidity-coverage/node_modules/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, - "peer": true + "node_modules/rustbn.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, - "node_modules/solidity-coverage/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "node_modules/rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "dev": true, - "peer": true, "dependencies": { - "ms": "^2.1.1" + "tslib": "^2.1.0" } }, - "node_modules/solidity-coverage/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" + "node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-event-emitter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz", + "integrity": "sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==", + "deprecated": "Renamed to @metamask/safe-event-emitter", + "dependencies": { + "events": "^3.0.0" } }, - "node_modules/solidity-coverage/node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, - "peer": true, - "engines": { - "node": ">=0.3.1" + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/solidity-coverage/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true, - "peer": true + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "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, - "peer": true, - "engines": { - "node": ">=0.8.0" - } + "node_modules/scmp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.1.0.tgz", + "integrity": "sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==" }, - "node_modules/solidity-coverage/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "peer": true, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "hasInstallScript": true, "dependencies": { - "locate-path": "^3.0.0" + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" }, "engines": { - "node": ">=6" + "node": ">=10.0.0" } }, - "node_modules/solidity-coverage/node_modules/flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dev": true, - "peer": true, + "node_modules/semaphore": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", + "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dependencies": { - "is-buffer": "~2.0.3" + "lru-cache": "^6.0.0" }, "bin": { - "flat": "cli.js" - } - }, - "node_modules/solidity-coverage/node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, + "semver": "bin/semver.js" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=10" } }, - "node_modules/solidity-coverage/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", "dev": true, - "peer": true, "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" + "semver": "^7.3.5" }, "engines": { - "node": "*" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/solidity-coverage/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, - "peer": true, + "node_modules/semver/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==", "dependencies": { - "is-glob": "^4.0.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "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, - "peer": true, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "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" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "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, - "peer": true, - "engines": { - "node": ">=4" + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/solidity-coverage/node_modules/is-fullwidth-code-point": { + "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "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==", "dev": true, - "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, "engines": { - "node": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/solidity-coverage/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "peer": true, + "node_modules/servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=6" } }, - "node_modules/solidity-coverage/node_modules/jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", - "dev": true, - "peer": true, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==", "engines": { - "node": "*" + "node": ">=0.10.0" } }, - "node_modules/solidity-coverage/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "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==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "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==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shasum-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", + "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/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, - "peer": true, "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/log-symbols": { + "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "peer": true, - "dependencies": { - "chalk": "^2.4.2" - }, "engines": { "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "peer": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "node_modules/shell-quote": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", + "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/solidity-coverage/node_modules/mocha": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", - "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, - "peer": true, "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" }, "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" + "shjs": "bin/shjs" }, "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": ">=4" } }, - "node_modules/solidity-coverage/node_modules/mocha/node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "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==", "dev": true, - "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" - } - }, - "node_modules/solidity-coverage/node_modules/mocha/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" }, - "engines": { - "node": "*" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/solidity-coverage/node_modules/mocha/node_modules/supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "peer": true, + "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==", "dependencies": { - "has-flag": "^3.0.0" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/solidity-coverage/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true, - "peer": true + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, - "node_modules/solidity-coverage/node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "peer": true, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", + "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, - "node_modules/solidity-coverage/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "peer": true, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dependencies": { - "p-try": "^2.0.0" + "mimic-response": "^1.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/solidity-coverage/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^2.0.0" - }, + "node_modules/simple-get/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==", "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/solidity-coverage/node_modules/path-exists": { + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "peer": true, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "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, - "peer": true, "dependencies": { - "picomatch": "^2.0.4" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": ">= 8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/solidity-coverage/node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true, - "peer": true - }, - "node_modules/solidity-coverage/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "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, - "peer": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/solidity-coverage/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "engines": { - "node": ">=6" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/solidity-coverage/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, - "peer": true, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0", + "npm": ">= 3.0.0" } }, - "node_modules/solidity-coverage/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", "dev": true, - "peer": true, "dependencies": { - "has-flag": "^3.0.0" + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/solidity-coverage/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/solc": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", + "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", "dev": true, - "peer": true, "dependencies": { - "isexe": "^2.0.0" + "command-exists": "^1.2.8", + "commander": "3.0.2", + "follow-redirects": "^1.12.1", + "fs-extra": "^0.30.0", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33" }, "bin": { - "which": "bin/which" + "solcjs": "solcjs" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/solidity-coverage/node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "node_modules/solc/node_modules/commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", + "dev": true + }, + "node_modules/solc/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", "dev": true, - "peer": true + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } }, - "node_modules/solidity-coverage/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "node_modules/solc/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "peer": true, "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "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": ">=6" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/solidity-coverage/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true, - "peer": true - }, - "node_modules/solidity-coverage/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "node_modules/solc/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", "dev": true, - "peer": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/solidity-coverage/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "node_modules/solc/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, - "peer": true, "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" } }, - "node_modules/solidity-coverage/node_modules/yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "node_modules/solc/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, - "peer": true, - "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "engines": { - "node": ">=6" + "bin": { + "semver": "bin/semver" } }, + "node_modules/solidity-ast": { + "version": "0.4.46", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.46.tgz", + "integrity": "sha512-MlPZQfPhjWXqh7YxWcBGDXaPZIfMYCOHYoLEhGDWulNwEPIQQZuB7mA9eP17CU0jY/bGR4avCEUVVpvHtT2gbA==", + "dev": true + }, "node_modules/solidity-docgen": { "version": "0.6.0-beta.35", "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.6.0-beta.35.tgz", @@ -27224,42 +22290,6 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "deprecated": "Please use @jridgewell/sourcemap-codec instead" }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "peer": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true, - "peer": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "peer": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true, - "peer": true - }, "node_modules/split": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", @@ -27373,16 +22403,6 @@ "node": ">= 0.8" } }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/stop-iteration-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", @@ -27995,31 +23015,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sync-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", - "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", - "dev": true, - "peer": true, - "dependencies": { - "http-response-object": "^3.0.1", - "sync-rpc": "^1.2.1", - "then-request": "^6.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/sync-rpc": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", - "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", - "dev": true, - "peer": true, - "dependencies": { - "get-port": "^3.1.0" - } - }, "node_modules/syntax-error": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", @@ -28288,14 +23283,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/testrpc": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", - "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", - "deprecated": "testrpc has been renamed to ganache-cli, please use this package from now on.", - "dev": true, - "peer": true - }, "node_modules/text-encoding-utf-8": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", @@ -28307,51 +23294,6 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/then-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", - "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/concat-stream": "^1.6.0", - "@types/form-data": "0.0.33", - "@types/node": "^8.0.0", - "@types/qs": "^6.2.31", - "caseless": "~0.12.0", - "concat-stream": "^1.6.0", - "form-data": "^2.2.0", - "http-basic": "^8.1.1", - "http-response-object": "^3.0.1", - "promise": "^8.0.0", - "qs": "^6.4.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/then-request/node_modules/@types/node": { - "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", - "dev": true, - "peer": true - }, - "node_modules/then-request/node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dev": true, - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -30423,17 +25365,6 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "peer": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/varint": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", @@ -31887,13 +26818,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", - "dev": true, - "peer": true - }, "node_modules/which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", @@ -31913,63 +26837,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "peer": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "peer": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", @@ -31999,19 +26866,6 @@ "integrity": "sha512-qNXwI591Z88c8bWxp+yjV60Ch4F8Riawe3iGxbzquhy8Xs9m+0+SLFBGb/0yCTIDElawtaImC37fYZ+dr32KqQ==", "dev": true }, - "node_modules/window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", - "dev": true, - "peer": true, - "bin": { - "window-size": "cli.js" - }, - "engines": { - "node": ">= 0.10.0" - } - }, "node_modules/windows-release": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.1.0.tgz", @@ -32236,16 +27090,6 @@ "node": ">=6.0" } }, - "node_modules/xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/xregexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", From ff1ac66cc70a5832fe2357b33c813481d30c7937 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Sun, 23 Apr 2023 16:23:33 -0400 Subject: [PATCH 12/78] Refactor fee swap --- .../types/src/interfaces/DeploymentConfig.ts | 2 +- contracts/ethereum/docs/index.md | 198 ++++--- contracts/ethereum/hardhat.config.ts | 4 +- contracts/ethereum/scripts/dev.ts | 41 +- contracts/ethereum/src/CasimirAutomation.sol | 108 ++-- contracts/ethereum/src/CasimirManager.sol | 499 +++++++++--------- contracts/ethereum/src/CasimirPoR.sol | 117 ---- .../src/interfaces/ICasimirAutomation.sol | 2 + .../src/interfaces/ICasimirManager.sol | 43 +- .../ethereum/src/interfaces/ICasimirPoR.sol | 15 - contracts/ethereum/src/libraries/Types.sol | 13 + .../ethereum/src/mock/MockAggregator.sol | 93 ---- .../src/vendor/interfaces/ISSVToken.sol | 14 - contracts/ethereum/test/fixtures/shared.ts | 96 ++-- contracts/ethereum/test/integration.ts | 4 +- 15 files changed, 528 insertions(+), 721 deletions(-) delete mode 100644 contracts/ethereum/src/CasimirPoR.sol delete mode 100644 contracts/ethereum/src/interfaces/ICasimirPoR.sol delete mode 100644 contracts/ethereum/src/mock/MockAggregator.sol delete mode 100644 contracts/ethereum/src/vendor/interfaces/ISSVToken.sol diff --git a/common/types/src/interfaces/DeploymentConfig.ts b/common/types/src/interfaces/DeploymentConfig.ts index 74359796f..0873f4371 100644 --- a/common/types/src/interfaces/DeploymentConfig.ts +++ b/common/types/src/interfaces/DeploymentConfig.ts @@ -2,6 +2,6 @@ import { ContractConfig } from './ContractConfig' export interface DeploymentConfig { CasimirManager: ContractConfig - MockAggregator?: ContractConfig + MockFunctionsOracle?: ContractConfig MockKeeperRegistry?: ContractConfig } \ No newline at end of file diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index ffe6040b2..5c0a156b5 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -232,13 +232,13 @@ Withdraw user stake from exited deposits | user | address | The user address | | amount | uint256 | The amount of ETH to withdraw | -### stake +### stakePool ```solidity -function stake(uint32 poolId) external +function stakePool(uint32 poolId) external ``` -Stake a pool validator and register with SSV +Stake a pool #### Parameters @@ -263,7 +263,7 @@ Request a pool exit ### completeExit ```solidity -function completeExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) external +function completeExit(uint256 poolStakedIndex, uint256 validatorStakedIndex, uint256 validatorExitingIndex) external ``` Complete a pool exit @@ -272,9 +272,9 @@ Complete a pool exit | Name | Type | Description | | ---- | ---- | ----------- | -| poolIndex | uint256 | The staked pool index | -| stakedValidatorIndex | uint256 | The staked validator index | -| exitingValidatorIndex | uint256 | The exiting validator index | +| poolStakedIndex | uint256 | The pool's staked index | +| validatorStakedIndex | uint256 | The validator's staked index | +| validatorExitingIndex | uint256 | The validator's exiting index | ### addValidator @@ -439,7 +439,7 @@ Get a list of all staked pool IDs ### getStake ```solidity -function getStake() public view returns (uint256) +function getStake() public view returns (uint256 stake) ``` Get the total manager stake @@ -448,12 +448,12 @@ Get the total manager stake | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | The total manager stake | +| stake | uint256 | The total manager stake | ### getExecutionStake ```solidity -function getExecutionStake() public view returns (int256) +function getExecutionStake() public view returns (int256 executionStake) ``` Get the total manager execution stake @@ -462,12 +462,12 @@ Get the total manager execution stake | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | int256 | The total manager execution stake | +| executionStake | int256 | The total manager execution stake | ### getExecutionSwept ```solidity -function getExecutionSwept() public view returns (int256) +function getExecutionSwept() public view returns (int256 executionSwept) ``` Get the total manager execution swept amount @@ -476,12 +476,12 @@ Get the total manager execution swept amount | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | int256 | The total manager execution swept amount | +| executionSwept | int256 | The total manager execution swept amount | ### getConsensusStake ```solidity -function getConsensusStake() public view returns (int256) +function getConsensusStake() public view returns (int256 consensusStake) ``` Get the total manager consensus stake @@ -490,12 +490,12 @@ Get the total manager consensus stake | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | int256 | The latest total manager consensus stake | +| consensusStake | int256 | The total manager consensus stake | ### getExpectedConsensusStake ```solidity -function getExpectedConsensusStake() public view returns (int256) +function getExpectedConsensusStake() public view returns (int256 expectedConsensusStake) ``` Get the total manager expected consensus stake @@ -506,7 +506,7 @@ _The expected stake will be honored with slashing recovery in place_ | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | int256 | The the total manager expected consensus stake | +| expectedConsensusStake | int256 | The total manager expected consensus stake | ### getOpenDeposits @@ -857,10 +857,10 @@ function reward(uint256 amount) external function withdraw(uint256 amount) external ``` -### stake +### stakePool ```solidity -function stake(uint32 poolId) external +function stakePool(uint32 poolId) external ``` ### requestExit @@ -2245,85 +2245,35 @@ function writeKVMap(struct CBOR.CBORBuffer buf, string key) internal pure function writeKVArray(struct CBOR.CBORBuffer buf, string key) internal pure ``` -## MockAggregator - -### version - -```solidity -uint256 version -``` - -### description - -```solidity -string description -``` - -### decimals - -```solidity -uint8 decimals -``` - -### latestAnswer - -```solidity -int256 latestAnswer -``` - -### latestTimestamp - -```solidity -uint256 latestTimestamp -``` - -### latestRound - -```solidity -uint256 latestRound -``` - -### getAnswer - -```solidity -mapping(uint256 => int256) getAnswer -``` - -### getTimestamp - -```solidity -mapping(uint256 => uint256) getTimestamp -``` +## MockFunctionsOracle ### constructor ```solidity -constructor(uint8 _decimals, int256 _initialAnswer) public +constructor() public ``` -### updateAnswer +### sendRequest ```solidity -function updateAnswer(int256 _answer) public +function sendRequest(uint64 subscriptionId, bytes data, uint32 gasLimit) external returns (bytes32) ``` -### updateRoundData - -```solidity -function updateRoundData(uint80 _roundId, int256 _answer, uint256 _timestamp, uint256 _startedAt) public -``` +Sends a request (encoded as data) using the provided subscriptionId -### getRoundData +#### Parameters -```solidity -function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | +| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| gasLimit | uint32 | Gas limit for the fulfillment callback | -### latestRoundData +#### Return Values -```solidity -function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes32 | requestId A unique request identifier (unique per DON) | ## MockKeeperRegistry @@ -2513,3 +2463,83 @@ function checkUpkeep(uint256 upkeepId) external view returns (bool upkeepNeeded, function checkUpkeep(uint256 upkeepId) external returns (bool upkeepNeeded, bytes performData, enum UpkeepFailureReason upkeepFailureReason, uint256 gasUsed, uint256 fastGasWei, uint256 linkNative) ``` +## MockAggregator + +### version + +```solidity +uint256 version +``` + +### description + +```solidity +string description +``` + +### decimals + +```solidity +uint8 decimals +``` + +### latestAnswer + +```solidity +int256 latestAnswer +``` + +### latestTimestamp + +```solidity +uint256 latestTimestamp +``` + +### latestRound + +```solidity +uint256 latestRound +``` + +### getAnswer + +```solidity +mapping(uint256 => int256) getAnswer +``` + +### getTimestamp + +```solidity +mapping(uint256 => uint256) getTimestamp +``` + +### constructor + +```solidity +constructor(uint8 _decimals, int256 _initialAnswer) public +``` + +### updateAnswer + +```solidity +function updateAnswer(int256 _answer) public +``` + +### updateRoundData + +```solidity +function updateRoundData(uint80 _roundId, int256 _answer, uint256 _timestamp, uint256 _startedAt) public +``` + +### getRoundData + +```solidity +function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + +### latestRoundData + +```solidity +function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) +``` + diff --git a/contracts/ethereum/hardhat.config.ts b/contracts/ethereum/hardhat.config.ts index 36fb06064..52ce60e53 100644 --- a/contracts/ethereum/hardhat.config.ts +++ b/contracts/ethereum/hardhat.config.ts @@ -26,7 +26,7 @@ const forkingChainId = { mainnet: 1, goerli: 5 }[forkingNetwork] const externalEnv = { mainnet: { BEACON_DEPOSIT_ADDRESS: '0x00000000219ab540356cBB839Cbe05303d7705Fa', - LINK_FEED_ADDRESS: '', + LINK_ORACLE_ADDRESS: '', LINK_TOKEN_ADDRESS: '0x514910771AF9Ca656af840dff83E8264EcF986CA', SSV_NETWORK_ADDRESS: '', SSV_TOKEN_ADDRESS: '0x9D65fF81a3c488d585bBfb0Bfe3c7707c7917f54', @@ -36,7 +36,7 @@ const externalEnv = { }, goerli: { BEACON_DEPOSIT_ADDRESS: '0x07b39F4fDE4A38bACe212b546dAc87C58DfE3fDC', - LINK_FEED_ADDRESS: '0x3de1bE9407645533CD0CbeCf88dFE5297E7125e6', + LINK_ORACLE_ADDRESS: '0x3de1bE9407645533CD0CbeCf88dFE5297E7125e6', LINK_TOKEN_ADDRESS: '0x326C977E6efc84E512bB9C30f76E30c160eD06FB', SSV_NETWORK_ADDRESS: '0xb9e155e65B5c4D66df28Da8E9a0957f06F11Bc04', SSV_TOKEN_ADDRESS: '0x3a9f01091C446bdE031E39ea8354647AFef091E7', diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 8c5f1b227..beec22de9 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -1,19 +1,19 @@ import { deployContract } from '@casimir/hardhat' import { ContractConfig, DeploymentConfig, Validator } from '@casimir/types' import { validatorStore } from '@casimir/data' -import { CasimirAutomation, CasimirManager, MockAggregator } from '../build/artifacts/types' +import { CasimirAutomation, CasimirManager, MockFunctionsOracle } from '../build/artifacts/types' import { ethers } from 'hardhat' void async function () { let casimirManager: CasimirManager | undefined - let mockAggregator: MockAggregator | undefined - const [ , , , , distributor] = await ethers.getSigners() + let mockFunctionsOracle: MockFunctionsOracle | undefined + const [, , , , , distributor] = await ethers.getSigners() let config: DeploymentConfig = { CasimirManager: { address: '', args: { beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, - linkFeedAddress: process.env.LINK_FEED_ADDRESS, + linkOracleAddress: process.env.LINK_ORACLE_ADDRESS, linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, ssvTokenAddress: process.env.SSV_TOKEN_ADDRESS, @@ -26,14 +26,18 @@ void async function () { } } + /** Insert any mock external contracts first */ if (process.env.MOCK_EXTERNAL_CONTRACTS === 'true') { config = { - MockAggregator: { + MockFunctionsOracle: { address: '', - args: { - decimals: 18, - initialAnswer: 0 - }, + args: {}, + options: {}, + proxy: false + }, + MockKeeperRegistry: { + address: '', + args: {}, options: {}, proxy: false }, @@ -46,7 +50,7 @@ void async function () { /** Link mock external contracts to Casimir */ if (name === 'CasimirManager') { - (config[name as keyof typeof config] as ContractConfig).args.linkFeedAddress = config.MockAggregator?.address + (config[name as keyof typeof config] as ContractConfig).args.linkOracleAddress = config.MockFunctionsOracle?.address } const { args, options, proxy } = config[name as keyof typeof config] as ContractConfig @@ -63,11 +67,11 @@ void async function () { // Save SSV manager for export if (name == 'CasimirManager') casimirManager = contract as CasimirManager - // Save mock aggregator for export - if (name == 'MockAggregator') mockAggregator = contract as MockAggregator + // Save mock functions oracle for export + if (name == 'MockFunctionsOracle') mockFunctionsOracle = contract as MockFunctionsOracle } - const validators = Object.keys(validatorStore).map((key) => validatorStore[key]).slice(0, 2) as Validator[] + const validators = Object.keys(validatorStore).map((key) => validatorStore[key]) as Validator[] for (const validator of validators) { const { depositDataRoot, @@ -78,7 +82,7 @@ void async function () { signature, withdrawalCredentials } = validator - const registration = await casimirManager?.addValidator( + const registration = await casimirManager?.registerValidator( depositDataRoot, publicKey, operatorIds, @@ -134,13 +138,8 @@ void async function () { await performUpkeep.wait() } - if (mockAggregator) { - const { ...feed } = await mockAggregator.latestRoundData() - const { answer } = feed - const consensusStakeIncrease = ethers.utils.parseEther('32') - const newAnswer = answer.add(consensusStakeIncrease) - const update = await mockAggregator.updateAnswer(newAnswer) - await update?.wait() + if (mockFunctionsOracle) { + // } }) }() \ No newline at end of file diff --git a/contracts/ethereum/src/CasimirAutomation.sol b/contracts/ethereum/src/CasimirAutomation.sol index 2cb9a916c..7fccd2d44 100644 --- a/contracts/ethereum/src/CasimirAutomation.sol +++ b/contracts/ethereum/src/CasimirAutomation.sol @@ -3,25 +3,35 @@ pragma solidity ^0.8.7; import "./interfaces/ICasimirAutomation.sol"; import "./interfaces/ICasimirManager.sol"; -import "./interfaces/ICasimirPoR.sol"; import {Functions, FunctionsClient} from "./vendor/FunctionsClient.sol"; // import "@chainlink/contracts/src/v0.8/dev/functions/FunctionsClient.sol"; // Once published import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/math/SafeCast.sol"; + +// Dev-only imports import "hardhat/console.sol"; -// Todo handle: -// - Ready pool DKG triggering -// - Balance increase from rewards and exit completion -// - Slash reshare triggering -// - Withdrawal or maximum reshare exit triggering +// To be done by automation and functions oracle: +// 1. Store withdrawal requests ✔ +// 2. Request exits for withdrawals +// 3. Store pending exits and pending withdrawals +// 4. Get completed exits in upkeep (triggered by any amount increase > reward threshold) +// 5. Fulfill withdrawals and redistribute +// 6. Get cluster snapshots before staking ready pools + +// To be enabled with operator registry and selection (not an audit essential, postponing for now): +// 1. Replace lost stake with operator collateral +// 2. Distribute operators to minimize undercollateralization risk + +// To be enabled with single-instance @casimir/keys oracle (not an audit essential, postponing for now): +// 1. Validator keygen triggering +// 2. Validator reshare triggering (for penalties or otherwise) +// 3. Validator exit triggering (for max reshares or by liquidity needs) /** * @title Oracle contract that triggers and handles actions */ -contract CasimirAutomation is ICasimirAutomation, Ownable { - - // Todo add FunctionsClient before Ownable +contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { /*************/ /* Constants */ @@ -41,8 +51,12 @@ contract CasimirAutomation is ICasimirAutomation, Ownable { /* Dynamic State */ /********************/ - /* Total stake */ - uint256 private stake; + /* Latest functions response */ + bytes private latestResponse; + /* Latest functions error */ + bytes private latestError; + /* Latest functions response count */ + uint256 private responseCounter; /***************/ /* Constructor */ @@ -52,10 +66,8 @@ contract CasimirAutomation is ICasimirAutomation, Ownable { * Constructor * @param casimirManagerAddress The manager contract address */ - constructor(address casimirManagerAddress/*, address linkFunctionsAddress*/) { + constructor(address casimirManagerAddress, address linkFunctionsAddress) FunctionsClient(linkFunctionsAddress) { casimirManager = ICasimirManager(casimirManagerAddress); - - // Todo add FunctionsClient(linkFunctionsAddress) after constructor params } /** @@ -76,22 +88,20 @@ contract CasimirAutomation is ICasimirAutomation, Ownable { /** Get ready pools to stake */ uint32[] memory readyPoolIds = casimirManager.getReadyPoolIds(); - if (readyPoolIds.length > 0) { upkeepNeeded = true; } - /** Get Beacon rewards swept to manager */ - uint256 executionSwept = SafeCast.toUint256(casimirManager.getExecutionSwept()); - - if (executionSwept >= rewardThreshold) { + /** Get amount swept to manager */ + uint256 amountSwept = SafeCast.toUint256(casimirManager.getExecutionSwept()); + if (amountSwept >= rewardThreshold) { upkeepNeeded = true; } else { /** Set swept amounts below threshold to zero */ - executionSwept = 0; + amountSwept = 0; } - performData = abi.encode(readyPoolIds, executionSwept); + performData = abi.encode(readyPoolIds, amountSwept); } /** @@ -104,7 +114,7 @@ contract CasimirAutomation is ICasimirAutomation, Ownable { /** Stake ready pools */ for (uint256 i = 0; i < readyPoolIds.length; i++) { - casimirManager.stakePool(readyPoolIds[i]); + casimirManager.stakeNextPool(); } /** Compound rewards */ @@ -113,50 +123,26 @@ contract CasimirAutomation is ICasimirAutomation, Ownable { } } - // /** - // * @notice Callback that is invoked once the DON has resolved the request or hit an error - // * - // * @param requestId The request ID, returned by sendRequest() - // * @param response Aggregated response from the user code - // * @param err Aggregated error from the user code or from the execution pipeline - // * Either response or error parameter will be set, but never both - // */ - // function fulfillRequest(bytes32 requestId, bytes memory response, bytes memory err) internal override { - // latestResponse = response; - // latestError = err; - // responseCounter = responseCounter + 1; - // emit OCRResponse(requestId, response, err); - // } - - // /** - // * @notice Update the Functions oracle address - // * @param oracle New oracle address - // */ - // function updateOracleAddress(address oracle) public onlyOwner { - // setOracle(oracle); - // } - - /** - * @notice Get the total manager stake - * @return The total manager stake - */ - function getStake() external view returns (uint256) { - return casimirManager.getStake(); - } - /** - * @notice Get the total manager execution swept amount - * @return The total manager execution swept amount + * @notice Callback that is invoked once the DON has resolved the request or hit an error + * + * @param requestId The request ID, returned by sendRequest() + * @param response Aggregated response from the user code + * @param err Aggregated error from the user code or from the execution pipeline + * Either response or error parameter will be set, but never both */ - function getExecutionSwept() public view returns (int256) { - return casimirManager.getExecutionSwept(); + function fulfillRequest(bytes32 requestId, bytes memory response, bytes memory err) internal override { + latestResponse = response; + latestError = err; + responseCounter = responseCounter + 1; + emit OCRResponse(requestId, response, err); } /** - * @notice Get the total manager expected consensus stake - * @return The total manager expected consensus stake + * @notice Update the functions oracle address + * @param oracle New oracle address */ - function getExpectedConsensusStake() external view returns (int256) { - return casimirManager.getExpectedConsensusStake(); + function setOracleAddress(address oracle) external onlyOwner { + setOracle(oracle); } } diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index 80e7ed20b..ecb6df570 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -2,21 +2,21 @@ pragma solidity 0.8.16; import "./CasimirAutomation.sol"; -import "./CasimirPoR.sol"; import "./interfaces/ICasimirManager.sol"; +import "./libraries/Types.sol"; import "./vendor/interfaces/IDepositContract.sol"; import "./vendor/interfaces/ISSVNetwork.sol"; -import "./vendor/interfaces/ISSVToken.sol"; import "./vendor/interfaces/IWETH9.sol"; -import "./libraries/Types.sol"; -import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/utils/math/Math.sol"; import "@openzeppelin/contracts/utils/math/SafeCast.sol"; import "@uniswap/v3-core/contracts/interfaces/IUniswapV3Factory.sol"; import "@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol"; import "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol"; + +// Dev-only imports import "hardhat/console.sol"; /** @@ -27,14 +27,14 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /* Libraries */ /*************/ - /** Use counter for incrementing IDs */ - using Counters for Counters.Counter; /** Use math for precise division */ using Math for uint256; /** Use internal type for uint32 array */ using Types32Array for uint32[]; /** Use internal type for bytes array */ using TypesBytesArray for bytes[]; + /** Use internal type for user withdrawal array */ + using TypesUserWithdrawalArray for UserWithdrawal[]; /*************/ /* Constants */ @@ -55,8 +55,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Automation contract */ ICasimirAutomation private immutable casimirAutomation; - /** PoR contract */ - ICasimirPoR private immutable casimirPoR; /** Beacon deposit contract */ IDepositContract private immutable beaconDeposit; /** LINK ERC-20 token contract */ @@ -64,7 +62,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** SSV network contract */ ISSVNetwork private immutable ssvNetwork; /** SSV ERC-20 token contract */ - ISSVToken private immutable ssvToken; + IERC20 private immutable ssvToken; /** Uniswap factory contract */ IUniswapV3Factory private immutable swapFactory; /** Uniswap router contract */ @@ -86,7 +84,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /********************/ /** Last pool ID generated for a new pool */ - Counters.Counter lastPoolId; + uint256 lastPoolId; /** Token addresses */ mapping(Token => address) private tokenAddresses; /** Unswapped tokens by address */ @@ -113,6 +111,14 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { bytes[] private exitingValidatorPublicKeys; /** Sum of scaled reward to stake ratios (intial value required) */ uint256 distributionSum = 1000 ether; + /** Requested withdrawals */ + UserWithdrawal[] private requestedWithdrawalQueue; + /** Pending withdrawals */ + UserWithdrawal[] private pendingWithdrawalQueue; + /** Total requested withdrawals */ + uint256 private requestedWithdrawals; + /** Total pending withdrawals */ + uint256 private pendingWithdrawals; /** LINK fee percentage (intial value required) */ uint32 linkFee = 1; /** SSV fee percentage (intial value required) */ @@ -121,7 +127,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Constructor * @param beaconDepositAddress The Beacon deposit address - * @param linkFeedAddress The Chainlink data feed address + * @param linkOracleAddress The Chainlink functions oracle address * @param linkTokenAddress The Chainlink token address * @param ssvNetworkAddress The SSV network address * @param ssvTokenAddress The SSV token address @@ -131,7 +137,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ constructor( address beaconDepositAddress, - address linkFeedAddress, + address linkOracleAddress, address linkTokenAddress, address ssvNetworkAddress, address ssvTokenAddress, @@ -144,21 +150,18 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { tokenAddresses[Token.LINK] = linkTokenAddress; ssvNetwork = ISSVNetwork(ssvNetworkAddress); tokenAddresses[Token.SSV] = ssvTokenAddress; - ssvToken = ISSVToken(ssvTokenAddress); + ssvToken = IERC20(ssvTokenAddress); swapFactory = IUniswapV3Factory(swapFactoryAddress); swapRouter = ISwapRouter(swapRouterAddress); tokenAddresses[Token.WETH] = wethTokenAddress; - /** Deploy automation and PoR contracts */ - casimirAutomation = new CasimirAutomation(address(this)); - casimirPoR = new CasimirPoR(address(this), linkFeedAddress); + /** Deploy automation contract */ + casimirAutomation = new CasimirAutomation( + address(this), + linkOracleAddress + ); } - /** - * @dev Used for mocking sweeps from Beacon to the manager - */ - receive() external payable nonReentrant {} - /** * @dev Distribute ETH rewards * @param amount The amount of ETH to reward @@ -174,25 +177,17 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ); /** Reward fees set to zero for testing */ - ProcessedDeposit memory processedDeposit = processFees( - amount, - Fees(0, 0) - ); + uint256 processedAmount = processFees(amount, Fees(0, 0)); distributionSum += Math.mulDiv( distributionSum, - processedDeposit.ethAmount, + processedAmount, getStake() ); - - distribute(address(this), processedDeposit); - - emit RewardDistributed( - msg.sender, - processedDeposit.ethAmount, - processedDeposit.linkAmount, - processedDeposit.ssvAmount - ); + + distribute(processedAmount); + + emit RewardDistributed(msg.sender, processedAmount); } /** @@ -201,10 +196,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function deposit() external payable nonReentrant { require(msg.value > 0, "Deposit amount must be greater than 0"); - ProcessedDeposit memory processedDeposit = processFees( - msg.value, - getFees() - ); + uint256 processedAmount = processFees(msg.value, getFees()); /** Update user account state */ if (users[msg.sender].stake0 > 0) { @@ -212,65 +204,50 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { users[msg.sender].stake0 = getUserStake(msg.sender); } users[msg.sender].distributionSum0 = distributionSum; - users[msg.sender].stake0 += processedDeposit.ethAmount; + users[msg.sender].stake0 += processedAmount; - distribute(msg.sender, processedDeposit); + distribute(processedAmount); - emit UserDeposited( - msg.sender, - processedDeposit.ethAmount, - processedDeposit.linkAmount, - processedDeposit.ssvAmount - ); + emit UserDepositDistributed(msg.sender, processedAmount); } /** - * @dev Distribute a processed deposit to ready pools - * @param sender The deposit sender address - * @param processedDeposit The processed deposit + * @dev Distribute ETH to ready pools + * @param amount The amount of ETH to distribute */ - function distribute( - address sender, - ProcessedDeposit memory processedDeposit - ) private { - /** Approve LINK fees for automation contract */ - linkToken.approve(getAutomationAddress(), processedDeposit.linkAmount); - + function distribute(uint256 amount) private { /** Distribute ETH to open pools */ - while (processedDeposit.ethAmount > 0) { + while (amount > 0) { /** Get the next open pool */ uint32 poolId; if (openPoolIds.length > 0) { poolId = openPoolIds[0]; } else { - lastPoolId.increment(); - poolId = uint32(lastPoolId.current()); + lastPoolId += 1; + poolId = uint32(lastPoolId); openPoolIds.push(poolId); } Pool storage pool; pool = pools[poolId]; uint256 remainingCapacity = poolCapacity - pool.deposits; - if (remainingCapacity > processedDeposit.ethAmount) { + if (remainingCapacity > amount) { /** Emit event before updating values */ - emit PoolIncreased(sender, poolId, processedDeposit.ethAmount); + emit PoolIncreased(msg.sender, poolId, amount); - /** Update pool state */ - openDeposits += processedDeposit.ethAmount; - pool.deposits += processedDeposit.ethAmount; - - processedDeposit.ethAmount = 0; + openDeposits += amount; + pool.deposits += amount; + amount = 0; } else { /** Emit event before updating values */ - emit PoolIncreased(sender, poolId, remainingCapacity); + emit PoolIncreased(msg.sender, poolId, remainingCapacity); - /** Move pool from open to ready state */ openDeposits -= pool.deposits; pool.deposits += remainingCapacity; + amount -= remainingCapacity; + /** Move pool from open to ready state */ openPoolIds.remove(0); readyPoolIds.push(poolId); - - processedDeposit.ethAmount -= remainingCapacity; } } } @@ -293,79 +270,94 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Instantly withdraw if full amount is available */ if (amount <= openDeposits) { - withdrawInstantly(msg.sender, amount); + withdrawInstantly(amount); } else { - requestWithdrawal(msg.sender, amount); + requestWithdrawal(amount); } } /** * @dev Withdraw user stake instantly from open deposits - * @param user The user address * @param amount The amount of ETH to withdraw */ - function withdrawInstantly(address user, uint256 amount) private { + function withdrawInstantly(uint256 amount) private { /** Update user account state */ - users[user].distributionSum0 = distributionSum; - users[user].stake0 -= amount; + users[msg.sender].distributionSum0 = distributionSum; + users[msg.sender].stake0 -= amount; /** Update balance state */ Pool storage pool = pools[openPoolIds[0]]; pool.deposits -= amount; openDeposits -= amount; - send(user, amount); + send(msg.sender, amount); - emit UserWithdrawed(user, amount); + emit UserWithdrawed(msg.sender, amount); } /** * @dev Request to withdraw user stake from exited deposits - * @param user The user address * @param amount The amount of ETH to withdraw */ - function requestWithdrawal(address user, uint256 amount) private { - /** Add withdrawal to queue */ - // Todo + function requestWithdrawal(uint256 amount) private { + /** Update requested withdrawals state */ + requestedWithdrawalQueue.push( + UserWithdrawal({user: msg.sender, amount: amount}) + ); + requestedWithdrawals += amount; - emit UserWithdrawalRequested(user, amount); + emit UserWithdrawalRequested(msg.sender, amount); } /** - * @notice Initiate withdrawal of user stake from exited deposits - * @param user The user address - * @param amount The amount of ETH to withdraw + * @notice Initiate the next withdrawal of user stake from exited deposits */ - function inititateWithdrawal(address user, uint256 amount) external { + function inititateNextWithdrawal() external { require( - msg.sender == getAutomationAddress(), + msg.sender == address(casimirAutomation), "Only automation contract can initiate withdrawals" ); + /** Get next requested withdrawal */ + UserWithdrawal memory userWithdrawal = requestedWithdrawalQueue[0]; + + /** Update requested withdrawals state */ + requestedWithdrawalQueue.remove(0); + requestedWithdrawals -= userWithdrawal.amount; + + /** Update pending withdrawals state */ + pendingWithdrawalQueue.push(userWithdrawal); + pendingWithdrawals += userWithdrawal.amount; + /** Update user account state */ - users[user].distributionSum0 = distributionSum; - users[user].stake0 -= amount; + users[userWithdrawal.user].distributionSum0 = distributionSum; + users[userWithdrawal.user].stake0 -= userWithdrawal.amount; - emit UserWithdrawalInitiated(user, amount); + emit UserWithdrawalInitiated( + userWithdrawal.user, + userWithdrawal.amount + ); } /** - * @notice Withdraw user stake from exited deposits - * @param user The user address - * @param amount The amount of ETH to withdraw + * @notice Complete the next withdrawal of user stake from exited deposits */ - function completeWithdrawal(address user, uint256 amount) external { + function completeNextWithdrawal() external { require( - msg.sender == getAutomationAddress(), + msg.sender == address(casimirAutomation), "Only automation contract can complete withdrawals" ); - /** Remove from withdrawal queue */ - // Todo + /** Get next pending withdrawal */ + UserWithdrawal memory userWithdrawal = pendingWithdrawalQueue[0]; - send(user, amount); + /** Update pending withdrawals state */ + pendingWithdrawalQueue.remove(0); + pendingWithdrawals -= userWithdrawal.amount; - emit UserWithdrawed(user, amount); + send(userWithdrawal.user, userWithdrawal.amount); + + emit UserWithdrawed(userWithdrawal.user, userWithdrawal.amount); } /** @@ -379,16 +371,17 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Stake a pool - * @param poolId The pool ID + * @notice Stake the next ready pool */ - function stakePool(uint32 poolId) external { + function stakeNextPool() external { require( - msg.sender == getAutomationAddress(), + msg.sender == address(casimirAutomation), "Only automation contract can stake pools" ); require(readyValidatorPublicKeys.length > 0, "No ready validators"); - require(readyPoolIds[0] == poolId, "Pool is not the next ready for stake"); + + /** Get next ready pool ID */ + uint32 poolId = readyPoolIds[0]; /** Get next ready validator */ bytes memory validatorPublicKey = readyValidatorPublicKeys[0]; @@ -433,16 +426,16 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Request a pool exit * @param poolId The staked pool ID */ - function requestExit(uint32 poolId) external { + function requestPoolExit(uint32 poolId) external { require( - msg.sender == getAutomationAddress(), + msg.sender == address(casimirAutomation), "Only automation can request pool exits" ); - + Pool storage pool = pools[poolId]; require(!pool.exiting, "Pool is already exiting"); - + pool.exiting = true; /** Record validator as exiting for automation */ @@ -457,22 +450,36 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param validatorStakedIndex The validator's staked index * @param validatorExitingIndex The validator's exiting index */ - function completeExit(uint256 poolStakedIndex, uint256 validatorStakedIndex, uint256 validatorExitingIndex) external { + function completePoolExit( + uint256 poolStakedIndex, + uint256 validatorStakedIndex, + uint256 validatorExitingIndex + ) external { require( - msg.sender == getAutomationAddress(), + msg.sender == address(casimirAutomation), "Only automation can complete pool exits" ); - + uint32 poolId = stakedPoolIds[poolStakedIndex]; Pool storage pool = pools[poolId]; require(pool.exiting, "Pool is not exiting"); bytes memory validatorPublicKey = pool.validatorPublicKey; - bytes memory stakedValidatorPublicKey = stakedValidatorPublicKeys[validatorStakedIndex]; - bytes memory exitingValidatorPublicKey = exitingValidatorPublicKeys[validatorExitingIndex]; + bytes memory stakedValidatorPublicKey = stakedValidatorPublicKeys[ + validatorStakedIndex + ]; + bytes memory exitingValidatorPublicKey = exitingValidatorPublicKeys[ + validatorExitingIndex + ]; - require(keccak256(validatorPublicKey) == keccak256(stakedValidatorPublicKey) && keccak256(validatorPublicKey) == keccak256(exitingValidatorPublicKey), "Pool validator does not match staked and exiting validator"); + require( + keccak256(validatorPublicKey) == + keccak256(stakedValidatorPublicKey) && + keccak256(validatorPublicKey) == + keccak256(exitingValidatorPublicKey), + "Pool validator does not match staked and exiting validator" + ); /** Remove pool from staked pools and delete */ stakedPoolIds.remove(poolStakedIndex); @@ -490,7 +497,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Add a validator to the pool manager + * @notice Register a validator with the pool manager * @param depositDataRoot The deposit data root * @param publicKey The validator public key * @param operatorIds The operator IDs @@ -499,7 +506,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param signature The signature * @param withdrawalCredentials The withdrawal credentials */ - function addValidator( + function registerValidator( bytes32 depositDataRoot, bytes calldata publicKey, uint32[] memory operatorIds, @@ -524,14 +531,14 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @dev Process fees from a deposit - * @param depositAmount The amount of ETH to deposit + * @param depositAmount The full deposit amount * @param fees The fees to process - * @return The processed deposit + * @return processedAmount The processed deposit amount */ function processFees( uint256 depositAmount, Fees memory fees - ) private returns (ProcessedDeposit memory) { + ) private returns (uint256 processedAmount) { /** Calculate total fee percentage */ uint32 feePercent = fees.LINK + fees.SSV; @@ -541,68 +548,66 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Calculate fee amount to swap */ uint256 feeAmount = depositAmount - ethAmount; - /** Wrap ETH fees in ERC-20 to use in swap */ - uint256 linkAmount; - uint256 ssvAmount; + /** Wrap and swap */ if (feeAmount > 0) { - wrap(feeAmount); + wrapFees(feeAmount); - linkAmount = swap( + (, uint256 unswappedLINK) = swapFees( tokenAddresses[Token.WETH], tokenAddresses[Token.LINK], - (feeAmount * fees.LINK) / feePercent + Math.mulDiv(feeAmount, fees.LINK, feePercent) + ); + // Todo use link.tokenIncreaseAllowance(swappedLINK) if available + linkToken.approve( + address(casimirAutomation), + linkToken.balanceOf(address(this)) ); + unswappedTokens[tokenAddresses[Token.LINK]] += unswappedLINK; - ssvAmount = swap( + (, uint256 unswappedSSV) = swapFees( tokenAddresses[Token.WETH], tokenAddresses[Token.SSV], - (feeAmount * fees.SSV) / feePercent + Math.mulDiv(feeAmount, fees.SSV, feePercent) ); + // Todo use ssv.tokenIncreaseAllowance(swappedSSV) if available + ssvToken.approve( + address(casimirAutomation), + ssvToken.balanceOf(address(this)) + ); + unswappedTokens[tokenAddresses[Token.SSV]] += unswappedSSV; } - return ProcessedDeposit(ethAmount, linkAmount, ssvAmount); + processedAmount = ethAmount; } /** * @dev Deposit WETH to use ETH in swaps * @param amount The amount of ETH to deposit */ - function wrap(uint256 amount) private { + function wrapFees(uint256 amount) private { IWETH9 wethToken = IWETH9(tokenAddresses[Token.WETH]); wethToken.deposit{value: amount}(); wethToken.approve(address(swapRouter), amount); } /** - * @dev Swap one token-in for another token-out - * @param tokenIn The token-in address - * @param tokenOut The token-out address - * @param amountIn The amount of token-in to input - * @return amountOut The amount of token-out + * @dev Swap token in for token out */ - function swap( + function swapFees( address tokenIn, address tokenOut, uint256 amountIn - ) private returns (uint256 amountOut) { - /** Temporarily handle unswappable fees due to liquidity */ + ) private returns (uint256 amountOut, uint256 amountUnswapped) { address swapPool = swapFactory.getPool( tokenIn, tokenOut, uniswapFeeTier ); uint256 liquidity = IUniswapV3PoolState(swapPool).liquidity(); - uint256 desiredAmountIn = amountIn + unswappedTokens[tokenIn]; - uint256 realAmountIn; - - if (liquidity < desiredAmountIn) { - realAmountIn = liquidity; - unswappedTokens[tokenIn] = desiredAmountIn - liquidity; - } else { - realAmountIn = desiredAmountIn; - unswappedTokens[tokenIn] = 0; + if (liquidity < amountIn) { + amountUnswapped = amountIn - liquidity; + amountIn = liquidity; } - - if (realAmountIn > 0) { + if (amountIn > 0) { /** Get swap params */ ISwapRouter.ExactInputSingleParams memory params = ISwapRouter .ExactInputSingleParams({ @@ -611,45 +616,119 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { fee: uniswapFeeTier, recipient: address(this), deadline: block.timestamp, - amountIn: realAmountIn, + amountIn: amountIn, amountOutMinimum: 0, sqrtPriceLimitX96: 0 }); - /** Swap token */ + /** Perform swap */ amountOut = swapRouter.exactInputSingle(params); } } /** * @dev Update link fee - * @param newFee The new fee + * @param newFee The new fee */ - function setLINKFee(uint32 newFee) public onlyOwner { + function setLINKFee(uint32 newFee) external onlyOwner { linkFee = newFee; } /** * @dev Update ssv fee - * @param newFee The new fee + * @param newFee The new fee */ - function setSSVFee(uint32 newFee) public onlyOwner { + function setSSVFee(uint32 newFee) external onlyOwner { ssvFee = newFee; } + /** + * @notice Update the functions oracle address + * @param oracle New oracle address + */ + function setOracleAddress(address oracle) external onlyOwner { + casimirAutomation.setOracleAddress(oracle); + } + /** * @notice Get the current token fees as percentages * @return fees The current token fees as percentages */ function getFees() public view returns (Fees memory fees) { - fees = Fees(getLINKFee(), getSSVFee()); + fees = Fees(linkFee, ssvFee); + } + + /** + * @notice Get the total manager stake + * @return stake The total manager stake + */ + function getStake() public view returns (uint256 stake) { + /** Total manager execution stake */ + int256 executionStake = getExecutionStake(); + + /** Total manager consensus stake */ + int256 consensusStake = getExpectedConsensusStake(); + + stake = SafeCast.toUint256(executionStake + consensusStake); + } + + /** + * @notice Get the total manager execution stake + * @return executionStake The total manager execution stake + */ + function getExecutionStake() public view returns (int256 executionStake) { + executionStake = int256( + readyPoolIds.length * poolCapacity + openDeposits + ); + } + + /** + * @notice Get the total manager execution swept amount + * @return executionSwept The total manager execution swept amount + */ + function getExecutionSwept() public view returns (int256 executionSwept) { + executionSwept = int256(address(this).balance) - getExecutionStake(); + } + + /** + * @notice Get the total manager expected consensus stake + * @dev Pending user withdrawal amount is subtracted from the expected stake + * @dev The expected stake will be honored with penalty recovery in place + * @return expectedConsensusStake The total manager expected consensus stake + */ + function getExpectedConsensusStake() + public + view + returns (int256 expectedConsensusStake) + { + expectedConsensusStake = + int256(stakedPoolIds.length * poolCapacity) - + int256(pendingWithdrawals); } + /** + * @notice Get the total user stake for a given user address + * @param userAddress The user address + * @return userStake The total user stake + */ + function getUserStake( + address userAddress + ) public view returns (uint256 userStake) { + require(users[userAddress].stake0 > 0, "User does not have a stake"); + userStake = Math.mulDiv( + users[userAddress].stake0, + distributionSum, + users[userAddress].distributionSum0 + ); + } + + // External view functions + /** * @notice Get the LINK fee percentage to charge on each deposit * @return The LINK fee percentage to charge on each deposit */ - function getLINKFee() public view returns (uint32) { + function getLINKFee() external view returns (uint32) { return linkFee; } @@ -657,7 +736,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Get the SSV fee percentage to charge on each deposit * @return The SSV fee percentage to charge on each deposit */ - function getSSVFee() public view returns (uint32) { + function getSSVFee() external view returns (uint32) { return ssvFee; } @@ -697,7 +776,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Get a list of all ready pool IDs * @return A list of all ready pool IDs */ - function getReadyPoolIds() public view returns (uint32[] memory) { + function getReadyPoolIds() external view returns (uint32[] memory) { return readyPoolIds; } @@ -705,82 +784,18 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Get a list of all staked pool IDs * @return A list of all staked pool IDs */ - function getStakedPoolIds() public view returns (uint32[] memory) { + function getStakedPoolIds() external view returns (uint32[] memory) { return stakedPoolIds; } - /** - * @notice Get the total manager stake - * @return stake The total manager stake - */ - function getStake() public view returns (uint256 stake) { - /** Total manager execution stake */ - int256 executionStake = getExecutionStake(); - - /** Total manager consensus stake */ - int256 consensusStake = getExpectedConsensusStake(); - - stake = SafeCast.toUint256(executionStake + consensusStake); - } - - /** - * @notice Get the total manager execution stake - * @return executionStake The total manager execution stake - */ - function getExecutionStake() public view returns (int256 executionStake) { - executionStake = int256(readyPoolIds.length * poolCapacity + openDeposits); - } - - /** - * @notice Get the total manager execution swept amount - * @return executionSwept The total manager execution swept amount - */ - function getExecutionSwept() public view returns (int256 executionSwept) { - executionSwept = int256(address(this).balance) - getExecutionStake(); - } - - /** - * @notice Get the total manager consensus stake - * @return consensusStake The total manager consensus stake - */ - function getConsensusStake() public view returns (int256 consensusStake) { - consensusStake = casimirPoR.getConsensusStake(); - } - - /** - * @notice Get the total manager expected consensus stake - * @dev The expected stake will be honored with slashing recovery in place - * @return expectedConsensusStake The total manager expected consensus stake - */ - function getExpectedConsensusStake() public view returns (int256 expectedConsensusStake) { - - // Todo account for pending withdrawal amount - - expectedConsensusStake = int256(stakedPoolIds.length * poolCapacity); - } - /** * @notice Get the total manager open deposits * @return The total manager open deposits */ - function getOpenDeposits() public view returns (uint256) { + function getOpenDeposits() external view returns (uint256) { return openDeposits; } - /** - * @notice Get the total user stake for a given user address - * @param userAddress The user address - * @return userStake The total user stake - */ - function getUserStake(address userAddress) public view returns (uint256 userStake) { - require(users[userAddress].stake0 > 0, "User does not have a stake"); - userStake = Math.mulDiv( - users[userAddress].stake0, - distributionSum, - users[userAddress].distributionSum0 - ); - } - /** * @notice Get the pool details for a given pool ID * @param poolId The pool ID @@ -791,13 +806,23 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ) external view returns (PoolDetails memory poolDetails) { Pool memory pool = pools[poolId]; - /** Pool will not have validator or operators if still in ready state */ + /** Pool in ready state will not have validator or operators */ bytes memory emptyBytes = new bytes(0); if (keccak256(pool.validatorPublicKey) == keccak256(emptyBytes)) { - poolDetails = PoolDetails(pool.deposits, emptyBytes, new uint32[](0), pool.exiting); + poolDetails = PoolDetails( + pool.deposits, + emptyBytes, + new uint32[](0), + pool.exiting + ); } else { Validator memory validator = validators[pool.validatorPublicKey]; - poolDetails = PoolDetails(pool.deposits, pool.validatorPublicKey, validator.operatorIds, pool.exiting); + poolDetails = PoolDetails( + pool.deposits, + pool.validatorPublicKey, + validator.operatorIds, + pool.exiting + ); } } @@ -805,15 +830,19 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Get the automation address * @return automationAddress The automation address */ - function getAutomationAddress() public view returns (address automationAddress) { + function getAutomationAddress() + external + view + returns (address automationAddress) + { automationAddress = address(casimirAutomation); } + // Dev-only functions + /** - * @notice Get the PoR address - * @return porAddress The PoR address + * @dev Will be removed in production + * @dev Used for mocking sweeps from Beacon to the manager */ - function getPoRAddress() public view returns (address porAddress) { - porAddress = address(casimirPoR); - } + receive() external payable nonReentrant {} } diff --git a/contracts/ethereum/src/CasimirPoR.sol b/contracts/ethereum/src/CasimirPoR.sol deleted file mode 100644 index ea79600b7..000000000 --- a/contracts/ethereum/src/CasimirPoR.sol +++ /dev/null @@ -1,117 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.7; - -import "./interfaces/ICasimirPoR.sol"; -import "./interfaces/ICasimirManager.sol"; -import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; - -/** - * @title PoR contract that reports validator balances - */ -contract CasimirPoR is ICasimirPoR { - /*************/ - /* Contracts */ - /*************/ - - /* Manager contract */ - ICasimirManager private immutable casimirManager; - /** Chainlink PoR feed contract */ - AggregatorV3Interface private immutable linkFeed; - - /***************/ - /* Constructor */ - /***************/ - - /** - * Constructor - * @param casimirManagerAddress The manager contract address - * @param linkFeedAddress The chainlink PoR feed contract address - */ - constructor(address casimirManagerAddress, address linkFeedAddress) { - casimirManager = ICasimirManager(casimirManagerAddress); - linkFeed = AggregatorV3Interface(linkFeedAddress); - } - - /*************/ - /* Functions */ - /*************/ - - /** - * @notice Get the PoR address list length - * @return The PoR address list length - */ - function getPoRAddressListLength() - external - view - override - returns (uint256) - { - return casimirManager.getStakedValidatorPublicKeys().length; - } - - /** - * @notice Get the PoR address list given a start and end index - * @param startIndex The start index - * @param endIndex The end index - * @return The PoR address list - */ - function getPoRAddressList( - uint256 startIndex, - uint256 endIndex - ) external view override returns (string[] memory) { - bytes[] memory publicKeys = casimirManager - .getStakedValidatorPublicKeys(); - address[] memory addresses = new address[](publicKeys.length); - for (uint256 i = 0; i < publicKeys.length; i++) { - addresses[i] = address(uint160(bytes20(keccak256(publicKeys[i])))); - } - - if (startIndex > endIndex) { - return new string[](0); - } - endIndex = endIndex > addresses.length - 1 - ? addresses.length - 1 - : endIndex; - string[] memory stringAddresses = new string[]( - endIndex - startIndex + 1 - ); - uint256 currIdx = startIndex; - uint256 strAddrIdx = 0; - while (currIdx <= endIndex) { - stringAddresses[strAddrIdx] = toString( - abi.encodePacked(addresses[currIdx]) - ); - strAddrIdx++; - currIdx++; - } - return stringAddresses; - } - - /** - * @dev Convert bytes to string - * @param data The bytes to convert - * @return The string - */ - function toString(bytes memory data) private pure returns (string memory) { - bytes memory alphabet = "0123456789abcdef"; - - bytes memory str = new bytes(2 + data.length * 2); - str[0] = "0"; - str[1] = "x"; - for (uint256 i = 0; i < data.length; i++) { - str[2 + i * 2] = alphabet[uint256(uint8(data[i] >> 4))]; - str[3 + i * 2] = alphabet[uint256(uint8(data[i] & 0x0f))]; - } - return string(str); - } - - /** - * @notice Get the total manager consensus stake - * @return The latest total manager consensus stake - */ - function getConsensusStake() external view returns (int256) { - (, /*uint80 roundID*/ int256 answer, , , ) = /*uint startedAt*/ /*uint timeStamp*/ /*uint80 answeredInRound*/ - linkFeed.latestRoundData(); - return answer; - } -} \ No newline at end of file diff --git a/contracts/ethereum/src/interfaces/ICasimirAutomation.sol b/contracts/ethereum/src/interfaces/ICasimirAutomation.sol index 5d254d2e6..cc209e802 100644 --- a/contracts/ethereum/src/interfaces/ICasimirAutomation.sol +++ b/contracts/ethereum/src/interfaces/ICasimirAutomation.sol @@ -19,4 +19,6 @@ interface ICasimirAutomation is AutomationCompatibleInterface { ) external returns (bool upkeepNeeded, bytes memory performData); function performUpkeep(bytes calldata performData) external; + + function setOracleAddress(address oracleAddress) external; } diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index fd7557542..539a4af29 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -35,6 +35,11 @@ interface ICasimirManager { uint256 stake0; uint256 distributionSum0; } + /** User withdrawal */ + struct UserWithdrawal { + address user; + uint256 amount; + } /** Validator deposit data and shares */ struct Validator { bytes32 depositDataRoot; @@ -49,18 +54,6 @@ interface ICasimirManager { /* Events */ /**********/ - event RewardDistributed( - address indexed sender, - uint256 ethAmount, - uint256 linkAmount, - uint256 ssvAmount - ); - event UserDeposited( - address indexed sender, - uint256 ethAmount, - uint256 linkAmount, - uint256 ssvAmount - ); event PoolIncreased( address indexed sender, uint32 poolId, @@ -69,7 +62,14 @@ interface ICasimirManager { event PoolStaked(uint32 indexed poolId); event PoolExitRequested(uint32 indexed poolId); event PoolExited(uint32 indexed poolId); - event ValidatorAdded(bytes indexed publicKey); + event RewardDistributed( + address indexed sender, + uint256 amount + ); + event UserDepositDistributed( + address indexed sender, + uint256 amount + ); event UserWithdrawalRequested( address indexed sender, uint256 amount @@ -82,6 +82,7 @@ interface ICasimirManager { address indexed sender, uint256 amount ); + event ValidatorAdded(bytes indexed publicKey); /*************/ /* Functions */ @@ -93,13 +94,13 @@ interface ICasimirManager { function withdraw(uint256 amount) external; - function stakePool(uint32 poolId) external; + function stakeNextPool() external; - function requestExit(uint32 poolId) external; + function requestPoolExit(uint32 poolId) external; - function completeExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) external; + function completePoolExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) external; - function addValidator( + function registerValidator( bytes32 depositDataRoot, bytes calldata publicKey, uint32[] memory operatorIds, @@ -109,6 +110,12 @@ interface ICasimirManager { bytes calldata withdrawalCredentials ) external; + function setLINKFee(uint32 fee) external; + + function setSSVFee(uint32 fee) external; + + function setOracleAddress(address oracleAddress) external; + function getFees() external view returns (Fees memory); function getLINKFee() external view returns (uint32); @@ -135,8 +142,6 @@ interface ICasimirManager { function getExecutionSwept() external view returns (int256); - function getConsensusStake() external view returns (int256); - function getExpectedConsensusStake() external view returns (int256); function getOpenDeposits() external view returns (uint256); diff --git a/contracts/ethereum/src/interfaces/ICasimirPoR.sol b/contracts/ethereum/src/interfaces/ICasimirPoR.sol deleted file mode 100644 index d0588ecbc..000000000 --- a/contracts/ethereum/src/interfaces/ICasimirPoR.sol +++ /dev/null @@ -1,15 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.7; - -import "@chainlink/contracts/src/v0.8/interfaces/PoRAddressList.sol"; - -interface ICasimirPoR is PoRAddressList { - function getPoRAddressListLength() external view returns (uint256); - - function getPoRAddressList( - uint256 startIndex, - uint256 endIndex - ) external view returns (string[] memory); - - function getConsensusStake() external view returns (int256); -} diff --git a/contracts/ethereum/src/libraries/Types.sol b/contracts/ethereum/src/libraries/Types.sol index 06dd9e99b..920ed5729 100644 --- a/contracts/ethereum/src/libraries/Types.sol +++ b/contracts/ethereum/src/libraries/Types.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.7; +import "../interfaces/ICasimirManager.sol"; + library Types32Array { function remove(uint32[] storage arr, uint index) internal { require(arr.length > 0, "Can't remove from empty array"); @@ -21,4 +23,15 @@ library TypesBytesArray { } arr.pop(); } +} + +library TypesUserWithdrawalArray { + function remove(ICasimirManager.UserWithdrawal[] storage arr, uint index) internal { + require(arr.length > 0, "Can't remove from empty array"); + require(index < arr.length, "Index out of bounds"); + for (uint i = index; i < arr.length - 1; i++) { + arr[i] = arr[i + 1]; + } + arr.pop(); + } } \ No newline at end of file diff --git a/contracts/ethereum/src/mock/MockAggregator.sol b/contracts/ethereum/src/mock/MockAggregator.sol deleted file mode 100644 index 9c459607e..000000000 --- a/contracts/ethereum/src/mock/MockAggregator.sol +++ /dev/null @@ -1,93 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; - -/** - * @title MockV3Aggregator - */ -contract MockAggregator is AggregatorV3Interface { - uint256 public constant version = 0; - string public constant description = "Mock PoR Aggregator"; - - uint8 public decimals; - int256 public latestAnswer; - uint256 public latestTimestamp; - uint256 public latestRound; - - mapping(uint256 => int256) public getAnswer; - mapping(uint256 => uint256) public getTimestamp; - mapping(uint256 => uint256) private getStartedAt; - - constructor(uint8 _decimals, int256 _initialAnswer) { - decimals = _decimals; - updateAnswer(_initialAnswer); - } - - function updateAnswer(int256 _answer) public { - latestAnswer = _answer; - latestTimestamp = block.timestamp; - latestRound++; - getAnswer[latestRound] = _answer; - getTimestamp[latestRound] = block.timestamp; - getStartedAt[latestRound] = block.timestamp; - } - - function updateRoundData( - uint80 _roundId, - int256 _answer, - uint256 _timestamp, - uint256 _startedAt - ) public { - latestRound = _roundId; - latestAnswer = _answer; - latestTimestamp = _timestamp; - getAnswer[latestRound] = _answer; - getTimestamp[latestRound] = _timestamp; - getStartedAt[latestRound] = _startedAt; - } - - function getRoundData( - uint80 _roundId - ) - external - view - override - returns ( - uint80 roundId, - int256 answer, - uint256 startedAt, - uint256 updatedAt, - uint80 answeredInRound - ) - { - return ( - _roundId, - getAnswer[_roundId], - getStartedAt[_roundId], - getTimestamp[_roundId], - _roundId - ); - } - - function latestRoundData() - external - view - override - returns ( - uint80 roundId, - int256 answer, - uint256 startedAt, - uint256 updatedAt, - uint80 answeredInRound - ) - { - return ( - uint80(latestRound), - getAnswer[latestRound], - getStartedAt[latestRound], - getTimestamp[latestRound], - uint80(latestRound) - ); - } -} diff --git a/contracts/ethereum/src/vendor/interfaces/ISSVToken.sol b/contracts/ethereum/src/vendor/interfaces/ISSVToken.sol deleted file mode 100644 index 99030089e..000000000 --- a/contracts/ethereum/src/vendor/interfaces/ISSVToken.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.16; - -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -/// @title Interface for WETH9 -interface ISSVToken is IERC20 { - /** - * @notice Mint tokens - * @param to The target address - * @param amount The amount of token to mint - */ - function mint(address to, uint256 amount) external; -} diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index b9ed31379..38216daa2 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -1,7 +1,7 @@ import { ethers } from 'hardhat' import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' import { deployContract } from '@casimir/hardhat' -import { CasimirManager, CasimirAutomation, MockAggregator } from '../../build/artifacts/types' +import { CasimirManager, CasimirAutomation, MockFunctionsOracle } from '../../build/artifacts/types' import { ContractConfig, DeploymentConfig, Validator } from '@casimir/types' import { validatorStore } from '@casimir/data' @@ -11,14 +11,14 @@ const rewardPerValidator = 0.1 /** Fixture to deploy SSV manager contract */ export async function deploymentFixture() { let casimirManager: CasimirManager | undefined - let mockAggregator: MockAggregator | undefined + let mockFunctionsOracle: MockFunctionsOracle | undefined const [owner, , , , , distributor] = await ethers.getSigners() let config: DeploymentConfig = { CasimirManager: { address: '', args: { beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, - linkFeedAddress: process.env.LINK_FEED_ADDRESS, + linkOracleAddress: process.env.LINK_ORACLE_ADDRESS, linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, ssvTokenAddress: process.env.SSV_TOKEN_ADDRESS, @@ -34,12 +34,9 @@ export async function deploymentFixture() { /** Insert any mock external contracts first */ if (process.env.MOCK_EXTERNAL_CONTRACTS === 'true') { config = { - MockAggregator: { + MockFunctionsOracle: { address: '', - args: { - decimals: 18, - initialAnswer: 0 - }, + args: {}, options: {}, proxy: false }, @@ -58,7 +55,7 @@ export async function deploymentFixture() { /** Link mock external contracts to Casimir */ if (name === 'CasimirManager') { - (config[name as keyof typeof config] as ContractConfig).args.linkFeedAddress = config.MockAggregator?.address + (config[name as keyof typeof config] as ContractConfig).args.linkOracleAddress = config.MockFunctionsOracle?.address } const { args, options, proxy } = config[name as keyof typeof config] as ContractConfig @@ -75,19 +72,19 @@ export async function deploymentFixture() { // Save SSV manager for export if (name === 'CasimirManager') casimirManager = contract as CasimirManager - // Save mock aggregator for export - if (name === 'MockAggregator') mockAggregator = contract as MockAggregator + // Save mock Functions oracle for export + if (name === 'MockFunctionsOracle') mockFunctionsOracle = contract as MockFunctionsOracle } const automationAddress = await casimirManager?.getAutomationAddress() as string const casimirAutomation = await ethers.getContractAt('CasimirAutomation', automationAddress) as CasimirAutomation - return { casimirManager: casimirManager as CasimirManager, casimirAutomation: casimirAutomation as CasimirAutomation, mockAggregator, owner, distributor } + return { casimirManager: casimirManager as CasimirManager, casimirAutomation: casimirAutomation as CasimirAutomation, mockFunctionsOracle, owner, distributor } } /** Fixture to add validators */ -export async function addValidatorsFixture() { - const { casimirManager, casimirAutomation, mockAggregator, owner, distributor } = await loadFixture(deploymentFixture) +export async function registerValidatorsFixture() { + const { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor } = await loadFixture(deploymentFixture) const validators = Object.keys(validatorStore).map((key) => validatorStore[key]) as Validator[] for (const validator of validators) { @@ -100,7 +97,7 @@ export async function addValidatorsFixture() { signature, withdrawalCredentials } = validator - const registration = await casimirManager.addValidator( + const registerValidator = await casimirManager.registerValidator( depositDataRoot, publicKey, operatorIds, @@ -109,14 +106,14 @@ export async function addValidatorsFixture() { signature, withdrawalCredentials ) - await registration.wait() + await registerValidator.wait() } - return { casimirManager, casimirAutomation, mockAggregator, owner, distributor, validators } + return { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor, validators } } /** Fixture to stake 16 ETH for the first user */ export async function firstUserDepositFixture() { - const { casimirManager, casimirAutomation, mockAggregator, owner, distributor } = await loadFixture(addValidatorsFixture) + const { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor } = await loadFixture(registerValidatorsFixture) const [, firstUser] = await ethers.getSigners() const stakeAmount = 16.0 const fees = { ...await casimirManager.getFees() } @@ -135,12 +132,12 @@ export async function firstUserDepositFixture() { await performUpkeep.wait() } - return { casimirManager, casimirAutomation, mockAggregator, owner, distributor, firstUser } + return { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor, firstUser } } /** Fixture to stake 24 ETH for the second user */ export async function secondUserDepositFixture() { - const { casimirManager, casimirAutomation, mockAggregator, owner, distributor, firstUser } = await loadFixture(firstUserDepositFixture) + const { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor, firstUser } = await loadFixture(firstUserDepositFixture) const [, , secondUser] = await ethers.getSigners() const stakeAmount = 24.0 const fees = { ...await casimirManager.getFees() } @@ -159,22 +156,17 @@ export async function secondUserDepositFixture() { await performUpkeep.wait() } - /** Increase PoR mock aggregator answer */ - if (mockAggregator) { - const { ...feed } = await mockAggregator.latestRoundData() - const { answer } = feed - const consensusStakeIncrease = ethers.utils.parseEther('32') - const newAnswer = answer.add(consensusStakeIncrease) - const update = await mockAggregator.updateAnswer(newAnswer) - await update.wait() + /** Fulfill mock Functions oracle answer */ + if (mockFunctionsOracle) { + // } - return { casimirManager, casimirAutomation, mockAggregator, owner, distributor, firstUser, secondUser } + return { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor, firstUser, secondUser } } /** Fixture to reward ${rewardPerValidator} * ${stakedValidatorCount} to the first and second user */ export async function rewardPostSecondUserDepositFixture() { - const { casimirManager, casimirAutomation, mockAggregator, owner, distributor, firstUser, secondUser } = await loadFixture(secondUserDepositFixture) + const { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor, firstUser, secondUser } = await loadFixture(secondUserDepositFixture) const stakedValidatorCount = (await casimirManager?.getStakedValidatorPublicKeys())?.length if (stakedValidatorCount) { const rewardAmount = (rewardPerValidator * stakedValidatorCount).toString() @@ -190,12 +182,12 @@ export async function rewardPostSecondUserDepositFixture() { await performUpkeep.wait() } } - return { casimirManager, casimirAutomation, mockAggregator, owner, distributor, firstUser, secondUser } + return { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor, firstUser, secondUser } } /** Fixture to stake 24 ETH for the third user */ export async function thirdUserDepositFixture() { - const { casimirManager, casimirAutomation, mockAggregator, owner, distributor, firstUser, secondUser } = await loadFixture(rewardPostSecondUserDepositFixture) + const { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor, firstUser, secondUser } = await loadFixture(rewardPostSecondUserDepositFixture) const [, , , thirdUser] = await ethers.getSigners() const stakeAmount = 24.0 const fees = { ...await casimirManager.getFees() } @@ -214,22 +206,17 @@ export async function thirdUserDepositFixture() { await performUpkeep.wait() } - /** Increase PoR mock aggregator answer */ - if (mockAggregator) { - const { ...feed } = await mockAggregator.latestRoundData() - const { answer } = feed - const consensusStakeIncrease = ethers.utils.parseEther('32') - const newAnswer = answer.add(consensusStakeIncrease) - const update = await mockAggregator.updateAnswer(newAnswer) - await update.wait() + /** Fulfill mock Functions oracle answer */ + if (mockFunctionsOracle) { + // } - return { casimirManager, casimirAutomation, mockAggregator, owner, distributor, firstUser, secondUser, thirdUser } + return { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor, firstUser, secondUser, thirdUser } } /** Fixture to reward ${rewardPerValidator} * ${stakedValidatorCount} to the first, second, and third user */ export async function rewardPostThirdUserDepositFixture() { - const { casimirManager, casimirAutomation, mockAggregator, distributor, firstUser, secondUser, thirdUser } = await loadFixture(thirdUserDepositFixture) + const { casimirManager, casimirAutomation, mockFunctionsOracle, distributor, firstUser, secondUser, thirdUser } = await loadFixture(thirdUserDepositFixture) const stakedValidatorCount = (await casimirManager?.getStakedValidatorPublicKeys())?.length if (stakedValidatorCount) { const rewardAmount = (rewardPerValidator * stakedValidatorCount).toString() @@ -245,12 +232,12 @@ export async function rewardPostThirdUserDepositFixture() { await performUpkeep.wait() } } - return { casimirManager, casimirAutomation, mockAggregator, distributor, firstUser, secondUser, thirdUser } + return { casimirManager, casimirAutomation, mockFunctionsOracle, distributor, firstUser, secondUser, thirdUser } } /** Fixture to withdraw ${readyDeposits} amount to fulfill ${firstUser} partial withdrawal */ export async function firstUserPartialWithdrawalFixture() { - const { casimirManager, casimirAutomation, mockAggregator, distributor, firstUser, secondUser, thirdUser } = await loadFixture(rewardPostThirdUserDepositFixture) + const { casimirManager, casimirAutomation, mockFunctionsOracle, distributor, firstUser, secondUser, thirdUser } = await loadFixture(rewardPostThirdUserDepositFixture) const readyDeposits = await casimirManager?.getOpenDeposits() const withdrawal = await casimirManager.connect(firstUser).withdraw(readyDeposits) await withdrawal.wait() @@ -264,12 +251,12 @@ export async function firstUserPartialWithdrawalFixture() { await performUpkeep.wait() } - return { casimirManager, casimirAutomation, mockAggregator, distributor, firstUser, secondUser, thirdUser } + return { casimirManager, casimirAutomation, mockFunctionsOracle, distributor, firstUser, secondUser, thirdUser } } /** Fixture to stake 72 ETH for the fourth user */ export async function fourthUserDepositFixture() { - const { casimirManager, casimirAutomation, mockAggregator, distributor, firstUser, secondUser, thirdUser } = await loadFixture(firstUserPartialWithdrawalFixture) + const { casimirManager, casimirAutomation, mockFunctionsOracle, distributor, firstUser, secondUser, thirdUser } = await loadFixture(firstUserPartialWithdrawalFixture) const [, , , , fourthUser] = await ethers.getSigners() const stakeAmount = 72.0 const fees = { ...await casimirManager.getFees() } @@ -288,22 +275,17 @@ export async function fourthUserDepositFixture() { await performUpkeep.wait() } - /** Increase PoR mock aggregator answer */ - if (mockAggregator) { - const { ...feed } = await mockAggregator.latestRoundData() - const { answer } = feed - const consensusStakeIncrease = ethers.utils.parseEther('64') - const newAnswer = answer.add(consensusStakeIncrease) - const update = await mockAggregator.updateAnswer(newAnswer) - await update.wait() + /** Fulfill mock Functions oracle answer */ + if (mockFunctionsOracle) { + // } - return { casimirManager, casimirAutomation, mockAggregator, distributor, firstUser, secondUser, thirdUser, fourthUser } + return { casimirManager, casimirAutomation, mockFunctionsOracle, distributor, firstUser, secondUser, thirdUser, fourthUser } } /** Fixture to simulate stakes and rewards */ export async function simulationFixture() { - const { casimirManager, casimirAutomation, mockAggregator, distributor, firstUser, secondUser, thirdUser, fourthUser } = await loadFixture(fourthUserDepositFixture) + const { casimirManager, casimirAutomation, mockFunctionsOracle, distributor, firstUser, secondUser, thirdUser, fourthUser } = await loadFixture(fourthUserDepositFixture) for (let i = 0; i < 5; i++) { const stakedValidatorCount = (await casimirManager?.getStakedValidatorPublicKeys())?.length if (stakedValidatorCount) { @@ -321,5 +303,5 @@ export async function simulationFixture() { } } } - return { casimirManager, casimirAutomation, mockAggregator, distributor, firstUser, secondUser, thirdUser, fourthUser } + return { casimirManager, casimirAutomation, mockFunctionsOracle, distributor, firstUser, secondUser, thirdUser, fourthUser } } \ No newline at end of file diff --git a/contracts/ethereum/test/integration.ts b/contracts/ethereum/test/integration.ts index 7951a2515..6fe875e6b 100644 --- a/contracts/ethereum/test/integration.ts +++ b/contracts/ethereum/test/integration.ts @@ -1,12 +1,12 @@ import { ethers } from 'hardhat' import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' import { expect } from 'chai' -import { addValidatorsFixture, firstUserDepositFixture, rewardPostSecondUserDepositFixture, secondUserDepositFixture, thirdUserDepositFixture, rewardPostThirdUserDepositFixture, simulationFixture, firstUserPartialWithdrawalFixture, fourthUserDepositFixture } from './fixtures/shared' +import { registerValidatorsFixture, firstUserDepositFixture, rewardPostSecondUserDepositFixture, secondUserDepositFixture, thirdUserDepositFixture, rewardPostThirdUserDepositFixture, simulationFixture, firstUserPartialWithdrawalFixture, fourthUserDepositFixture } from './fixtures/shared' describe('Casimir manager', async function () { it('Registration adds 5 validators with 4 operators each', async function () { - const { validators } = await loadFixture(addValidatorsFixture) + const { validators } = await loadFixture(registerValidatorsFixture) expect(validators.length).equal(5) const operators = validators.map((v) => v.operatorIds).flat() From 1ba701a87a09e98893be48ca49632ced42959d8c Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Fri, 28 Apr 2023 14:03:20 -0400 Subject: [PATCH 13/78] Sync beacon with mock functions --- common/helpers/src/index.ts | 30 +- contracts/ethereum/docs/index.md | 557 ++++++------------ .../FunctionsSandboxLibrary/Functions.js | 143 +++++ .../functions/FunctionsSandboxLibrary/Log.js | 59 ++ .../FunctionsSandboxLibrary/Sandbox.js | 81 +++ .../FunctionsSandboxLibrary/Validator.js | 69 +++ .../FunctionsSandboxLibrary/buildRequest.js | 17 + .../FunctionsSandboxLibrary/encryptSecrets.js | 23 + .../getRequestConfig.js | 90 +++ .../FunctionsSandboxLibrary/handler.js | 92 +++ .../FunctionsSandboxLibrary/index.js | 30 + .../simulateRequest.js | 79 +++ contracts/ethereum/hardhat.config.ts | 8 +- contracts/ethereum/scripts/dev.ts | 21 +- contracts/ethereum/src/CasimirAutomation.sol | 191 ++++-- contracts/ethereum/src/CasimirManager.sol | 420 +++++++------ .../src/interfaces/ICasimirAutomation.sol | 17 + .../src/interfaces/ICasimirManager.sol | 64 +- .../ethereum/src/mock/MockFunctionsOracle.sol | 31 - contracts/ethereum/test/fixtures/shared.ts | 382 ++++++++---- contracts/ethereum/test/integration.ts | 136 +++-- services/keys/scripts/dev.ts | 27 +- services/keys/src/providers/cli.ts | 37 -- services/keys/src/providers/dkg.ts | 68 +-- services/keys/test/validators.test.ts | 25 +- services/users/scripts/seed.ts | 4 +- 26 files changed, 1726 insertions(+), 975 deletions(-) create mode 100644 contracts/ethereum/functions/FunctionsSandboxLibrary/Functions.js create mode 100644 contracts/ethereum/functions/FunctionsSandboxLibrary/Log.js create mode 100644 contracts/ethereum/functions/FunctionsSandboxLibrary/Sandbox.js create mode 100644 contracts/ethereum/functions/FunctionsSandboxLibrary/Validator.js create mode 100644 contracts/ethereum/functions/FunctionsSandboxLibrary/buildRequest.js create mode 100644 contracts/ethereum/functions/FunctionsSandboxLibrary/encryptSecrets.js create mode 100644 contracts/ethereum/functions/FunctionsSandboxLibrary/getRequestConfig.js create mode 100644 contracts/ethereum/functions/FunctionsSandboxLibrary/handler.js create mode 100644 contracts/ethereum/functions/FunctionsSandboxLibrary/index.js create mode 100644 contracts/ethereum/functions/FunctionsSandboxLibrary/simulateRequest.js delete mode 100644 contracts/ethereum/src/mock/MockFunctionsOracle.sol diff --git a/common/helpers/src/index.ts b/common/helpers/src/index.ts index 240b79d36..08e2b86c8 100644 --- a/common/helpers/src/index.ts +++ b/common/helpers/src/index.ts @@ -95,7 +95,7 @@ export function kebabCase(string: string): string { } /** - * Run any shell command with a spawned child process and return a promise. + * Run any shell command with a spawned child process and return a promise * @param fullCommand - The full command to run * @returns A promise that resolves when the command exits */ @@ -113,6 +113,26 @@ export async function run(fullCommand: string) { }) } +/** + * Retry run any shell command with a spawned child process and return a promise + * @param fullCommand - The full command to run + * @param retriesLeft - Number of retries left (default: 5) + * @returns A promise that resolves when the command exits + */ +export async function retryRun(fullCommand: string, retriesLeft: number | undefined = 25) { + if (retriesLeft === 0) { + throw new Error('Command failed after maximum retries') + } + + try { + return await run(fullCommand) + } catch (error) { + await new Promise(resolve => setTimeout(resolve, 5000)) + console.log('Retrying command', fullCommand) + return await retryRun(fullCommand, retriesLeft - 1) + } +} + /** * Retry a fetch request. * @param {RequestInfo} info - URL string or request object @@ -120,9 +140,9 @@ export async function run(fullCommand: string) { * @param {number | undefined} retriesLeft - Number of retries left (default: 5) * @returns {Promise} Response * @example - * const response = await retry('https://example.com') + * const response = await retryFetch('https://example.com') */ -export async function retry(info: RequestInfo, init?: RequestInit, retriesLeft: number | undefined = 25): Promise { +export async function retryFetch(info: RequestInfo, init?: RequestInit, retriesLeft: number | undefined = 25): Promise { if (retriesLeft === 0) { throw new Error('API request failed after maximum retries') } @@ -132,13 +152,13 @@ export async function retry(info: RequestInfo, init?: RequestInit, retriesLeft: if (response.status !== 200) { await new Promise(resolve => setTimeout(resolve, 5000)) console.log('Retrying fetch request to', info, init) - return await retry(info, init || {}, retriesLeft - 1) + return await retryFetch(info, init || {}, retriesLeft - 1) } return response } catch (error) { await new Promise(resolve => setTimeout(resolve, 5000)) console.log('Retrying fetch request to', info, init) - return await retry(info, init || {}, retriesLeft - 1) + return await retryFetch(info, init || {}, retriesLeft - 1) } } diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 5c0a156b5..af78d2a62 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -5,7 +5,7 @@ ### constructor ```solidity -constructor(address casimirManagerAddress) public +constructor(address casimirManagerAddress, address linkFunctionsAddress) public ``` Constructor @@ -15,6 +15,7 @@ Constructor | Name | Type | Description | | ---- | ---- | ----------- | | casimirManagerAddress | address | The manager contract address | +| linkFunctionsAddress | address | | ### checkUpkeep @@ -51,47 +52,35 @@ Perform the upkeep | ---- | ---- | ----------- | | performData | bytes | The data to perform the upkeep | -### getStake - -```solidity -function getStake() external view returns (uint256) -``` - -Get the total manager stake - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The total manager stake | - -### getExecutionSwept +### fulfillRequest ```solidity -function getExecutionSwept() public view returns (int256) +function fulfillRequest(bytes32 requestId, bytes response, bytes err) internal ``` -Get the total manager execution swept amount +Callback that is invoked once the DON has resolved the request or hit an error -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | int256 | The total manager execution swept amount | +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| err | bytes | Aggregated error from the user code or from the execution pipeline Either response or error parameter will be set, but never both | -### getExpectedConsensusStake +### setOracleAddress ```solidity -function getExpectedConsensusStake() external view returns (int256) +function setOracleAddress(address oracle) external ``` -Get the total manager expected consensus stake +Update the functions oracle address -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | int256 | The total manager expected consensus stake | +| oracle | address | New oracle address | ## CasimirManager @@ -108,7 +97,7 @@ enum Token { ### lastPoolId ```solidity -struct Counters.Counter lastPoolId +uint256 lastPoolId ``` Last pool ID generated for a new pool @@ -140,7 +129,7 @@ SSV fee percentage (intial value required) ### constructor ```solidity -constructor(address beaconDepositAddress, address linkFeedAddress, address linkTokenAddress, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public +constructor(address beaconDepositAddress, address linkOracleAddress, address linkTokenAddress, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public ``` Constructor @@ -150,7 +139,7 @@ Constructor | Name | Type | Description | | ---- | ---- | ----------- | | beaconDepositAddress | address | The Beacon deposit address | -| linkFeedAddress | address | The Chainlink data feed address | +| linkOracleAddress | address | The Chainlink functions oracle address | | linkTokenAddress | address | The Chainlink token address | | ssvNetworkAddress | address | The SSV network address | | ssvTokenAddress | address | The SSV token address | @@ -158,14 +147,6 @@ Constructor | swapRouterAddress | address | The Uniswap router address | | wethTokenAddress | address | The WETH contract address | -### receive - -```solidity -receive() external payable -``` - -_Used for mocking sweeps from Beacon to the manager_ - ### reward ```solidity @@ -202,54 +183,34 @@ Withdraw user stake | ---- | ---- | ----------- | | amount | uint256 | The amount of ETH to withdraw | -### inititateWithdrawal +### inititateNextWithdrawal ```solidity -function inititateWithdrawal(address user, uint256 amount) external +function inititateNextWithdrawal() external ``` -Initiate withdrawal of user stake from exited deposits +Initiate the next withdrawal of user stake from exited deposits -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| user | address | The user address | -| amount | uint256 | The amount of ETH to withdraw | - -### completeWithdrawal +### completeNextWithdrawal ```solidity -function completeWithdrawal(address user, uint256 amount) external +function completeNextWithdrawal() external ``` -Withdraw user stake from exited deposits +Complete the next withdrawal of user stake from exited deposits -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| user | address | The user address | -| amount | uint256 | The amount of ETH to withdraw | - -### stakePool +### stakeNextPool ```solidity -function stakePool(uint32 poolId) external +function stakeNextPool() external ``` -Stake a pool - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | +Stake the next ready pool -### requestExit +### requestPoolExit ```solidity -function requestExit(uint32 poolId) external +function requestPoolExit(uint32 poolId) external ``` Request a pool exit @@ -260,10 +221,10 @@ Request a pool exit | ---- | ---- | ----------- | | poolId | uint32 | The staked pool ID | -### completeExit +### completePoolExit ```solidity -function completeExit(uint256 poolStakedIndex, uint256 validatorStakedIndex, uint256 validatorExitingIndex) external +function completePoolExit(uint256 poolStakedIndex, uint256 validatorStakedIndex, uint256 validatorExitingIndex) external ``` Complete a pool exit @@ -276,13 +237,13 @@ Complete a pool exit | validatorStakedIndex | uint256 | The validator's staked index | | validatorExitingIndex | uint256 | The validator's exiting index | -### addValidator +### registerValidator ```solidity -function addValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external +function registerValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external ``` -Add a validator to the pool manager +Register a validator with the pool manager #### Parameters @@ -299,7 +260,7 @@ Add a validator to the pool manager ### setLINKFee ```solidity -function setLINKFee(uint32 newFee) public +function setLINKFee(uint32 newFee) external ``` _Update link fee_ @@ -313,7 +274,7 @@ _Update link fee_ ### setSSVFee ```solidity -function setSSVFee(uint32 newFee) public +function setSSVFee(uint32 newFee) external ``` _Update ssv fee_ @@ -324,223 +285,224 @@ _Update ssv fee_ | ---- | ---- | ----------- | | newFee | uint32 | The new fee | -### getFees +### setOracleAddress ```solidity -function getFees() public view returns (struct ICasimirManager.Fees fees) +function setOracleAddress(address oracle) external ``` -Get the current token fees as percentages +Update the functions oracle address -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| fees | struct ICasimirManager.Fees | The current token fees as percentages | +| oracle | address | New oracle address | -### getLINKFee +### getFees ```solidity -function getLINKFee() public view returns (uint32) +function getFees() public view returns (struct ICasimirManager.Fees fees) ``` -Get the LINK fee percentage to charge on each deposit +Get the current token fees as percentages #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32 | The LINK fee percentage to charge on each deposit | +| fees | struct ICasimirManager.Fees | The current token fees as percentages | -### getSSVFee +### getStake ```solidity -function getSSVFee() public view returns (uint32) +function getStake() public view returns (uint256 stake) ``` -Get the SSV fee percentage to charge on each deposit +Get the total manager stake #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32 | The SSV fee percentage to charge on each deposit | +| stake | uint256 | The total manager stake | -### getStakedValidatorPublicKeys +### getExecutionStake ```solidity -function getStakedValidatorPublicKeys() external view returns (bytes[]) +function getExecutionStake() public view returns (int256 executionStake) ``` -Get staked validator public keys +Get the total manager execution stake #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes[] | A list of active validator public keys | +| executionStake | int256 | The total manager execution stake | -### getReadyValidatorPublicKeys +### getExecutionSwept ```solidity -function getReadyValidatorPublicKeys() external view returns (bytes[]) +function getExecutionSwept() public view returns (int256 executionSwept) ``` -Get ready validator public keys +Get the total manager execution swept amount #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes[] | A list of inactive validator public keys | +| executionSwept | int256 | The total manager execution swept amount | -### getOpenPoolIds +### getExpectedConsensusStake ```solidity -function getOpenPoolIds() external view returns (uint32[]) +function getExpectedConsensusStake() public view returns (int256 expectedConsensusStake) ``` -Get a list of all open pool IDs +Get the total manager expected consensus stake + +_Pending user withdrawal amount is subtracted from the expected stake +The expected stake will be honored with penalty recovery in place_ #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32[] | A list of all open pool IDs | +| expectedConsensusStake | int256 | The total manager expected consensus stake | -### getReadyPoolIds +### getUserStake ```solidity -function getReadyPoolIds() public view returns (uint32[]) +function getUserStake(address userAddress) public view returns (uint256 userStake) ``` -Get a list of all ready pool IDs +Get the total user stake for a given user address + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| userAddress | address | The user address | #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32[] | A list of all ready pool IDs | +| userStake | uint256 | The total user stake | -### getStakedPoolIds +### getLINKFee ```solidity -function getStakedPoolIds() public view returns (uint32[]) +function getLINKFee() external view returns (uint32) ``` -Get a list of all staked pool IDs +Get the LINK fee percentage to charge on each deposit #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32[] | A list of all staked pool IDs | +| [0] | uint32 | The LINK fee percentage to charge on each deposit | -### getStake +### getSSVFee ```solidity -function getStake() public view returns (uint256 stake) +function getSSVFee() external view returns (uint32) ``` -Get the total manager stake +Get the SSV fee percentage to charge on each deposit #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| stake | uint256 | The total manager stake | +| [0] | uint32 | The SSV fee percentage to charge on each deposit | -### getExecutionStake +### getStakedValidatorPublicKeys ```solidity -function getExecutionStake() public view returns (int256 executionStake) +function getStakedValidatorPublicKeys() external view returns (bytes[]) ``` -Get the total manager execution stake +Get staked validator public keys #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| executionStake | int256 | The total manager execution stake | +| [0] | bytes[] | A list of active validator public keys | -### getExecutionSwept +### getReadyValidatorPublicKeys ```solidity -function getExecutionSwept() public view returns (int256 executionSwept) +function getReadyValidatorPublicKeys() external view returns (bytes[]) ``` -Get the total manager execution swept amount +Get ready validator public keys #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| executionSwept | int256 | The total manager execution swept amount | +| [0] | bytes[] | A list of inactive validator public keys | -### getConsensusStake +### getOpenPoolIds ```solidity -function getConsensusStake() public view returns (int256 consensusStake) +function getOpenPoolIds() external view returns (uint32[]) ``` -Get the total manager consensus stake +Get a list of all open pool IDs #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| consensusStake | int256 | The total manager consensus stake | +| [0] | uint32[] | A list of all open pool IDs | -### getExpectedConsensusStake +### getReadyPoolIds ```solidity -function getExpectedConsensusStake() public view returns (int256 expectedConsensusStake) +function getReadyPoolIds() external view returns (uint32[]) ``` -Get the total manager expected consensus stake - -_The expected stake will be honored with slashing recovery in place_ +Get a list of all ready pool IDs #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| expectedConsensusStake | int256 | The total manager expected consensus stake | +| [0] | uint32[] | A list of all ready pool IDs | -### getOpenDeposits +### getStakedPoolIds ```solidity -function getOpenDeposits() public view returns (uint256) +function getStakedPoolIds() external view returns (uint32[]) ``` -Get the total manager open deposits +Get a list of all staked pool IDs #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | The total manager open deposits | +| [0] | uint32[] | A list of all staked pool IDs | -### getUserStake +### getOpenDeposits ```solidity -function getUserStake(address userAddress) public view returns (uint256 userStake) +function getOpenDeposits() external view returns (uint256) ``` -Get the total user stake for a given user address - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| userAddress | address | The user address | +Get the total manager open deposits #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| userStake | uint256 | The total user stake | +| [0] | uint256 | The total manager open deposits | ### getPoolDetails @@ -565,7 +527,7 @@ Get the pool details for a given pool ID ### getAutomationAddress ```solidity -function getAutomationAddress() public view returns (address automationAddress) +function getAutomationAddress() external view returns (address automationAddress) ``` Get the automation address @@ -576,85 +538,14 @@ Get the automation address | ---- | ---- | ----------- | | automationAddress | address | The automation address | -### getPoRAddress - -```solidity -function getPoRAddress() public view returns (address porAddress) -``` - -Get the PoR address - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| porAddress | address | The PoR address | - -## CasimirPoR - -### constructor - -```solidity -constructor(address casimirManagerAddress, address linkFeedAddress) public -``` - -Constructor - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| casimirManagerAddress | address | The manager contract address | -| linkFeedAddress | address | The chainlink PoR feed contract address | - -### getPoRAddressListLength - -```solidity -function getPoRAddressListLength() external view returns (uint256) -``` - -Get the PoR address list length - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The PoR address list length | - -### getPoRAddressList - -```solidity -function getPoRAddressList(uint256 startIndex, uint256 endIndex) external view returns (string[]) -``` - -Get the PoR address list given a start and end index - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | string[] | The PoR address list | - -### getConsensusStake +### receive ```solidity -function getConsensusStake() external view returns (int256) +receive() external payable ``` -Get the total manager consensus stake - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | int256 | The latest total manager consensus stake | +_Will be removed in production +Used for mocking sweeps from Beacon to the manager_ ## ICasimirAutomation @@ -715,6 +606,12 @@ Always validate the data passed in._ | ---- | ---- | ----------- | | performData | bytes | is the data which was passed back from the checkData simulation. If it is encoded, it can easily be decoded into other types by calling `abi.decode`. This data should not be trusted, and should be validated against the contract's current state. | +### setOracleAddress + +```solidity +function setOracleAddress(address oracleAddress) external +``` + ## ICasimirManager ### ProcessedDeposit @@ -766,6 +663,15 @@ struct User { } ``` +### UserWithdrawal + +```solidity +struct UserWithdrawal { + address user; + uint256 amount; +} +``` + ### Validator ```solidity @@ -779,18 +685,6 @@ struct Validator { } ``` -### RewardDistributed - -```solidity -event RewardDistributed(address sender, uint256 ethAmount, uint256 linkAmount, uint256 ssvAmount) -``` - -### UserDeposited - -```solidity -event UserDeposited(address sender, uint256 ethAmount, uint256 linkAmount, uint256 ssvAmount) -``` - ### PoolIncreased ```solidity @@ -815,10 +709,16 @@ event PoolExitRequested(uint32 poolId) event PoolExited(uint32 poolId) ``` -### ValidatorAdded +### RewardDistributed ```solidity -event ValidatorAdded(bytes publicKey) +event RewardDistributed(address sender, uint256 amount) +``` + +### UserDepositDistributed + +```solidity +event UserDepositDistributed(address sender, uint256 amount) ``` ### UserWithdrawalRequested @@ -839,6 +739,12 @@ event UserWithdrawalInitiated(address sender, uint256 amount) event UserWithdrawed(address sender, uint256 amount) ``` +### ValidatorAdded + +```solidity +event ValidatorAdded(bytes publicKey) +``` + ### deposit ```solidity @@ -857,28 +763,46 @@ function reward(uint256 amount) external function withdraw(uint256 amount) external ``` -### stakePool +### stakeNextPool + +```solidity +function stakeNextPool() external +``` + +### requestPoolExit ```solidity -function stakePool(uint32 poolId) external +function requestPoolExit(uint32 poolId) external ``` -### requestExit +### completePoolExit ```solidity -function requestExit(uint32 poolId) external +function completePoolExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) external ``` -### completeExit +### registerValidator ```solidity -function completeExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) external +function registerValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external ``` -### addValidator +### setLINKFee ```solidity -function addValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external +function setLINKFee(uint32 fee) external +``` + +### setSSVFee + +```solidity +function setSSVFee(uint32 fee) external +``` + +### setOracleAddress + +```solidity +function setOracleAddress(address oracleAddress) external ``` ### getFees @@ -941,12 +865,6 @@ function getExecutionStake() external view returns (int256) function getExecutionSwept() external view returns (int256) ``` -### getConsensusStake - -```solidity -function getConsensusStake() external view returns (int256) -``` - ### getExpectedConsensusStake ```solidity @@ -965,62 +883,28 @@ function getOpenDeposits() external view returns (uint256) function getUserStake(address userAddress) external view returns (uint256) ``` -## ICasimirPoR - -### getPoRAddressListLength - -```solidity -function getPoRAddressListLength() external view returns (uint256) -``` - -Get total number of addresses in the list. - -### getPoRAddressList - -```solidity -function getPoRAddressList(uint256 startIndex, uint256 endIndex) external view returns (string[]) -``` - -Get a batch of human-readable addresses from the address list. The requested batch size can be greater -than the actual address list size, in which the full address list will be returned. - -_Due to limitations of gas usage in off-chain calls, we need to support fetching the addresses in batches. -EVM addresses need to be converted to human-readable strings. The address strings need to be in the same format -that would be used when querying the balance of that address._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The index of the first address in the batch. | -| endIndex | uint256 | The index of the last address in the batch. If `endIndex > getPoRAddressListLength()-1`, endIndex need to default to `getPoRAddressListLength()-1`. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | string[] | Array of addresses as strings. | +## Types32Array -### getConsensusStake +### remove ```solidity -function getConsensusStake() external view returns (int256) +function remove(uint32[] arr, uint256 index) internal ``` -## Types32Array +## TypesBytesArray ### remove ```solidity -function remove(uint32[] arr, uint256 index) internal +function remove(bytes[] arr, uint256 index) internal ``` -## TypesBytesArray +## TypesUserWithdrawalArray ### remove ```solidity -function remove(bytes[] arr, uint256 index) internal +function remove(struct ICasimirManager.UserWithdrawal[] arr, uint256 index) internal ``` ## Functions @@ -1812,23 +1696,6 @@ Query the current deposit count. | ---- | ---- | ----------- | | [0] | bytes | The deposit count encoded as a little endian 64-bit number. | -## ISSVToken - -### mint - -```solidity -function mint(address to, uint256 amount) external -``` - -Mint tokens - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| to | address | The target address | -| amount | uint256 | The amount of token to mint | - ## IWETH9 ### deposit @@ -2463,83 +2330,3 @@ function checkUpkeep(uint256 upkeepId) external view returns (bool upkeepNeeded, function checkUpkeep(uint256 upkeepId) external returns (bool upkeepNeeded, bytes performData, enum UpkeepFailureReason upkeepFailureReason, uint256 gasUsed, uint256 fastGasWei, uint256 linkNative) ``` -## MockAggregator - -### version - -```solidity -uint256 version -``` - -### description - -```solidity -string description -``` - -### decimals - -```solidity -uint8 decimals -``` - -### latestAnswer - -```solidity -int256 latestAnswer -``` - -### latestTimestamp - -```solidity -uint256 latestTimestamp -``` - -### latestRound - -```solidity -uint256 latestRound -``` - -### getAnswer - -```solidity -mapping(uint256 => int256) getAnswer -``` - -### getTimestamp - -```solidity -mapping(uint256 => uint256) getTimestamp -``` - -### constructor - -```solidity -constructor(uint8 _decimals, int256 _initialAnswer) public -``` - -### updateAnswer - -```solidity -function updateAnswer(int256 _answer) public -``` - -### updateRoundData - -```solidity -function updateRoundData(uint80 _roundId, int256 _answer, uint256 _timestamp, uint256 _startedAt) public -``` - -### getRoundData - -```solidity -function getRoundData(uint80 _roundId) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) -``` - -### latestRoundData - -```solidity -function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) -``` - diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/Functions.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/Functions.js new file mode 100644 index 000000000..089807e87 --- /dev/null +++ b/contracts/ethereum/functions/FunctionsSandboxLibrary/Functions.js @@ -0,0 +1,143 @@ +"use strict" +var __importDefault = + (this && this.__importDefault) || + function (mod) { + return mod && mod.__esModule ? mod : { default: mod } + } +var _a +Object.defineProperty(exports, "__esModule", { value: true }) +exports.FunctionsModule = void 0 +const axios_1 = __importDefault(require("axios")) +class FunctionsModule { + constructor() { + this.buildFunctionsmodule = (numAllowedQueries) => { + return { + makeHttpRequest: this.makeHttpRequestFactory(numAllowedQueries), + encodeUint256: FunctionsModule.encodeUint256, + encodeInt256: FunctionsModule.encodeInt256, + encodeString: FunctionsModule.encodeString, + } + } + this.makeHttpRequestFactory = (maxHttpRequests) => { + let totalHttpRequests = 0 + return async ({ + url, + method = "get", + params, + headers, + data, + // Default timeout of 5 seconds + timeout = 5000, + responseType = "json", + }) => { + if (totalHttpRequests < maxHttpRequests) { + totalHttpRequests++ + let result + if (timeout > 9000) { + throw Error("HTTP request timeout >9000") + } + if (url.length > 2048) { + throw Error("HTTP request URL length >2048") + } + try { + result = await (0, axios_1.default)({ + method: method.toLowerCase(), + url, + params, + headers, + data, + timeout, + responseType, + maxBodyLength: 2000, + maxContentLength: 2000000, // Max response size: 2 megabytes + }) + // Delete the request to avoid exposing system information to the user's code + delete result.request + delete result.config + result.error = false + return result + } catch (untypedError) { + const error = untypedError + delete error.request + delete error.config + if (error.response) { + delete error.response.request + } + error.error = true + return error + } + } + throw Error("exceeded numAllowedQueries") + } + } + } + get userHttpQueries() { + return [] + } +} +exports.FunctionsModule = FunctionsModule +_a = FunctionsModule +FunctionsModule.encodeUint256 = (result) => { + if (typeof result === "number") { + if (!Number.isInteger(result)) { + throw Error("encodeUint256 invalid input") + } + if (result < 0) { + throw Error("encodeUint256 invalid input") + } + return _a.encodeUint256(BigInt(result)) + } + if (typeof result === "bigint") { + if (result > _a.maxUint256) { + throw Error("encodeUint256 invalid input") + } + if (result < BigInt(0)) { + throw Error("encodeUint256 invalid input") + } + if (result === BigInt(0)) { + return Buffer.from("0000000000000000000000000000000000000000000000000000000000000000", "hex") + } + const hex = result.toString(16).padStart(64, "0") + return Buffer.from(hex, "hex") + } + throw Error("encodeUint256 invalid input") +} +FunctionsModule.encodeInt256 = (result) => { + if (typeof result === "number") { + if (!Number.isInteger(result)) { + throw Error("encodeInt256 invalid input") + } + return _a.encodeInt256(BigInt(result)) + } + if (typeof result !== "bigint") { + throw Error("encodeInt256 invalid input") + } + if (result < _a.maxNegInt256) { + throw Error("encodeInt256 invalid input") + } + if (result > _a.maxPosInt256) { + throw Error("encodeInt256 invalid input") + } + if (result < BigInt(0)) { + return _a.encodeNegSignedInt(result) + } + return _a.encodePosSignedInt(result) +} +FunctionsModule.encodeString = (result) => { + if (typeof result !== "string") { + throw Error("encodeString invalid input") + } + return Buffer.from(result) +} +FunctionsModule.encodePosSignedInt = (int) => { + const hex = int.toString(16).padStart(64, "0") + return Buffer.from(hex, "hex") +} +FunctionsModule.encodeNegSignedInt = (int) => { + const overflowingHex = (BigInt(2) ** BigInt(256) + int).toString(16) + const int256Hex = overflowingHex.slice(-64) + return Buffer.from(int256Hex, "hex") +} +FunctionsModule.maxUint256 = BigInt("115792089237316195423570985008687907853269984665640564039457584007913129639935") +FunctionsModule.maxPosInt256 = BigInt("57896044618658097711785492504343953926634992332820282019728792003956564819967") +FunctionsModule.maxNegInt256 = BigInt("-57896044618658097711785492504343953926634992332820282019728792003956564819968") diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/Log.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/Log.js new file mode 100644 index 000000000..6210ff516 --- /dev/null +++ b/contracts/ethereum/functions/FunctionsSandboxLibrary/Log.js @@ -0,0 +1,59 @@ +"use strict" +Object.defineProperty(exports, "__esModule", { value: true }) +exports.Log = void 0 +class Log {} +exports.Log = Log +Log.error = (message, requestId) => + console.log( + JSON.stringify({ + logLevel: "error", + timestamp: Date.now(), + message, + requestId, + }) + ) +Log.warn = (message, requestId) => + console.log( + JSON.stringify({ + logLevel: "warn", + timestamp: Date.now(), + message, + requestId, + }) + ) +Log.info = (message, requestId) => { + if (process.env["LOG_LEVEL"] && process.env["LOG_LEVEL"]?.toLowerCase() !== "false") { + console.log( + JSON.stringify({ + logLevel: "info", + timestamp: Date.now(), + message, + requestId, + }) + ) + } +} +Log.debug = (message, requestId) => { + if (process.env["LOG_LEVEL"]?.toLowerCase() === "debug" || process.env["LOG_LEVEL"]?.toLowerCase() === "trace") { + console.log( + JSON.stringify({ + logLevel: "debug", + timestamp: Date.now(), + message, + requestId, + }) + ) + } +} +Log.trace = (message, requestId) => { + if (process.env["LOG_LEVEL"]?.toLowerCase() === "trace") { + console.log( + JSON.stringify({ + logLevel: "trace", + timestamp: Date.now(), + message, + requestId, + }) + ) + } +} diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/Sandbox.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/Sandbox.js new file mode 100644 index 000000000..b36a8bb15 --- /dev/null +++ b/contracts/ethereum/functions/FunctionsSandboxLibrary/Sandbox.js @@ -0,0 +1,81 @@ +"use strict" +var __importDefault = + (this && this.__importDefault) || + function (mod) { + return mod && mod.__esModule ? mod : { default: mod } + } +Object.defineProperty(exports, "__esModule", { value: true }) +exports.SandboxError = exports.Sandbox = void 0 +const fs_1 = __importDefault(require("fs")) +const os_1 = __importDefault(require("os")) +const path_1 = __importDefault(require("path")) +const vm2_1 = require("vm2") +const Functions_1 = require("./Functions") +class Sandbox { + constructor(disableTmpClearing, enableSandboxedLogging) { + this.disableTmpClearing = disableTmpClearing + this.enableSandboxedLogging = enableSandboxedLogging + } + async evaluate(numAllowedQueries, javascriptString, args, secrets) { + const functionsModule = new Functions_1.FunctionsModule() + const Functions = functionsModule.buildFunctionsmodule(numAllowedQueries) + // Clear the tmp directory before running the untrusted code to ensure + // it does not have access to any cached data from the previously run script + // in the case that the previous script exited prematurely. + this.clearTmpDirectory() + const vm = new vm2_1.NodeVM({ + sandbox: { args, secrets, Functions }, + console: `${this.enableSandboxedLogging ? "inherit" : "off"}`, + eval: false, + wasm: false, + require: { + builtin: ["buffer", "crypto", "querystring", "string_decoder", "url", "util"], + }, + }) + let functionScript + // Try to compile the provided JavaScript code. + try { + functionScript = new vm2_1.VMScript("module.exports = async function () {\n" + javascriptString + "\n}").compile() + } catch (untypedError) { + const error = untypedError + throw new SandboxError(error.name, error.message, error.stack) + } + if (this.enableSandboxedLogging) { + console.log("\n__Console log messages from sandboxed code__") + } + // Try to run the provided JavaScript code. + let sandboxedFunction + let result + try { + sandboxedFunction = await vm.run(functionScript) + result = await sandboxedFunction() + } catch (untypedError) { + const error = untypedError + throw new SandboxError(error.name, error.message, error.stack, functionsModule.userHttpQueries) + } + // Clear the tmp directory after running the code to ensure it does not + // leave any cached data on the FaaS instance. + this.clearTmpDirectory() + return { result, userHttpQueries: functionsModule.userHttpQueries } + } + clearTmpDirectory() { + if (this.disableTmpClearing) { + return + } + fs_1.default.readdirSync(os_1.default.tmpdir()).forEach((dirent) => { + try { + fs_1.default.rmSync(path_1.default.join(os_1.default.tmpdir(), dirent), { recursive: true }) + } catch {} + }) + } +} +exports.Sandbox = Sandbox +class SandboxError { + constructor(name, message, details, userHttpQueries) { + this.name = name + this.message = message + this.details = details + this.userHttpQueries = userHttpQueries + } +} +exports.SandboxError = SandboxError diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/Validator.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/Validator.js new file mode 100644 index 000000000..d1cf8d581 --- /dev/null +++ b/contracts/ethereum/functions/FunctionsSandboxLibrary/Validator.js @@ -0,0 +1,69 @@ +"use strict" +Object.defineProperty(exports, "__esModule", { value: true }) +exports.Validator = void 0 +class Validator { + constructor(defaultMaxResponseBytes, defaultMaxHttpQueries) { + this.defaultMaxResponseBytes = defaultMaxResponseBytes + this.defaultMaxHttpQueries = defaultMaxHttpQueries + this.isValidInput = (input) => { + const validInput = input + if (typeof validInput.source !== "string") { + throw Error("source param is missing") + } + if (validInput.requestId && typeof validInput.requestId !== "string") { + throw Error("requestId param not a string or number") + } + if (validInput.numAllowedQueries) { + if (typeof validInput.numAllowedQueries !== "number" || !Number.isInteger(validInput.numAllowedQueries)) { + throw Error("numAllowedQueries not integer") + } + } else { + validInput.numAllowedQueries = this.defaultMaxHttpQueries + } + if (validInput.args) { + if (!Array.isArray(validInput.args)) { + throw Error("args param not an array") + } + for (const arg of validInput.args) { + if (typeof arg !== "string") { + throw Error("args param not a string array") + } + } + } + if ( + validInput.secrets && + (typeof validInput.secrets !== "object" || + !Object.values(validInput.secrets).every((s) => { + return typeof s === "string" + })) + ) { + throw Error("secrets param not a string map") + } + this.maxResponseBytes = this.defaultMaxResponseBytes + if (validInput.maxResponseBytes) { + if (typeof validInput.maxResponseBytes !== "number" || !Number.isInteger(validInput.maxResponseBytes)) { + throw Error("maxResponseBytes not integer") + } + this.maxResponseBytes = validInput.maxResponseBytes + } + return true + } + this.getValidOutput = (sandboxOutput) => { + if (Buffer.isBuffer(sandboxOutput.result)) { + if (sandboxOutput.result.length <= this.maxResponseBytes) { + return sandboxOutput.result + } + throw Error(`returned Buffer >${this.maxResponseBytes} bytes`) + } + throw Error("returned value not a Buffer") + } + this.encodeResponse = (result) => { + if (result.length === 0) { + return "0x0" + } + return "0x" + result.toString("hex") + } + this.maxResponseBytes = defaultMaxResponseBytes + } +} +exports.Validator = Validator diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/buildRequest.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/buildRequest.js new file mode 100644 index 000000000..5975eea1e --- /dev/null +++ b/contracts/ethereum/functions/FunctionsSandboxLibrary/buildRequest.js @@ -0,0 +1,17 @@ +"use strict" +Object.defineProperty(exports, "__esModule", { value: true }) +exports.buildRequest = void 0 +const getRequestConfig_1 = require("./getRequestConfig") +const encryptSecrets_1 = require("./encryptSecrets") +const buildRequest = async (unvalidatedConfig) => { + const config = (0, getRequestConfig_1.getRequestConfig)(unvalidatedConfig) + const request = { source: config.source } + if (config.secretsURLs && config.secretsURLs.length > 0) { + request.secrets = "0x" + (await (0, encryptSecrets_1.encrypt)(config.DONPublicKey, config.secretsURLs.join(" "))) + } + if (config.args) { + request.args = config.args + } + return request +} +exports.buildRequest = buildRequest diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/encryptSecrets.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/encryptSecrets.js new file mode 100644 index 000000000..8c01c7f05 --- /dev/null +++ b/contracts/ethereum/functions/FunctionsSandboxLibrary/encryptSecrets.js @@ -0,0 +1,23 @@ +"use strict" +var __importDefault = + (this && this.__importDefault) || + function (mod) { + return mod && mod.__esModule ? mod : { default: mod } + } +Object.defineProperty(exports, "__esModule", { value: true }) +exports.encrypt = exports.encryptWithSignature = void 0 +const eth_crypto_1 = __importDefault(require("eth-crypto")) +const encryptWithSignature = async (signerPrivateKey, readerPublicKey, message) => { + const signature = eth_crypto_1.default.sign(signerPrivateKey, eth_crypto_1.default.hash.keccak256(message)) + const payload = { + message, + signature, + } + return await (0, exports.encrypt)(readerPublicKey, JSON.stringify(payload)) +} +exports.encryptWithSignature = encryptWithSignature +const encrypt = async (readerPublicKey, message) => { + const encrypted = await eth_crypto_1.default.encryptWithPublicKey(readerPublicKey, message) + return eth_crypto_1.default.cipher.stringify(encrypted) +} +exports.encrypt = encrypt diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/getRequestConfig.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/getRequestConfig.js new file mode 100644 index 000000000..3b7df89f1 --- /dev/null +++ b/contracts/ethereum/functions/FunctionsSandboxLibrary/getRequestConfig.js @@ -0,0 +1,90 @@ +"use strict" +var __importDefault = + (this && this.__importDefault) || + function (mod) { + return mod && mod.__esModule ? mod : { default: mod } + } +Object.defineProperty(exports, "__esModule", { value: true }) +exports.getRequestConfig = exports.Location_ = void 0 +const is_http_url_1 = __importDefault(require("is-http-url")) +var Location_ +;(function (Location_) { + Location_[(Location_["Inline"] = 0)] = "Inline" + Location_[(Location_["Remote"] = 1)] = "Remote" +})((Location_ = exports.Location_ || (exports.Location_ = {}))) +var CodeLanguage +;(function (CodeLanguage) { + CodeLanguage[(CodeLanguage["JavaScript"] = 0)] = "JavaScript" +})(CodeLanguage || (CodeLanguage = {})) +const getRequestConfig = (unvalidatedConfig) => { + const config = unvalidatedConfig + if (config.codeLocation !== Location_.Inline) { + throw Error(`codeLocation is not correctly specified in config`) + } + if (config.codeLanguage !== CodeLanguage.JavaScript) { + throw Error(`codeLanguage is not correctly specified in config`) + } + if (typeof config.source !== "string") { + throw Error(`source is not correctly specified in config`) + } + if (config.numAllowedQueries) { + if (typeof config.numAllowedQueries !== "number" || !Number.isInteger(config.numAllowedQueries)) { + throw Error(`numAllowedQueries is not correctly specified in config`) + } + } + if (config.secrets) { + if (typeof config.secrets !== "object") { + throw Error("secrets object is not correctly specified in config") + } + for (const secret in config.secrets) { + if (typeof config.secrets[secret] !== "string") { + throw Error("Secrets object is not correctly specified in config. It can only contain string values.") + } + } + } + if (config.secretsURLs && config.secretsURLs.length > 0) { + if (!Array.isArray(config.secretsURLs)) { + throw Error("secretsURLs array is not correctly specified in config") + } + config.secretsURLs.forEach((s) => { + if (!(0, is_http_url_1.default)(s)) { + throw Error(`invalid HTTP or HTTPs URL ${s} in secretsURLs specified in config`) + } + }) + if (typeof config.walletPrivateKey !== "string") { + throw Error(`walletPrivateKey is not correctly specified in config`) + } + if (config.DONPublicKey && typeof config.DONPublicKey !== "string") { + throw Error(`DONPublicKey is not correctly specified in config`) + } + } + if (config.args) { + if (!Array.isArray(config.args)) throw Error(`args array is not correctly specified in config`) + for (const arg of config.args) { + if (typeof arg !== "string") { + throw Error(`an element of the args array is not a string in config`) + } + } + } + if (config.maxResponseBytes) { + if (typeof config.maxResponseBytes !== "number" || !Number.isInteger(config.maxResponseBytes)) { + throw Error(`maxResponseBytes is not correctly specified in config`) + } + } + if (config.expectedReturnType) { + if (typeof config.expectedReturnType !== "string") { + throw Error(`expectedReturnType is not correctly specified in config`) + } + switch (config.expectedReturnType) { + case "uint256": + case "int256": + case "string": + case "Buffer": + break + default: + throw Error(`expectedReturnType is not correctly specified in config`) + } + } + return config +} +exports.getRequestConfig = getRequestConfig diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/handler.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/handler.js new file mode 100644 index 000000000..1418a77e3 --- /dev/null +++ b/contracts/ethereum/functions/FunctionsSandboxLibrary/handler.js @@ -0,0 +1,92 @@ +"use strict" +var __importDefault = + (this && this.__importDefault) || + function (mod) { + return mod && mod.__esModule ? mod : { default: mod } + } +Object.defineProperty(exports, "__esModule", { value: true }) +exports.handler = void 0 +const process_1 = __importDefault(require("process")) +const Log_1 = require("./Log") +const Validator_1 = require("./Validator") +const Sandbox_1 = require("./Sandbox") +const validator = new Validator_1.Validator( + parseInt(process_1.default.env["DEFAULT_MAX_RESPONSE_BYTES"] ?? "256"), + parseInt(process_1.default.env["DEFAULT_MAX_HTTP_QUERIES"] ?? "5") +) +const handler = async (event, _) => { + // Validate the request + try { + // This is wrapped in an `if` statement for TypeScript's type checking system + if (!validator.isValidInput(event)) { + throw Error("isValidInput should never return false.") + } + } catch (untypedError) { + const error = untypedError + Log_1.Log.debug(error.toString()) + return buildResult({ + error: { + name: "Invalid Input", + message: `${error.message}`, + }, + }) + } + Log_1.Log.trace("Valid Event Initiated", event.requestId) + const sandbox = new Sandbox_1.Sandbox( + process_1.default.env["DISABLE_TMP_CLEAR_FOR_TESTING"] === "true", + process_1.default.env["ENABLE_CONSOLE_LOG_FROM_SANDBOX"] === "true" + ) + // Execute the user-provided code in the sandbox + let output + try { + output = await sandbox.evaluate(event.numAllowedQueries, event.source, event.args, event.secrets) + } catch (untypedError) { + const sandboxError = untypedError + Log_1.Log.trace(JSON.stringify(sandboxError), event.requestId) + return buildResult({ + error: { ...sandboxError }, + }) + } + // Place in a try-catch in case of a cyclic reference in the returned object (or some other error) + try { + Log_1.Log.trace(`Sandbox Output: ${JSON.stringify(output)}`, event.requestId) + } catch { + Log_1.Log.debug( + "Sandbox output cannot be stringified (likely due to a circular reference in returned value)", + event.requestId + ) + return buildResult({ + error: { + name: "Output Validation Error", + message: `returned type ${typeof output} is not supported`, + userHttpQueries: output.userHttpQueries, + }, + }) + } + let result + try { + result = validator.getValidOutput(output) + } catch (untypedError) { + const error = untypedError + Log_1.Log.trace(`Invalid Output: ${JSON.stringify(output)}`, event.requestId) + return buildResult({ + error: { + name: "Output Validation Error", + message: error.message, + }, + }) + } + const success = validator.encodeResponse(result) + Log_1.Log.trace(`Success: ${success}`) + return buildResult({ + success, + userHttpQueries: output.userHttpQueries, + }) +} +exports.handler = handler +const buildResult = (result) => { + return { + statusCode: 200, + body: JSON.stringify(result), + } +} diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/index.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/index.js new file mode 100644 index 000000000..7ed92864f --- /dev/null +++ b/contracts/ethereum/functions/FunctionsSandboxLibrary/index.js @@ -0,0 +1,30 @@ +"use strict" +Object.defineProperty(exports, "__esModule", { value: true }) +exports.getRequestConfig = exports.buildRequest = exports.getDecodedResultLog = exports.simulateRequest = void 0 +var simulateRequest_1 = require("./simulateRequest") +Object.defineProperty(exports, "simulateRequest", { + enumerable: true, + get: function () { + return simulateRequest_1.simulateRequest + }, +}) +Object.defineProperty(exports, "getDecodedResultLog", { + enumerable: true, + get: function () { + return simulateRequest_1.getDecodedResultLog + }, +}) +var buildRequest_1 = require("./buildRequest") +Object.defineProperty(exports, "buildRequest", { + enumerable: true, + get: function () { + return buildRequest_1.buildRequest + }, +}) +var getRequestConfig_1 = require("./getRequestConfig") +Object.defineProperty(exports, "getRequestConfig", { + enumerable: true, + get: function () { + return getRequestConfig_1.getRequestConfig + }, +}) diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/simulateRequest.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/simulateRequest.js new file mode 100644 index 000000000..5c98bd4bd --- /dev/null +++ b/contracts/ethereum/functions/FunctionsSandboxLibrary/simulateRequest.js @@ -0,0 +1,79 @@ +"use strict" +Object.defineProperty(exports, "__esModule", { value: true }) +exports.getDecodedResultLog = exports.simulateRequest = void 0 +const getRequestConfig_1 = require("./getRequestConfig") +const handler_1 = require("./handler") +const simulateRequest = async (unvalidatedConfig) => { + const config = (0, getRequestConfig_1.getRequestConfig)(unvalidatedConfig) + const savedEnv = { + DISABLE_TMP_CLEAR_FOR_TESTING: process.env["DISABLE_TMP_CLEAR_FOR_TESTING"], + ENABLE_CONSOLE_LOG_FROM_SANDBOX: process.env["ENABLE_CONSOLE_LOG_FROM_SANDBOX"], + } + process.env["DISABLE_TMP_CLEAR_FOR_TESTING"] = "true" + process.env["ENABLE_CONSOLE_LOG_FROM_SANDBOX"] = "true" + const timeout = setTimeout(() => { + throw Error("Runtime of 15 seconds for sandboxed source code has been exceeded") + }, 15000) + const resultString = ( + await (0, handler_1.handler)({ + source: config.source, + numAllowedQueries: config.numAllowedQueries, + args: config.args, + secrets: config.secrets, + maxResponseBytes: config.maxResponseBytes, + }) + ).body + clearTimeout(timeout) + for (const envVar in savedEnv) { + process.env[envVar] = savedEnv[envVar] + } + const result = JSON.parse(resultString) + if (result.success) { + return { + success: true, + result: result.success, + resultLog: `__Output from sandboxed source code__\nOutput represented as a hex string: ${result.success}\n${(0, + exports.getDecodedResultLog)(config, result.success)}`, + } + } + const { message } = result.error + const errorString = `${message}`.slice(0, config.maxResponseBytes) + return { + success: false, + result: `0x${Buffer.from(errorString).toString("hex")}`, + resultLog: `__Error thrown in sandboxed source code__\n${message}\n`, + } +} +exports.simulateRequest = simulateRequest +const getDecodedResultLog = (config, successResult) => { + let resultLog = "" + if (config.expectedReturnType && config.expectedReturnType !== "Buffer") { + let decodedOutput + switch (config.expectedReturnType) { + case "uint256": + decodedOutput = BigInt("0x" + successResult.slice(2).slice(-64)) + break + case "int256": + decodedOutput = signedInt256toBigInt("0x" + successResult.slice(2).slice(-64)) + break + case "string": + decodedOutput = Buffer.from(successResult.slice(2), "hex").toString() + break + default: + const end = config.expectedReturnType + throw new Error(`unused expectedReturnType ${end}`) + } + const decodedOutputLog = `Decoded as a ${config.expectedReturnType}: ${decodedOutput}` + resultLog += `${decodedOutputLog}\n` + } + return resultLog +} +exports.getDecodedResultLog = getDecodedResultLog +const signedInt256toBigInt = (hex) => { + const binary = BigInt(hex).toString(2).padStart(256, "0") + // if the first bit is 0, number is positive + if (binary[0] === "0") { + return BigInt(hex) + } + return -(BigInt(2) ** BigInt(255)) + BigInt(`0b${binary.slice(1)}`) +} diff --git a/contracts/ethereum/hardhat.config.ts b/contracts/ethereum/hardhat.config.ts index 52ce60e53..e71a63d12 100644 --- a/contracts/ethereum/hardhat.config.ts +++ b/contracts/ethereum/hardhat.config.ts @@ -26,9 +26,10 @@ const forkingChainId = { mainnet: 1, goerli: 5 }[forkingNetwork] const externalEnv = { mainnet: { BEACON_DEPOSIT_ADDRESS: '0x00000000219ab540356cBB839Cbe05303d7705Fa', - LINK_ORACLE_ADDRESS: '', LINK_TOKEN_ADDRESS: '0x514910771AF9Ca656af840dff83E8264EcF986CA', - SSV_NETWORK_ADDRESS: '', + ORACLE_ADDRESS: '0x0000000000000000000000000000000000000000', + ORACLE_SUB_ID: '1', + SSV_NETWORK_ADDRESS: '0x0000000000000000000000000000000000000000', SSV_TOKEN_ADDRESS: '0x9D65fF81a3c488d585bBfb0Bfe3c7707c7917f54', SWAP_FACTORY_ADDRESS: '0x1F98431c8aD98523631AE4a59f267346ea31F984', SWAP_ROUTER_ADDRESS: '0xE592427A0AEce92De3Edee1F18E0157C05861564', @@ -36,8 +37,9 @@ const externalEnv = { }, goerli: { BEACON_DEPOSIT_ADDRESS: '0x07b39F4fDE4A38bACe212b546dAc87C58DfE3fDC', - LINK_ORACLE_ADDRESS: '0x3de1bE9407645533CD0CbeCf88dFE5297E7125e6', LINK_TOKEN_ADDRESS: '0x326C977E6efc84E512bB9C30f76E30c160eD06FB', + ORACLE_ADDRESS: '0x3de1bE9407645533CD0CbeCf88dFE5297E7125e6', + ORACLE_SUB_ID: '1', SSV_NETWORK_ADDRESS: '0xb9e155e65B5c4D66df28Da8E9a0957f06F11Bc04', SSV_TOKEN_ADDRESS: '0x3a9f01091C446bdE031E39ea8354647AFef091E7', SWAP_FACTORY_ADDRESS: '0x1F98431c8aD98523631AE4a59f267346ea31F984', diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index beec22de9..a4d557c9b 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -7,14 +7,15 @@ import { ethers } from 'hardhat' void async function () { let casimirManager: CasimirManager | undefined let mockFunctionsOracle: MockFunctionsOracle | undefined - const [, , , , , distributor] = await ethers.getSigners() + const [, , , , , chainlink] = await ethers.getSigners() let config: DeploymentConfig = { CasimirManager: { address: '', args: { beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, - linkOracleAddress: process.env.LINK_ORACLE_ADDRESS, linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, + oracleAddress: process.env.ORACLE_ADDRESS, + oracleSubId: process.env.ORACLE_SUB_ID, ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, ssvTokenAddress: process.env.SSV_TOKEN_ADDRESS, swapFactoryAddress: process.env.SWAP_FACTORY_ADDRESS, @@ -35,12 +36,6 @@ void async function () { options: {}, proxy: false }, - MockKeeperRegistry: { - address: '', - args: {}, - options: {}, - proxy: false - }, ...config } } @@ -50,7 +45,7 @@ void async function () { /** Link mock external contracts to Casimir */ if (name === 'CasimirManager') { - (config[name as keyof typeof config] as ContractConfig).args.linkOracleAddress = config.MockFunctionsOracle?.address + (config[name as keyof typeof config] as ContractConfig).args.oracleAddress = config.MockFunctionsOracle?.address } const { args, options, proxy } = config[name as keyof typeof config] as ContractConfig @@ -111,12 +106,12 @@ void async function () { if (activeValidatorPublicKeys?.length) { console.log(`Distributing rewards from ${activeValidatorPublicKeys.length} active validators...`) const rewardAmount = (rewardPerValidator * activeValidatorPublicKeys.length).toString() - const reward = await distributor.sendTransaction({ to: casimirManager?.address, value: ethers.utils.parseEther(rewardAmount) }) + const reward = await chainlink.sendTransaction({ to: casimirManager?.address, value: ethers.utils.parseEther(rewardAmount) }) await reward.wait() /** Perform upkeep (todo add bounds to check data) */ const checkData = ethers.utils.defaultAbiCoder.encode(['string'], ['']) - const { ...check } = await casimirAutomation.checkUpkeep(checkData) + const { ...check } = await casimirAutomation.connect(chainlink).checkUpkeep(checkData) const { upkeepNeeded, performData } = check if (upkeepNeeded) { const performUpkeep = await casimirAutomation.performUpkeep(performData) @@ -131,10 +126,10 @@ void async function () { /** Perform upkeep (todo add bounds to check data) */ const checkData = ethers.utils.defaultAbiCoder.encode(['string'], ['']) - const { ...check } = await casimirAutomation.checkUpkeep(checkData) + const { ...check } = await casimirAutomation.connect(chainlink).checkUpkeep(checkData) const { upkeepNeeded, performData } = check if (upkeepNeeded) { - const performUpkeep = await casimirAutomation.performUpkeep(performData) + const performUpkeep = await casimirAutomation.connect(chainlink).performUpkeep(performData) await performUpkeep.wait() } diff --git a/contracts/ethereum/src/CasimirAutomation.sol b/contracts/ethereum/src/CasimirAutomation.sol index 7fccd2d44..79174f564 100644 --- a/contracts/ethereum/src/CasimirAutomation.sol +++ b/contracts/ethereum/src/CasimirAutomation.sol @@ -6,7 +6,6 @@ import "./interfaces/ICasimirManager.sol"; import {Functions, FunctionsClient} from "./vendor/FunctionsClient.sol"; // import "@chainlink/contracts/src/v0.8/dev/functions/FunctionsClient.sol"; // Once published import "@openzeppelin/contracts/access/Ownable.sol"; -import "@openzeppelin/contracts/utils/math/SafeCast.sol"; // Dev-only imports import "hardhat/console.sol"; @@ -32,31 +31,50 @@ import "hardhat/console.sol"; * @title Oracle contract that triggers and handles actions */ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { + /*************/ + /* Libraries */ + /*************/ - /*************/ + using Functions for Functions.Request; + + /*************/ /* Constants */ /*************/ - /* Reward threshold (0.1 ETH) */ - uint256 private constant rewardThreshold = 100000000000000000; + /** Oracle heartbeat */ + uint256 public constant oracleHeartbeat = 0; // Will use ~half a day in production + /** Oracle threshold */ + uint256 public constant oracleThreshold = 16 ether; + /** Compound threshold (0.1 ETH) */ + uint256 public constant compoundThreshold = 100000000000000000; /*************/ /* Contracts */ /*************/ - /* Manager contract */ - ICasimirManager private immutable casimirManager; + /** Manager contract */ + ICasimirManager private immutable manager; /********************/ /* Dynamic State */ /********************/ - /* Latest functions response */ + /** Serialized oracle source code */ + bytes public requestCBOR; + /** Latest oracle request ID */ + bytes32 public latestRequestId; + /** Latest oracle response */ bytes private latestResponse; - /* Latest functions error */ + /** Latest oracle response timestamp */ + uint256 private latestResponseTimestamp; + /** Latest oracle error */ bytes private latestError; - /* Latest functions response count */ + /** Latest oracle response count */ uint256 private responseCounter; + /** Oracle fulfillment gas limit */ + uint32 fulfillGasLimit; + /** Oracle subscription ID */ + uint64 private oracleSubId; /***************/ /* Constructor */ @@ -64,85 +82,178 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { /** * Constructor - * @param casimirManagerAddress The manager contract address + * @param managerAddress The manager contract address + * @param oracleAddress The oracle contract address + * @param _oracleSubId The oracle subscription ID + */ + constructor( + address managerAddress, + address oracleAddress, + uint64 _oracleSubId + ) FunctionsClient(oracleAddress) { + manager = ICasimirManager(managerAddress); + oracleSubId = _oracleSubId; + } + + /** + * @notice Generate a new Functions.Request(off-chain, saving gas) + * @param source JavaScript source code + * @param secrets Encrypted secrets payload + * @param args List of arguments accessible from within the source code */ - constructor(address casimirManagerAddress, address linkFunctionsAddress) FunctionsClient(linkFunctionsAddress) { - casimirManager = ICasimirManager(casimirManagerAddress); + function generateRequest( + string calldata source, + bytes calldata secrets, + string[] calldata args + ) public pure returns (bytes memory) { + Functions.Request memory req; + req.initializeRequest( + Functions.Location.Inline, + Functions.CodeLanguage.JavaScript, + source + ); + if (secrets.length > 0) { + req.addRemoteSecrets(secrets); + } + if (args.length > 0) { + req.addArgs(args); + } + + return req.encodeCBOR(); + } + + /** + * @notice Set the bytes representing the CBOR-encoded Functions.Request + * @param _fulfillGasLimit Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function + * @param _oracleSubId The oracle billing subscription ID used to pay for Functions requests + * @param _requestCBOR Bytes representing the CBOR-encoded Functions.Request + */ + function setRequest( + uint32 _fulfillGasLimit, + uint64 _oracleSubId, + bytes calldata _requestCBOR + ) external onlyOwner { + fulfillGasLimit = _fulfillGasLimit; + oracleSubId = _oracleSubId; + requestCBOR = _requestCBOR; } /** * @notice Check if the upkeep is needed - * @param checkData The data to check the upkeep * @return upkeepNeeded True if the upkeep is needed - * @return performData The data to perform the upkeep */ function checkUpkeep( - bytes calldata checkData + bytes memory ) - external + public view override returns (bool upkeepNeeded, bytes memory performData) { - console.log(abi.decode(checkData, (string))); + /** Get whether heartbeat interval is lapsed */ + if ((block.timestamp - latestResponseTimestamp) >= oracleHeartbeat) { + upkeepNeeded = true; + } + + /** Get pools ready to stake */ + uint32[] memory readyPoolIds = manager.getReadyPoolIds(); - /** Get ready pools to stake */ - uint32[] memory readyPoolIds = casimirManager.getReadyPoolIds(); + /** Need upkeep for staking */ if (readyPoolIds.length > 0) { upkeepNeeded = true; } /** Get amount swept to manager */ - uint256 amountSwept = SafeCast.toUint256(casimirManager.getExecutionSwept()); - if (amountSwept >= rewardThreshold) { + uint256 sweptStake = manager.getSweptStake(); + + /** Need upkeep for rebalance or compounding */ + if (sweptStake >= compoundThreshold) { upkeepNeeded = true; } else { - /** Set swept amounts below threshold to zero */ - amountSwept = 0; + sweptStake = 0; } - performData = abi.encode(readyPoolIds, amountSwept); + performData = abi.encode(readyPoolIds, sweptStake); } /** * @notice Perform the upkeep - * @param performData The data to perform the upkeep */ - function performUpkeep(bytes calldata performData) external override { + function performUpkeep(bytes calldata) external override { + (bool upkeepNeeded, bytes memory performData) = checkUpkeep(""); + require(upkeepNeeded, "Upkeep not needed"); - (uint32[] memory readyPoolIds, uint256 executionSwept) = abi.decode(performData, (uint32[], uint256)); + (uint32[] memory readyPoolIds, uint256 sweptStake) = abi.decode( + performData, + (uint32[], uint256) + ); - /** Stake ready pools */ - for (uint256 i = 0; i < readyPoolIds.length; i++) { - casimirManager.stakeNextPool(); - } + /** Stake the ready pools */ + manager.stakeReadyPools(); - /** Compound rewards */ - if (executionSwept > 0) { - casimirManager.reward(executionSwept); + /** Need to request a report */ + if (readyPoolIds.length > 0 || sweptStake >= oracleThreshold) { + // Checked in request: + // - readyValidatorPublicKeys + // - stakedValidatorPublicKeys + // - exitingValidatorPublicKeys + // Returned in response: + // - activeStake + // - sweptStake } } /** * @notice Callback that is invoked once the DON has resolved the request or hit an error - * * @param requestId The request ID, returned by sendRequest() * @param response Aggregated response from the user code - * @param err Aggregated error from the user code or from the execution pipeline + * @param err Aggregated error from the user code or from the sweptStake pipeline * Either response or error parameter will be set, but never both */ - function fulfillRequest(bytes32 requestId, bytes memory response, bytes memory err) internal override { + function fulfillRequest( + bytes32 requestId, + bytes memory response, + bytes memory err + ) internal override { + latestResponseTimestamp = block.timestamp; latestResponse = response; latestError = err; responseCounter = responseCounter + 1; + + if (err.length == 0) { + /** Decode report */ + (uint256 activeStake, uint256 sweptStake) = abi.decode( + response, + (uint256, uint256) + ); + manager.reportStake(activeStake, sweptStake); + } + emit OCRResponse(requestId, response, err); } /** * @notice Update the functions oracle address - * @param oracle New oracle address + * @param newOracleAddress New oracle address + */ + function setOracleAddress(address newOracleAddress) external onlyOwner { + setOracle(newOracleAddress); + } + + // Dev-only functions + + /** + * @notice Fulfill the request for testing + * @param requestId The request ID, returned by sendRequest() + * @param response Aggregated response from the user code + * @param err Aggregated error from the user code or from the sweptStake pipeline + * Either response or error parameter will be set, but never both */ - function setOracleAddress(address oracle) external onlyOwner { - setOracle(oracle); + function mockFulfillRequest( + bytes32 requestId, + bytes memory response, + bytes memory err + ) external { + fulfillRequest(requestId, response, err); } } diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index ecb6df570..f80f2f007 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -42,8 +42,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Pool capacity */ uint256 private constant poolCapacity = 32 ether; - /* Reward threshold (0.1 ETH) */ - uint256 private constant rewardThreshold = 100000000000000000; + /* Distribution threshold (100 WEI) */ + uint256 private constant distributionThreshold = 100 wei; /** Scale factor for each reward to stake ratio */ uint256 private constant scaleFactor = 1 ether; /** Uniswap 0.3% fee tier */ @@ -54,7 +54,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /*************/ /** Automation contract */ - ICasimirAutomation private immutable casimirAutomation; + ICasimirAutomation private immutable automation; /** Beacon deposit contract */ IDepositContract private immutable beaconDeposit; /** LINK ERC-20 token contract */ @@ -83,7 +83,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /* Dynamic State */ /********************/ - /** Last pool ID generated for a new pool */ + /** Latest active (consensus) balance reported from automation */ + uint256 latestActiveStake; + /** Last pool ID created */ uint256 lastPoolId; /** Token addresses */ mapping(Token => address) private tokenAddresses; @@ -99,18 +101,22 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint32[] private openPoolIds; /** IDs of pools ready for stake */ uint32[] private readyPoolIds; + /** IDS of pools pending stake */ + uint32[] private pendingPoolIds; /** IDs of staking pools at full capacity */ uint32[] private stakedPoolIds; /** All validators (ready or staked) */ mapping(bytes => Validator) private validators; /** Public keys of ready validators */ bytes[] private readyValidatorPublicKeys; + /** Public keys of pending validators */ + bytes[] private pendingValidatorPublicKeys; /** Public keys of staked validators */ bytes[] private stakedValidatorPublicKeys; - /** Public keys of exiting validators */ - bytes[] private exitingValidatorPublicKeys; + /** Exiting validator count */ + uint256 private exitingValidatorCount; /** Sum of scaled reward to stake ratios (intial value required) */ - uint256 distributionSum = 1000 ether; + uint256 rewardRatioSum = 1000 ether; /** Requested withdrawals */ UserWithdrawal[] private requestedWithdrawalQueue; /** Pending withdrawals */ @@ -127,8 +133,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Constructor * @param beaconDepositAddress The Beacon deposit address - * @param linkOracleAddress The Chainlink functions oracle address * @param linkTokenAddress The Chainlink token address + * @param oracleAddress The Chainlink functions oracle address + * @param oracleSubId The Chainlink functions oracle subscription ID * @param ssvNetworkAddress The SSV network address * @param ssvTokenAddress The SSV token address * @param swapFactoryAddress The Uniswap factory address @@ -137,8 +144,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ constructor( address beaconDepositAddress, - address linkOracleAddress, address linkTokenAddress, + address oracleAddress, + uint64 oracleSubId, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, @@ -156,38 +164,56 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { tokenAddresses[Token.WETH] = wethTokenAddress; /** Deploy automation contract */ - casimirAutomation = new CasimirAutomation( + automation = new CasimirAutomation( address(this), - linkOracleAddress + oracleAddress, + oracleSubId ); } /** - * @dev Distribute ETH rewards - * @param amount The amount of ETH to reward + * @notice Report the latest consensus stake to the manager + * @param active The active consensus stake + * @param swept The swept consensus stake */ - function reward(uint256 amount) external { + function reportStake(uint256 active, uint256 swept) external { require( - msg.sender == address(casimirAutomation), - "Only automation contract can distribute rewards" - ); - require( - amount >= rewardThreshold, - "Reward amount must be equal or greater than reward threshold" + msg.sender == address(automation), + "Only automation can distribute rewards" ); - /** Reward fees set to zero for testing */ - uint256 processedAmount = processFees(amount, Fees(0, 0)); + int256 change = int256(active + swept) - + int256(latestActiveStake + pendingPoolIds.length * poolCapacity); - distributionSum += Math.mulDiv( - distributionSum, - processedAmount, - getStake() - ); + /** Rebalance reward ratio */ + rebalance(change); - distribute(processedAmount); + /** Distribute swept */ + distribute(swept); // Todo handle exits - emit RewardDistributed(msg.sender, processedAmount); + /** Complete pending pools which were staked */ + completePendingPools(); + + /** Update latest active balance */ + latestActiveStake = active; + } + + function rebalance(int256 change) private { + if (change > 0) { + uint256 reward = SafeCast.toUint256(change); + // /** Reward fees set to zero for testing */ + // uint256 processedReward = processFees(reward, Fees(0, 0)); + rewardRatioSum += Math.mulDiv(rewardRatioSum, reward, getStake()); + emit DistributionRebalanced(msg.sender, reward); + } else if (change < 0) { + uint256 penalty = SafeCast.toUint256(change); + rewardRatioSum -= Math.mulDiv(rewardRatioSum, penalty, getStake()); + emit DistributionRebalanced(msg.sender, penalty); + } + } + + function getPrincipal() public view returns (uint256) { + return getQueuedStake() + getActiveStake(); } /** @@ -195,20 +221,20 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function deposit() external payable nonReentrant { require(msg.value > 0, "Deposit amount must be greater than 0"); - uint256 processedAmount = processFees(msg.value, getFees()); - + require( + processedAmount >= distributionThreshold, + "Stake amount must be greater than 100 WEI" + ); /** Update user account state */ if (users[msg.sender].stake0 > 0) { /** Settle user's current stake */ users[msg.sender].stake0 = getUserStake(msg.sender); } - users[msg.sender].distributionSum0 = distributionSum; + users[msg.sender].rewardRatioSum0 = rewardRatioSum; users[msg.sender].stake0 += processedAmount; - distribute(processedAmount); - - emit UserDepositDistributed(msg.sender, processedAmount); + emit StakeDistributed(msg.sender, processedAmount); } /** @@ -223,7 +249,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { if (openPoolIds.length > 0) { poolId = openPoolIds[0]; } else { - lastPoolId += 1; + lastPoolId++; poolId = uint32(lastPoolId); openPoolIds.push(poolId); } @@ -282,7 +308,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function withdrawInstantly(uint256 amount) private { /** Update user account state */ - users[msg.sender].distributionSum0 = distributionSum; + users[msg.sender].rewardRatioSum0 = rewardRatioSum; users[msg.sender].stake0 -= amount; /** Update balance state */ @@ -292,7 +318,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { send(msg.sender, amount); - emit UserWithdrawed(msg.sender, amount); + emit StakeWithdrawn(msg.sender, amount); } /** @@ -306,7 +332,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ); requestedWithdrawals += amount; - emit UserWithdrawalRequested(msg.sender, amount); + emit StakeWithdrawalRequested(msg.sender, amount); } /** @@ -314,8 +340,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function inititateNextWithdrawal() external { require( - msg.sender == address(casimirAutomation), - "Only automation contract can initiate withdrawals" + msg.sender == address(automation), + "Only automation can initiate withdrawals" ); /** Get next requested withdrawal */ @@ -330,10 +356,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { pendingWithdrawals += userWithdrawal.amount; /** Update user account state */ - users[userWithdrawal.user].distributionSum0 = distributionSum; + users[userWithdrawal.user].rewardRatioSum0 = rewardRatioSum; users[userWithdrawal.user].stake0 -= userWithdrawal.amount; - emit UserWithdrawalInitiated( + emit StakeWithdrawalInitiated( userWithdrawal.user, userWithdrawal.amount ); @@ -344,8 +370,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function completeNextWithdrawal() external { require( - msg.sender == address(casimirAutomation), - "Only automation contract can complete withdrawals" + msg.sender == address(automation), + "Only automation can complete withdrawals" ); /** Get next pending withdrawal */ @@ -357,7 +383,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { send(userWithdrawal.user, userWithdrawal.amount); - emit UserWithdrawed(userWithdrawal.user, userWithdrawal.amount); + emit StakeWithdrawn(userWithdrawal.user, userWithdrawal.amount); } /** @@ -371,55 +397,76 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Stake the next ready pool + * @notice Stake the ready pools */ - function stakeNextPool() external { + function stakeReadyPools() external { require( - msg.sender == address(casimirAutomation), - "Only automation contract can stake pools" + msg.sender == address(automation), + "Only automation can stake pools" ); require(readyValidatorPublicKeys.length > 0, "No ready validators"); - /** Get next ready pool ID */ - uint32 poolId = readyPoolIds[0]; + while (readyPoolIds.length > 0) { + /** Get next ready pool ID */ + uint32 poolId = readyPoolIds[0]; - /** Get next ready validator */ - bytes memory validatorPublicKey = readyValidatorPublicKeys[0]; - Validator memory validator = validators[validatorPublicKey]; + /** Get next ready validator */ + bytes memory validatorPublicKey = readyValidatorPublicKeys[0]; + Validator memory validator = validators[validatorPublicKey]; - /** Get the pool */ - Pool storage pool = pools[poolId]; - pool.validatorPublicKey = validatorPublicKey; - - /** Move pool from ready to staked state */ - readyPoolIds.remove(0); - stakedPoolIds.push(poolId); - - /** Move validator from inactive to active state and add to pool */ - readyValidatorPublicKeys.remove(0); - stakedValidatorPublicKeys.push(validatorPublicKey); - - /** Deposit validator */ - beaconDeposit.deposit{value: pool.deposits}( - validatorPublicKey, // bytes - validator.withdrawalCredentials, // bytes - validator.signature, // bytes - validator.depositDataRoot // bytes32 - ); + /** Get the pool */ + Pool storage pool = pools[poolId]; + pool.validatorPublicKey = validatorPublicKey; - /** Pay SSV fees and register validator */ - /** Todo update for v3 SSV contracts and dynamic fees */ - uint256 mockSSVFee = 5 ether; - ssvToken.approve(address(ssvNetwork), mockSSVFee); - ssvNetwork.registerValidator( - validatorPublicKey, // bytes - validator.operatorIds, // uint32[] - validator.sharesPublicKeys, // bytes[] - validator.sharesEncrypted, // bytes[], - mockSSVFee // uint256 (fees handled on user deposits) - ); + /** Move pool from ready to pending state */ + readyPoolIds.remove(0); + pendingPoolIds.push(poolId); + + /** Move validator from ready to pending state and add to pool */ + readyValidatorPublicKeys.remove(0); + pendingValidatorPublicKeys.push(validatorPublicKey); - emit PoolStaked(poolId); + /** Deposit validator */ + beaconDeposit.deposit{value: pool.deposits}( + validatorPublicKey, // bytes + validator.withdrawalCredentials, // bytes + validator.signature, // bytes + validator.depositDataRoot // bytes32 + ); + + /** Pay SSV fees and register validator */ + /** Todo update for v3 SSV contracts and dynamic fees */ + uint256 mockSSVFee = 5 ether; + ssvToken.approve(address(ssvNetwork), mockSSVFee); + ssvNetwork.registerValidator( + validatorPublicKey, // bytes + validator.operatorIds, // uint32[] + validator.sharesPublicKeys, // bytes[] + validator.sharesEncrypted, // bytes[], + mockSSVFee // uint256 (fees handled on user deposits) + ); + + emit PoolStaked(poolId); + } + } + + /** + * @notice Move pending pools to staked + */ + function completePendingPools() private { + while (pendingPoolIds.length > 0) { + /** Get next pending pool */ + uint32 poolId = pendingPoolIds[0]; + Pool memory pool = pools[poolId]; + + /** Move pool from pending to staked state */ + pendingPoolIds.remove(0); + stakedPoolIds.push(poolId); + + /** Move validator from pending to staked state */ + pendingValidatorPublicKeys.remove(0); + stakedValidatorPublicKeys.push(pool.validatorPublicKey); + } } /** @@ -428,7 +475,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function requestPoolExit(uint32 poolId) external { require( - msg.sender == address(casimirAutomation), + msg.sender == address(automation), "Only automation can request pool exits" ); @@ -438,64 +485,71 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { pool.exiting = true; - /** Record validator as exiting for automation */ - exitingValidatorPublicKeys.push(pool.validatorPublicKey); + /** Increase exiting validators */ + exitingValidatorCount++; emit PoolExitRequested(poolId); } /** * @notice Complete a pool exit - * @param poolStakedIndex The pool's staked index - * @param validatorStakedIndex The validator's staked index - * @param validatorExitingIndex The validator's exiting index + * @param poolIndex The staked pool index + * @param validatorIndex The staked validator (internal) index */ function completePoolExit( - uint256 poolStakedIndex, - uint256 validatorStakedIndex, - uint256 validatorExitingIndex + uint256 poolIndex, + uint256 validatorIndex ) external { require( - msg.sender == address(casimirAutomation), + msg.sender == address(automation), "Only automation can complete pool exits" ); + require(exitingValidatorCount > 0, "No exiting validators"); - uint32 poolId = stakedPoolIds[poolStakedIndex]; + uint32 poolId = stakedPoolIds[poolIndex]; Pool storage pool = pools[poolId]; require(pool.exiting, "Pool is not exiting"); bytes memory validatorPublicKey = pool.validatorPublicKey; bytes memory stakedValidatorPublicKey = stakedValidatorPublicKeys[ - validatorStakedIndex - ]; - bytes memory exitingValidatorPublicKey = exitingValidatorPublicKeys[ - validatorExitingIndex + validatorIndex ]; require( keccak256(validatorPublicKey) == - keccak256(stakedValidatorPublicKey) && - keccak256(validatorPublicKey) == - keccak256(exitingValidatorPublicKey), - "Pool validator does not match staked and exiting validator" + keccak256(stakedValidatorPublicKey), + "Pool validator does not match staked validator" ); /** Remove pool from staked pools and delete */ - stakedPoolIds.remove(poolStakedIndex); + stakedPoolIds.remove(poolIndex); delete pools[poolId]; /** Remove validator from staked and exiting states and delete */ - stakedValidatorPublicKeys.remove(validatorStakedIndex); - exitingValidatorPublicKeys.remove(validatorExitingIndex); + stakedValidatorPublicKeys.remove(validatorIndex); delete validators[validatorPublicKey]; + /** Decrease exiting validators */ + exitingValidatorCount--; + /** Remove validator from SSV */ ssvNetwork.removeValidator(validatorPublicKey); emit PoolExited(poolId); } + /** + * @notice Register an operator with the pool manager + * @param operatorId The operator ID + */ + function registerOperator(uint32 operatorId) external payable { + // require( + // msg.value >= operatorCollateralMinimum, + // "Insufficient operator collateral" + // ); + } + /** * @notice Register a validator with the pool manager * @param depositDataRoot The deposit data root @@ -522,11 +576,42 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { sharesEncrypted, sharesPublicKeys, signature, - withdrawalCredentials + withdrawalCredentials, + 0 ); readyValidatorPublicKeys.push(publicKey); - emit ValidatorAdded(publicKey); + emit ValidatorRegistered(publicKey); + } + + /** + * @notice Reshare a registered validator + * @param publicKey The validator public key + * @param operatorIds The operator IDs + * @param sharesEncrypted The encrypted shares + * @param sharesPublicKeys The public keys of the shares + */ + function reshareValidator( + bytes calldata publicKey, + uint32[] memory operatorIds, + bytes[] memory sharesEncrypted, + bytes[] memory sharesPublicKeys + ) external onlyOwner { + /** Get validator */ + Validator storage validator = validators[publicKey]; + + require( + validator.reshareCount < 3, + "Validator has been reshared twice" + ); + + /** Update validator */ + validator.operatorIds = operatorIds; + validator.sharesEncrypted = sharesEncrypted; + validator.sharesPublicKeys = sharesPublicKeys; + validator.reshareCount++; + + emit ValidatorReshared(publicKey); } /** @@ -557,9 +642,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { tokenAddresses[Token.LINK], Math.mulDiv(feeAmount, fees.LINK, feePercent) ); - // Todo use link.tokenIncreaseAllowance(swappedLINK) if available + // Todo use linkToken.increaseAllowance(swappedLINK) if available linkToken.approve( - address(casimirAutomation), + address(automation), linkToken.balanceOf(address(this)) ); unswappedTokens[tokenAddresses[Token.LINK]] += unswappedLINK; @@ -569,9 +654,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { tokenAddresses[Token.SSV], Math.mulDiv(feeAmount, fees.SSV, feePercent) ); - // Todo use ssv.tokenIncreaseAllowance(swappedSSV) if available + // Todo use ssvToken.increaseAllowance(swappedSSV) if available ssvToken.approve( - address(casimirAutomation), + address(automation), ssvToken.balanceOf(address(this)) ); unswappedTokens[tokenAddresses[Token.SSV]] += unswappedSSV; @@ -586,7 +671,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function wrapFees(uint256 amount) private { IWETH9 wethToken = IWETH9(tokenAddresses[Token.WETH]); wethToken.deposit{value: amount}(); - wethToken.approve(address(swapRouter), amount); + // Todo use wethToken.increaseAllowance(swappedSSV) if available + wethToken.approve( + address(swapRouter), + wethToken.balanceOf(address(this)) + ); } /** @@ -647,15 +736,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param oracle New oracle address */ function setOracleAddress(address oracle) external onlyOwner { - casimirAutomation.setOracleAddress(oracle); - } - - /** - * @notice Get the current token fees as percentages - * @return fees The current token fees as percentages - */ - function getFees() public view returns (Fees memory fees) { - fees = Fees(linkFee, ssvFee); + automation.setOracleAddress(oracle); } /** @@ -663,47 +744,34 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @return stake The total manager stake */ function getStake() public view returns (uint256 stake) { - /** Total manager execution stake */ - int256 executionStake = getExecutionStake(); - - /** Total manager consensus stake */ - int256 consensusStake = getExpectedConsensusStake(); - - stake = SafeCast.toUint256(executionStake + consensusStake); + stake = getQueuedStake() + getActiveStake(); // - pendingWithdrawals; } /** - * @notice Get the total manager execution stake - * @return executionStake The total manager execution stake + * @notice Get the total manager queued (execution) stake + * @return queuedStake The total manager queued (execution) stake */ - function getExecutionStake() public view returns (int256 executionStake) { - executionStake = int256( - readyPoolIds.length * poolCapacity + openDeposits - ); + function getQueuedStake() public view returns (uint256 queuedStake) { + queuedStake = + (readyPoolIds.length + pendingPoolIds.length) * + poolCapacity + + openDeposits; } /** - * @notice Get the total manager execution swept amount - * @return executionSwept The total manager execution swept amount + * @notice Get the total manager swept (execution) stake + * @return sweptStake The total manager swept (execution) stake */ - function getExecutionSwept() public view returns (int256 executionSwept) { - executionSwept = int256(address(this).balance) - getExecutionStake(); + function getSweptStake() public view returns (uint256 sweptStake) { + sweptStake = address(this).balance - getQueuedStake(); } /** - * @notice Get the total manager expected consensus stake - * @dev Pending user withdrawal amount is subtracted from the expected stake - * @dev The expected stake will be honored with penalty recovery in place - * @return expectedConsensusStake The total manager expected consensus stake + * @notice Get the manager active (consensus) stake + * @return activeStake The total manager active (consensus) stake */ - function getExpectedConsensusStake() - public - view - returns (int256 expectedConsensusStake) - { - expectedConsensusStake = - int256(stakedPoolIds.length * poolCapacity) - - int256(pendingWithdrawals); + function getActiveStake() public view returns (uint256 activeStake) { + activeStake = latestActiveStake; } /** @@ -717,11 +785,19 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { require(users[userAddress].stake0 > 0, "User does not have a stake"); userStake = Math.mulDiv( users[userAddress].stake0, - distributionSum, - users[userAddress].distributionSum0 + rewardRatioSum, + users[userAddress].rewardRatioSum0 ); } + /** + * @notice Get the current token fees as percentages + * @return fees The current token fees as percentages + */ + function getFees() public view returns (Fees memory fees) { + fees = Fees(linkFee, ssvFee); + } + // External view functions /** @@ -741,27 +817,35 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Get staked validator public keys - * @return A list of active validator public keys + * @notice Get ready validator public keys + * @return A list of inactive validator public keys */ - function getStakedValidatorPublicKeys() + function getReadyValidatorPublicKeys() external view returns (bytes[] memory) { - return stakedValidatorPublicKeys; + return readyValidatorPublicKeys; } /** - * @notice Get ready validator public keys - * @return A list of inactive validator public keys + * @notice Get staked validator public keys + * @return A list of active validator public keys */ - function getReadyValidatorPublicKeys() + function getStakedValidatorPublicKeys() external view returns (bytes[] memory) { - return readyValidatorPublicKeys; + return stakedValidatorPublicKeys; + } + + /** + * @notice Get the count of exiting validators + * @return The count of exiting validators + */ + function getExitingValidatorCount() external view returns (uint256) { + return exitingValidatorCount; } /** @@ -780,6 +864,14 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { return readyPoolIds; } + /** + * @notice Get a list of all pending pool IDs + * @return A list of all pending pool IDs + */ + function getPendingPoolIds() external view returns (uint32[] memory) { + return pendingPoolIds; + } + /** * @notice Get a list of all staked pool IDs * @return A list of all staked pool IDs @@ -835,7 +927,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { view returns (address automationAddress) { - automationAddress = address(casimirAutomation); + automationAddress = address(automation); } // Dev-only functions diff --git a/contracts/ethereum/src/interfaces/ICasimirAutomation.sol b/contracts/ethereum/src/interfaces/ICasimirAutomation.sol index cc209e802..9844fb5f4 100644 --- a/contracts/ethereum/src/interfaces/ICasimirAutomation.sol +++ b/contracts/ethereum/src/interfaces/ICasimirAutomation.sol @@ -4,6 +4,17 @@ pragma solidity ^0.8.7; import "@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol"; interface ICasimirAutomation is AutomationCompatibleInterface { + /***********/ + /* Structs */ + /***********/ + + struct OracleReport { + uint256 activeStake; + uint256 withdrawnStake; + // bytes[] exitedValidatorPublicKeys; + // uint256[] exitedValidatorIndices; + } + /**********/ /* Events */ /**********/ @@ -21,4 +32,10 @@ interface ICasimirAutomation is AutomationCompatibleInterface { function performUpkeep(bytes calldata performData) external; function setOracleAddress(address oracleAddress) external; + + function mockFulfillRequest( + bytes32 requestId, + bytes memory result, + bytes memory err + ) external; } diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index 539a4af29..3d69c041e 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -33,7 +33,7 @@ interface ICasimirManager { /** User staking account */ struct User { uint256 stake0; - uint256 distributionSum0; + uint256 rewardRatioSum0; } /** User withdrawal */ struct UserWithdrawal { @@ -48,41 +48,25 @@ interface ICasimirManager { bytes[] sharesPublicKeys; bytes signature; bytes withdrawalCredentials; + uint256 reshareCount; } /**********/ /* Events */ /**********/ - event PoolIncreased( - address indexed sender, - uint32 poolId, - uint256 amount - ); + event DistributionRebalanced(address indexed sender, uint256 amount); + event PoolIncreased(address indexed sender, uint32 poolId, uint256 amount); event PoolStaked(uint32 indexed poolId); event PoolExitRequested(uint32 indexed poolId); event PoolExited(uint32 indexed poolId); - event RewardDistributed( - address indexed sender, - uint256 amount - ); - event UserDepositDistributed( - address indexed sender, - uint256 amount - ); - event UserWithdrawalRequested( - address indexed sender, - uint256 amount - ); - event UserWithdrawalInitiated( - address indexed sender, - uint256 amount - ); - event UserWithdrawed( - address indexed sender, - uint256 amount - ); - event ValidatorAdded(bytes indexed publicKey); + event StakeDistributed(address indexed sender, uint256 amount); + event StakeWithdrawalRequested(address indexed sender, uint256 amount); + event StakeWithdrawalInitiated(address indexed sender, uint256 amount); + event StakeWithdrawn(address indexed sender, uint256 amount); + event RewardDistributed(address indexed sender, uint256 amount); + event ValidatorRegistered(bytes indexed publicKey); + event ValidatorReshared(bytes indexed publicKey); /*************/ /* Functions */ @@ -90,15 +74,18 @@ interface ICasimirManager { function deposit() external payable; - function reward(uint256 amount) external; + function reportStake(uint256 current, uint256 withdrawn) external; function withdraw(uint256 amount) external; - function stakeNextPool() external; + function stakeReadyPools() external; function requestPoolExit(uint32 poolId) external; - function completePoolExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) external; + function completePoolExit( + uint256 poolIndex, + uint256 validatorIndex + ) external; function registerValidator( bytes32 depositDataRoot, @@ -122,27 +109,34 @@ interface ICasimirManager { function getSSVFee() external view returns (uint32); - function getStakedValidatorPublicKeys() + function getReadyValidatorPublicKeys() external view returns (bytes[] memory); - function getReadyValidatorPublicKeys() + function getStakedValidatorPublicKeys() external view returns (bytes[] memory); + function getExitingValidatorCount() + external + view + returns (uint256); + function getReadyPoolIds() external view returns (uint32[] memory); + function getPendingPoolIds() external view returns (uint32[] memory); + function getStakedPoolIds() external view returns (uint32[] memory); function getStake() external view returns (uint256); - function getExecutionStake() external view returns (int256); + function getQueuedStake() external view returns (uint256); - function getExecutionSwept() external view returns (int256); + function getSweptStake() external view returns (uint256); - function getExpectedConsensusStake() external view returns (int256); + function getActiveStake() external view returns (uint256); function getOpenDeposits() external view returns (uint256); diff --git a/contracts/ethereum/src/mock/MockFunctionsOracle.sol b/contracts/ethereum/src/mock/MockFunctionsOracle.sol deleted file mode 100644 index a6ebb0f69..000000000 --- a/contracts/ethereum/src/mock/MockFunctionsOracle.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import "../vendor/interfaces/FunctionsOracleInterface.sol"; // Todo implement this interface -import "hardhat/console.sol"; - -/** - * @title MockFunctionsOracle - */ -contract MockFunctionsOracle { - - constructor() { - - } - - /** - * @notice Sends a request (encoded as data) using the provided subscriptionId - * @param subscriptionId A unique subscription ID allocated by billing system, - * a client can make requests from different contracts referencing the same subscription - * @param data Encoded Chainlink Functions request data, use FunctionsClient API to encode a request - * @param gasLimit Gas limit for the fulfillment callback - * @return requestId A unique request identifier (unique per DON) - */ - function sendRequest( - uint64 subscriptionId, - bytes calldata data, - uint32 gasLimit - ) external returns (bytes32) { - - } -} diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 38216daa2..5b3a1b173 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -10,16 +10,17 @@ const rewardPerValidator = 0.1 /** Fixture to deploy SSV manager contract */ export async function deploymentFixture() { - let casimirManager: CasimirManager | undefined + let manager: CasimirManager | undefined let mockFunctionsOracle: MockFunctionsOracle | undefined - const [owner, , , , , distributor] = await ethers.getSigners() + const [owner, , , , , chainlink] = await ethers.getSigners() let config: DeploymentConfig = { CasimirManager: { address: '', args: { beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, - linkOracleAddress: process.env.LINK_ORACLE_ADDRESS, linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, + oracleAddress: process.env.ORACLE_ADDRESS, + oracleSubId: process.env.ORACLE_SUB_ID, ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, ssvTokenAddress: process.env.SSV_TOKEN_ADDRESS, swapFactoryAddress: process.env.SWAP_FACTORY_ADDRESS, @@ -40,12 +41,6 @@ export async function deploymentFixture() { options: {}, proxy: false }, - MockKeeperRegistry: { - address: '', - args: {}, - options: {}, - proxy: false - }, ...config } } @@ -55,7 +50,7 @@ export async function deploymentFixture() { /** Link mock external contracts to Casimir */ if (name === 'CasimirManager') { - (config[name as keyof typeof config] as ContractConfig).args.linkOracleAddress = config.MockFunctionsOracle?.address + (config[name as keyof typeof config] as ContractConfig).args.oracleAddress = config.MockFunctionsOracle?.address } const { args, options, proxy } = config[name as keyof typeof config] as ContractConfig @@ -70,21 +65,21 @@ export async function deploymentFixture() { (config[name as keyof DeploymentConfig] as ContractConfig).address = address // Save SSV manager for export - if (name === 'CasimirManager') casimirManager = contract as CasimirManager + if (name === 'CasimirManager') manager = contract as CasimirManager // Save mock Functions oracle for export if (name === 'MockFunctionsOracle') mockFunctionsOracle = contract as MockFunctionsOracle } - const automationAddress = await casimirManager?.getAutomationAddress() as string - const casimirAutomation = await ethers.getContractAt('CasimirAutomation', automationAddress) as CasimirAutomation + const automationAddress = await manager?.getAutomationAddress() as string + const automation = await ethers.getContractAt('CasimirAutomation', automationAddress) as CasimirAutomation - return { casimirManager: casimirManager as CasimirManager, casimirAutomation: casimirAutomation as CasimirAutomation, mockFunctionsOracle, owner, distributor } + return { manager: manager as CasimirManager, automation: automation as CasimirAutomation, mockFunctionsOracle, owner, chainlink } } /** Fixture to add validators */ export async function registerValidatorsFixture() { - const { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor } = await loadFixture(deploymentFixture) + const { manager, automation, mockFunctionsOracle, owner, chainlink } = await loadFixture(deploymentFixture) const validators = Object.keys(validatorStore).map((key) => validatorStore[key]) as Validator[] for (const validator of validators) { @@ -97,7 +92,7 @@ export async function registerValidatorsFixture() { signature, withdrawalCredentials } = validator - const registerValidator = await casimirManager.registerValidator( + const registerValidator = await manager.registerValidator( depositDataRoot, publicKey, operatorIds, @@ -108,200 +103,339 @@ export async function registerValidatorsFixture() { ) await registerValidator.wait() } - return { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor, validators } + return { manager, automation, mockFunctionsOracle, owner, chainlink, validators } } /** Fixture to stake 16 ETH for the first user */ export async function firstUserDepositFixture() { - const { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor } = await loadFixture(registerValidatorsFixture) + const { manager, automation, mockFunctionsOracle, owner, chainlink } = await loadFixture(registerValidatorsFixture) const [, firstUser] = await ethers.getSigners() - const stakeAmount = 16.0 - const fees = { ...await casimirManager.getFees() } + + const stakeAmount = 16 + + const fees = { ...await manager.getFees() } const feePercent = fees.LINK + fees.SSV const depositAmount = stakeAmount * ((100 + feePercent) / 100) const value = ethers.utils.parseEther(depositAmount.toString()) - const deposit = await casimirManager.connect(firstUser).deposit({ value }) + const deposit = await manager.connect(firstUser).deposit({ value }) await deposit.wait() - /** Perform upkeep (todo add bounds to check data) */ - const checkData = ethers.utils.defaultAbiCoder.encode(['string'], ['']) - const { ...check } = await casimirAutomation.checkUpkeep(checkData) + /** Perform upkeep */ + const checkData = ethers.utils.toUtf8Bytes('') + const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) const { upkeepNeeded, performData } = check if (upkeepNeeded) { - const performUpkeep = await casimirAutomation.performUpkeep(performData) + const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) await performUpkeep.wait() } - - return { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor, firstUser } + return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser } } /** Fixture to stake 24 ETH for the second user */ export async function secondUserDepositFixture() { - const { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor, firstUser } = await loadFixture(firstUserDepositFixture) + const { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser } = await loadFixture(firstUserDepositFixture) const [, , secondUser] = await ethers.getSigners() - const stakeAmount = 24.0 - const fees = { ...await casimirManager.getFees() } + + const stakeAmount = 24 + const nextActiveAmount = 32 + const nextSweptAmount = 0 + + const fees = { ...await manager.getFees() } const feePercent = fees.LINK + fees.SSV const depositAmount = stakeAmount * ((100 + feePercent) / 100) const value = ethers.utils.parseEther(depositAmount.toString()) - const deposit = await casimirManager.connect(secondUser).deposit({ value }) + const deposit = await manager.connect(secondUser).deposit({ value }) await deposit.wait() - /** Perform upkeep (todo add bounds to check data) */ - const checkData = ethers.utils.defaultAbiCoder.encode(['string'], ['']) - const { ...check } = await casimirAutomation.checkUpkeep(checkData) + /** Perform upkeep */ + const checkData = ethers.utils.toUtf8Bytes('') + const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) const { upkeepNeeded, performData } = check if (upkeepNeeded) { - const performUpkeep = await casimirAutomation.performUpkeep(performData) + const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) await performUpkeep.wait() } - /** Fulfill mock Functions oracle answer */ + /** Fulfill oracle answer */ if (mockFunctionsOracle) { - // + const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) + const responseBytes = ethers.utils.defaultAbiCoder.encode( + ['uint256', 'uint256'], + [ + ethers.utils.parseEther(nextActiveAmount.toString()), + ethers.utils.parseEther(nextSweptAmount.toString()) + ] + ) + const errorBytes = ethers.utils.toUtf8Bytes('') + const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) + await mockFulfillRequest.wait() } - - return { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor, firstUser, secondUser } + return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } } -/** Fixture to reward ${rewardPerValidator} * ${stakedValidatorCount} to the first and second user */ +/** Fixture to reward 0.1 ETH in total to the first and second user */ export async function rewardPostSecondUserDepositFixture() { - const { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor, firstUser, secondUser } = await loadFixture(secondUserDepositFixture) - const stakedValidatorCount = (await casimirManager?.getStakedValidatorPublicKeys())?.length - if (stakedValidatorCount) { - const rewardAmount = (rewardPerValidator * stakedValidatorCount).toString() - const reward = await distributor.sendTransaction({ to: casimirManager?.address, value: ethers.utils.parseEther(rewardAmount) }) - await reward.wait() - - /** Perform upkeep (todo add bounds to check data) */ - const checkData = ethers.utils.defaultAbiCoder.encode(['string'], ['']) - const { ...check } = await casimirAutomation.checkUpkeep(checkData) - const { upkeepNeeded, performData } = check - if (upkeepNeeded) { - const performUpkeep = await casimirAutomation.performUpkeep(performData) - await performUpkeep.wait() - } + const { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } = await loadFixture(secondUserDepositFixture) + + const rewardAmount = 0.1 + const nextActiveAmount = 32 + rewardAmount + const nextSweptAmount = 0 + + /** Perform upkeep */ + const checkData = ethers.utils.toUtf8Bytes('') + const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) + const { upkeepNeeded, performData } = check + if (upkeepNeeded) { + const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) + await performUpkeep.wait() + } + + /** Fulfill mock Functions oracle answer */ + if (mockFunctionsOracle) { + const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) + const responseBytes = ethers.utils.defaultAbiCoder.encode( + ['uint256', 'uint256'], + [ + ethers.utils.parseEther(nextActiveAmount.toString()), + ethers.utils.parseEther(nextSweptAmount.toString()) + ] + ) + const errorBytes = ethers.utils.toUtf8Bytes('') + const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) + await mockFulfillRequest.wait() + } + return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } +} + +/** Fixture to sweep 0.1 ETH to the manager */ +export async function sweepPostSecondUserDepositFixture() { + const { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } = await loadFixture(secondUserDepositFixture) + + const nextActiveAmount = 32 + const nextSweptAmount = 0.1 + + const sweep = await chainlink.sendTransaction({ to: manager?.address, value: ethers.utils.parseEther('0.1') }) + await sweep.wait() + + /** Perform upkeep */ + const checkData = ethers.utils.toUtf8Bytes('') + const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) + const { upkeepNeeded, performData } = check + if (upkeepNeeded) { + const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) + await performUpkeep.wait() + } + + /** Fulfill oracle answer */ + if (mockFunctionsOracle) { + const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) + const responseBytes = ethers.utils.defaultAbiCoder.encode( + ['uint256', 'uint256'], + [ + ethers.utils.parseEther(nextActiveAmount.toString()), + ethers.utils.parseEther(nextSweptAmount.toString()) + ] + ) + const errorBytes = ethers.utils.toUtf8Bytes('') + const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) + await mockFulfillRequest.wait() } - return { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor, firstUser, secondUser } + return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } } /** Fixture to stake 24 ETH for the third user */ export async function thirdUserDepositFixture() { - const { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor, firstUser, secondUser } = await loadFixture(rewardPostSecondUserDepositFixture) + const { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } = await loadFixture(sweepPostSecondUserDepositFixture) const [, , , thirdUser] = await ethers.getSigners() - const stakeAmount = 24.0 - const fees = { ...await casimirManager.getFees() } + + const stakeAmount = 24 + const nextActiveAmount = 64 + const nextSweptAmount = 0 + + const fees = { ...await manager.getFees() } const feePercent = fees.LINK + fees.SSV const depositAmount = stakeAmount * ((100 + feePercent) / 100) const value = ethers.utils.parseEther(depositAmount.toString()) - const deposit = await casimirManager.connect(thirdUser).deposit({ value }) + const deposit = await manager.connect(thirdUser).deposit({ value }) await deposit.wait() - /** Perform upkeep (todo add bounds to check data) */ - const checkData = ethers.utils.defaultAbiCoder.encode(['string'], ['']) - const { ...check } = await casimirAutomation.checkUpkeep(checkData) + /** Perform upkeep */ + const checkData = ethers.utils.toUtf8Bytes('') + const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) const { upkeepNeeded, performData } = check if (upkeepNeeded) { - const performUpkeep = await casimirAutomation.performUpkeep(performData) + const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) await performUpkeep.wait() - } - /** Fulfill mock Functions oracle answer */ - if (mockFunctionsOracle) { - // + /** Fulfill oracle answer */ + const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) + const responseBytes = ethers.utils.defaultAbiCoder.encode( + ['uint256', 'uint256'], + [ + ethers.utils.parseEther(nextActiveAmount.toString()), + ethers.utils.parseEther(nextSweptAmount.toString()) + ] + ) + const errorBytes = ethers.utils.toUtf8Bytes('') + const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) + await mockFulfillRequest.wait() } - - return { casimirManager, casimirAutomation, mockFunctionsOracle, owner, distributor, firstUser, secondUser, thirdUser } + return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } } -/** Fixture to reward ${rewardPerValidator} * ${stakedValidatorCount} to the first, second, and third user */ +/** Fixture to reward 0.2 ETH in total to the first, second, and third user */ export async function rewardPostThirdUserDepositFixture() { - const { casimirManager, casimirAutomation, mockFunctionsOracle, distributor, firstUser, secondUser, thirdUser } = await loadFixture(thirdUserDepositFixture) - const stakedValidatorCount = (await casimirManager?.getStakedValidatorPublicKeys())?.length - if (stakedValidatorCount) { - const rewardAmount = (rewardPerValidator * stakedValidatorCount).toString() - const reward = await distributor.sendTransaction({ to: casimirManager?.address, value: ethers.utils.parseEther(rewardAmount) }) - await reward.wait() - - /** Perform upkeep (todo add bounds to check data) */ - const checkData = ethers.utils.defaultAbiCoder.encode(['string'], ['']) - const { ...check } = await casimirAutomation.checkUpkeep(checkData) - const { upkeepNeeded, performData } = check - if (upkeepNeeded) { - const performUpkeep = await casimirAutomation.performUpkeep(performData) - await performUpkeep.wait() - } + const { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(thirdUserDepositFixture) + + const rewardAmount = 0.2 + const nextActiveAmount = 64 + rewardAmount + const nextSweptAmount = 0 + + /** Perform upkeep */ + const checkData = ethers.utils.toUtf8Bytes('') + const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) + const { upkeepNeeded, performData } = check + if (upkeepNeeded) { + const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) + await performUpkeep.wait() + + /** Fulfill oracle answer */ + const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) + const responseBytes = ethers.utils.defaultAbiCoder.encode( + ['uint256', 'uint256'], + [ + ethers.utils.parseEther(nextActiveAmount.toString()), + ethers.utils.parseEther(nextSweptAmount.toString()) + ] + ) + const errorBytes = ethers.utils.toUtf8Bytes('') + const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) + await mockFulfillRequest.wait() } - return { casimirManager, casimirAutomation, mockFunctionsOracle, distributor, firstUser, secondUser, thirdUser } + return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } } -/** Fixture to withdraw ${readyDeposits} amount to fulfill ${firstUser} partial withdrawal */ -export async function firstUserPartialWithdrawalFixture() { - const { casimirManager, casimirAutomation, mockFunctionsOracle, distributor, firstUser, secondUser, thirdUser } = await loadFixture(rewardPostThirdUserDepositFixture) - const readyDeposits = await casimirManager?.getOpenDeposits() - const withdrawal = await casimirManager.connect(firstUser).withdraw(readyDeposits) - await withdrawal.wait() - - /** Perform upkeep (todo add bounds to check data) */ - const checkData = ethers.utils.defaultAbiCoder.encode(['string'], ['']) - const { ...check } = await casimirAutomation.checkUpkeep(checkData) +/** Fixture to sweep 0.2 ETH to the manager */ +export async function sweepPostThirdUserDepositFixture() { + const { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(rewardPostThirdUserDepositFixture) + + const nextActiveAmount = 64 + const nextSweptAmount = 0.2 + + /** Sweep rewards before upkeep (balance will increment silently) */ + const sweep = await chainlink.sendTransaction({ to: manager?.address, value: ethers.utils.parseEther(nextSweptAmount.toString()) }) + await sweep.wait() + + /** Perform upkeep */ + const checkData = ethers.utils.toUtf8Bytes('') + const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) const { upkeepNeeded, performData } = check if (upkeepNeeded) { - const performUpkeep = await casimirAutomation.performUpkeep(performData) + const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) await performUpkeep.wait() + + /** Fulfill oracle answer */ + const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) + const responseBytes = ethers.utils.defaultAbiCoder.encode( + ['uint256', 'uint256'], + [ + ethers.utils.parseEther(nextActiveAmount.toString()), + ethers.utils.parseEther(nextSweptAmount.toString()) + ] + ) + const errorBytes = ethers.utils.toUtf8Bytes('') + const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) + await mockFulfillRequest.wait() } + return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } +} - return { casimirManager, casimirAutomation, mockFunctionsOracle, distributor, firstUser, secondUser, thirdUser } +/** Fixture to withdraw 0.3 to the first user */ +export async function firstUserPartialWithdrawalFixture() { + const { manager, automation, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(sweepPostThirdUserDepositFixture) + const openDeposits = await manager?.getOpenDeposits() + const withdraw = await manager.connect(firstUser).withdraw(openDeposits) + await withdraw.wait() + return { manager, automation, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser } } -/** Fixture to stake 72 ETH for the fourth user */ +/** Fixture to stake 72 for the fourth user */ export async function fourthUserDepositFixture() { - const { casimirManager, casimirAutomation, mockFunctionsOracle, distributor, firstUser, secondUser, thirdUser } = await loadFixture(firstUserPartialWithdrawalFixture) + const { manager, automation, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(firstUserPartialWithdrawalFixture) const [, , , , fourthUser] = await ethers.getSigners() - const stakeAmount = 72.0 - const fees = { ...await casimirManager.getFees() } + + const stakeAmount = 72 + const nextActiveAmount = 128 + const nextSweptAmount = 0 + + const fees = { ...await manager.getFees() } const feePercent = fees.LINK + fees.SSV const depositAmount = stakeAmount * ((100 + feePercent) / 100) const value = ethers.utils.parseEther(depositAmount.toString()) - const deposit = await casimirManager.connect(fourthUser).deposit({ value }) + const deposit = await manager.connect(fourthUser).deposit({ value }) await deposit.wait() - /** Perform upkeep (todo add bounds to check data) */ - const checkData = ethers.utils.defaultAbiCoder.encode(['string'], ['']) - const { ...check } = await casimirAutomation.checkUpkeep(checkData) + /** Perform upkeep */ + const checkData = ethers.utils.toUtf8Bytes('') + const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) const { upkeepNeeded, performData } = check if (upkeepNeeded) { - const performUpkeep = await casimirAutomation.performUpkeep(performData) + const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) await performUpkeep.wait() - } - /** Fulfill mock Functions oracle answer */ - if (mockFunctionsOracle) { - // + /** Fulfill oracle answer */ + const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) + const responseBytes = ethers.utils.defaultAbiCoder.encode( + ['uint256', 'uint256'], + [ + ethers.utils.parseEther(nextActiveAmount.toString()), + ethers.utils.parseEther(nextSweptAmount.toString()) + ] + ) + const errorBytes = ethers.utils.toUtf8Bytes('') + const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) + await mockFulfillRequest.wait() } - - return { casimirManager, casimirAutomation, mockFunctionsOracle, distributor, firstUser, secondUser, thirdUser, fourthUser } + return { manager, automation, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser, fourthUser } } /** Fixture to simulate stakes and rewards */ export async function simulationFixture() { - const { casimirManager, casimirAutomation, mockFunctionsOracle, distributor, firstUser, secondUser, thirdUser, fourthUser } = await loadFixture(fourthUserDepositFixture) + const { manager, automation, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser, fourthUser } = await loadFixture(fourthUserDepositFixture) + + let activeAmount = 128 + for (let i = 0; i < 5; i++) { - const stakedValidatorCount = (await casimirManager?.getStakedValidatorPublicKeys())?.length + const stakedValidatorCount = (await manager?.getStakedValidatorPublicKeys())?.length if (stakedValidatorCount) { - const rewardAmount = (rewardPerValidator * stakedValidatorCount).toString() - const reward = await distributor.sendTransaction({ to: casimirManager?.address, value: ethers.utils.parseEther(rewardAmount) }) - await reward.wait() + const rewardAmount = rewardPerValidator * stakedValidatorCount + const nextActiveAmount = activeAmount + rewardAmount + const nextSweptAmount = 0 - /** Perform upkeep (todo add bounds to check data) */ - const checkData = ethers.utils.defaultAbiCoder.encode(['string'], ['']) - const { ...check } = await casimirAutomation.checkUpkeep(checkData) + /** Perform upkeep */ + const checkData = ethers.utils.toUtf8Bytes('') + const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) const { upkeepNeeded, performData } = check if (upkeepNeeded) { - const performUpkeep = await casimirAutomation.performUpkeep(performData) + const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) await performUpkeep.wait() + + /** Fulfill oracle answer */ + const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) + const responseBytes = ethers.utils.defaultAbiCoder.encode( + ['uint256', 'uint256'], + [ + ethers.utils.parseEther(nextActiveAmount.toString()), + ethers.utils.parseEther(nextSweptAmount.toString()) + ] + ) + const errorBytes = ethers.utils.toUtf8Bytes('') + const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) + await mockFulfillRequest.wait() + + activeAmount = nextActiveAmount // For next iteration } } } - return { casimirManager, casimirAutomation, mockFunctionsOracle, distributor, firstUser, secondUser, thirdUser, fourthUser } + return { manager, automation, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser, fourthUser } } \ No newline at end of file diff --git a/contracts/ethereum/test/integration.ts b/contracts/ethereum/test/integration.ts index 6fe875e6b..512e8a027 100644 --- a/contracts/ethereum/test/integration.ts +++ b/contracts/ethereum/test/integration.ts @@ -1,7 +1,7 @@ import { ethers } from 'hardhat' import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' import { expect } from 'chai' -import { registerValidatorsFixture, firstUserDepositFixture, rewardPostSecondUserDepositFixture, secondUserDepositFixture, thirdUserDepositFixture, rewardPostThirdUserDepositFixture, simulationFixture, firstUserPartialWithdrawalFixture, fourthUserDepositFixture } from './fixtures/shared' +import { registerValidatorsFixture, firstUserDepositFixture, rewardPostSecondUserDepositFixture, secondUserDepositFixture, thirdUserDepositFixture, rewardPostThirdUserDepositFixture, simulationFixture, firstUserPartialWithdrawalFixture, fourthUserDepositFixture, sweepPostSecondUserDepositFixture, sweepPostThirdUserDepositFixture } from './fixtures/shared' describe('Casimir manager', async function () { @@ -14,130 +14,148 @@ describe('Casimir manager', async function () { }) it('First user\'s 16.0 stake opens the first pool with 16.0', async function () { - const { casimirManager, owner } = await loadFixture(firstUserDepositFixture) - const ssvOwnerAddress = await casimirManager.signer.getAddress() + const { manager, owner } = await loadFixture(firstUserDepositFixture) + const ssvOwnerAddress = await manager.signer.getAddress() expect(ssvOwnerAddress).equal(owner.address) - const openPools = await casimirManager.getOpenPoolIds() + const openPools = await manager.getOpenPoolIds() expect(openPools.length).equal(1) const firstPoolId = openPools[0] - const pool = await casimirManager.getPoolDetails(firstPoolId) + const pool = await manager.getPoolDetails(firstPoolId) expect(ethers.utils.formatEther(pool.deposits)).equal('16.0') }) it('First user\'s 16.0 stake increases the total stake to 16.0', async function () { - const { casimirManager } = await loadFixture(firstUserDepositFixture) - const stake = await casimirManager.getStake() + const { manager } = await loadFixture(firstUserDepositFixture) + const stake = await manager.getStake() expect(ethers.utils.formatEther(stake)).equal('16.0') }) it('First user\'s 16.0 stake increases their stake to 16.0', async function () { - const { casimirManager, firstUser } = await loadFixture(firstUserDepositFixture) - const stake = await casimirManager.getUserStake(firstUser.address) + const { manager, firstUser } = await loadFixture(firstUserDepositFixture) + const stake = await manager.getUserStake(firstUser.address) expect(ethers.utils.formatEther(stake)).equal('16.0') }) it('Second user\'s 24.0 stake completes the first pool with 32.0', async function () { - const { casimirManager } = await loadFixture(secondUserDepositFixture) - const stakedPools = await casimirManager.getStakedPoolIds() - expect(stakedPools.length).equal(1) + const { manager } = await loadFixture(secondUserDepositFixture) + const stakedPoolIds = await manager.getStakedPoolIds() + expect(stakedPoolIds.length).equal(1) - const firstPoolId = stakedPools[0] - const pool = await casimirManager.getPoolDetails(firstPoolId) + const firstPoolId = stakedPoolIds[0] + const pool = await manager.getPoolDetails(firstPoolId) expect(ethers.utils.formatEther(pool.deposits)).equal('32.0') expect(pool.validatorPublicKey).not.equal('0x') expect(pool.operatorIds.length).equal(4) }) it('Second user\'s 24.0 stake opens a second pool with 8.0', async function () { - const { casimirManager } = await loadFixture(secondUserDepositFixture) - const openPools = await casimirManager.getOpenPoolIds() + const { manager } = await loadFixture(secondUserDepositFixture) + const openPools = await manager.getOpenPoolIds() expect(openPools.length).equal(1) const secondPoolId = openPools[0] - const pool = await casimirManager.getPoolDetails(secondPoolId) + const pool = await manager.getPoolDetails(secondPoolId) expect(ethers.utils.formatEther(pool.deposits)).equal('8.0') }) it('Second user\'s 24.0 stake increases the total stake to 40.0', async function () { - const { casimirManager } = await loadFixture(secondUserDepositFixture) - const stake = await casimirManager.getStake() + const { manager } = await loadFixture(secondUserDepositFixture) + const stake = await manager.getStake() expect(ethers.utils.formatEther(stake)).equal('40.0') }) it('Second user\'s 24.0 stake increases their stake to 24.0', async function () { - const { casimirManager, secondUser } = await loadFixture(secondUserDepositFixture) - const stake = await casimirManager.getUserStake(secondUser.address) + const { manager, secondUser } = await loadFixture(secondUserDepositFixture) + const stake = await manager.getUserStake(secondUser.address) expect(ethers.utils.formatEther(stake)).equal('24.0') }) - it('First and second user\'s stake earns 0.1 total after some time', async function () { - const { casimirManager } = await loadFixture(rewardPostSecondUserDepositFixture) - const stake = await casimirManager.getStake() + it('First pool is staked after the oracle request is fulfilled', async function () { + const { manager } = await loadFixture(secondUserDepositFixture) + const stakedPools = await manager.getStakedPoolIds() + expect(stakedPools.length).equal(1) + }) + + it('First and second user\'s stake earns 0.1 in total after some time', async function () { + const { manager } = await loadFixture(rewardPostSecondUserDepositFixture) + const stake = await manager.getStake() expect(ethers.utils.formatEther(stake)).equal('40.1') }) - it('First and second user\'s stake earns them 0.04 and 0.06, respectively, in rewards after some time', async function () { - const { casimirManager, firstUser, secondUser } = await loadFixture(rewardPostSecondUserDepositFixture) - const firstStake = await casimirManager.getUserStake(firstUser.address) - const secondStake = await casimirManager.getUserStake(secondUser.address) + it('First and second user\'s stake earns them 0.04 and 0.06, respectively, after some time', async function () { + const { manager, firstUser, secondUser } = await loadFixture(rewardPostSecondUserDepositFixture) + const firstStake = await manager.getUserStake(firstUser.address) + const secondStake = await manager.getUserStake(secondUser.address) expect(ethers.utils.formatEther(firstStake)).equal('16.04') expect(ethers.utils.formatEther(secondStake)).equal('24.06') }) + it('First pool\'s 0.1 is swept and compounded after some time', async function () { + const { manager } = await loadFixture(sweepPostSecondUserDepositFixture) + const queuedStake = await manager.getQueuedStake() + expect(ethers.utils.formatEther(queuedStake)).equal('8.1') + }) + it('Third user\'s 24.0 stake completes the second pool with 32.0', async function () { - const { casimirManager } = await loadFixture(thirdUserDepositFixture) - const stakedPools = await casimirManager.getStakedPoolIds() + const { manager } = await loadFixture(thirdUserDepositFixture) + const stakedPools = await manager.getStakedPoolIds() expect(stakedPools.length).equal(2) const secondPoolId = stakedPools[1] - const pool = await casimirManager.getPoolDetails(secondPoolId) + const pool = await manager.getPoolDetails(secondPoolId) expect(ethers.utils.formatEther(pool.deposits)).equal('32.0') expect(pool.validatorPublicKey).not.equal('0x') expect(pool.operatorIds.length).equal(4) }) it('Third user\'s 24.0 stake opens a third pool', async function () { - const { casimirManager } = await loadFixture(thirdUserDepositFixture) - const openPools = await casimirManager.getOpenPoolIds() + const { manager } = await loadFixture(thirdUserDepositFixture) + const openPools = await manager.getOpenPoolIds() expect(openPools.length).equal(1) }) it('Third user\'s 24.0 stake increases the total stake to 64.1', async function () { - const { casimirManager } = await loadFixture(thirdUserDepositFixture) - const stake = await casimirManager.getStake() + const { manager } = await loadFixture(thirdUserDepositFixture) + const stake = await manager.getStake() expect(ethers.utils.formatEther(stake)).equal('64.1') }) it('Third user\'s 24.0 stake increases their stake to 24.0', async function () { - const { casimirManager, thirdUser } = await loadFixture(thirdUserDepositFixture) - const stake = await casimirManager.getUserStake(thirdUser.address) + const { manager, thirdUser } = await loadFixture(thirdUserDepositFixture) + const stake = await manager.getUserStake(thirdUser.address) expect(ethers.utils.formatEther(stake)).equal('24.0') }) - it('First, second, and third user\'s stake earns them 0.3 total in rewards after some more time (or 0.0 with compound)', async function () { - const { casimirManager } = await loadFixture(rewardPostThirdUserDepositFixture) - const stake = await casimirManager.getStake() + it('First, second, and third user\'s stake earns them 0.3 in total after some time', async function () { + const { manager } = await loadFixture(rewardPostThirdUserDepositFixture) + const stake = await manager.getStake() expect(ethers.utils.formatEther(stake)).equal('64.3') }) it('First, second, and third user\'s stake earns them ~0.09, ~0.135 and ~0.075, respectively, after some time', async function () { - const { casimirManager, firstUser, secondUser, thirdUser } = await loadFixture(rewardPostThirdUserDepositFixture) - const firstStake = await casimirManager.getUserStake(firstUser.address) - const secondStake = await casimirManager.getUserStake(secondUser.address) - const thirdStake = await casimirManager.getUserStake(thirdUser.address) + const { manager, firstUser, secondUser, thirdUser } = await loadFixture(rewardPostThirdUserDepositFixture) + const firstStake = await manager.getUserStake(firstUser.address) + const secondStake = await manager.getUserStake(secondUser.address) + const thirdStake = await manager.getUserStake(thirdUser.address) expect(ethers.utils.formatEther(firstStake)).equal('16.090046801872074882') expect(ethers.utils.formatEther(secondStake)).equal('24.135070202808112324') expect(ethers.utils.formatEther(thirdStake)).equal('24.074882995319812792') }) + it('First and second pool\'s 0.2 is swept and compounded after some time', async function () { + const { manager } = await loadFixture(sweepPostThirdUserDepositFixture) + const queuedStake = await manager.getQueuedStake() + expect(ethers.utils.formatEther(queuedStake)).equal('0.3') + }) + it('First user\'s 0.3 withdrawal decreases their stake to ~15.79', async function () { - const { casimirManager, firstUser, secondUser, thirdUser } = await loadFixture(firstUserPartialWithdrawalFixture) - const firstStake = await casimirManager.getUserStake(firstUser.address) - const secondStake = await casimirManager.getUserStake(secondUser.address) - const thirdStake = await casimirManager.getUserStake(thirdUser.address) + const { manager, firstUser, secondUser, thirdUser } = await loadFixture(firstUserPartialWithdrawalFixture) + const firstStake = await manager.getUserStake(firstUser.address) + const secondStake = await manager.getUserStake(secondUser.address) + const thirdStake = await manager.getUserStake(thirdUser.address) expect(ethers.utils.formatEther(firstStake)).equal('15.790046801872074882') expect(ethers.utils.formatEther(secondStake)).equal('24.135070202808112324') @@ -145,30 +163,30 @@ describe('Casimir manager', async function () { }) it('Fourth user\'s 72 stake completes the third and fourth pool with 72', async function () { - const { casimirManager } = await loadFixture(fourthUserDepositFixture) - const stakedPools = await casimirManager.getStakedPoolIds() + const { manager } = await loadFixture(fourthUserDepositFixture) + const stakedPools = await manager.getStakedPoolIds() expect(stakedPools.length).equal(4) const thirdPoolId = stakedPools[2] - const thirdPool = await casimirManager.getPoolDetails(thirdPoolId) + const thirdPool = await manager.getPoolDetails(thirdPoolId) expect(ethers.utils.formatEther(thirdPool.deposits)).equal('32.0') expect(thirdPool.validatorPublicKey).not.equal('0x') expect(thirdPool.operatorIds.length).equal(4) const fourthPoolId = stakedPools[3] - const fourthPool = await casimirManager.getPoolDetails(fourthPoolId) + const fourthPool = await manager.getPoolDetails(fourthPoolId) expect(ethers.utils.formatEther(fourthPool.deposits)).equal('32.0') expect(fourthPool.validatorPublicKey).not.equal('0x') expect(fourthPool.operatorIds.length).equal(4) }) it('Check more rewards and dust', async function () { - const { casimirManager, firstUser, secondUser, thirdUser, fourthUser } = await loadFixture(simulationFixture) - const stake = await casimirManager.getStake() - const firstStake = await casimirManager.getUserStake(firstUser.address) - const secondStake = await casimirManager.getUserStake(secondUser.address) - const thirdStake = await casimirManager.getUserStake(thirdUser.address) - const fourthStake = await casimirManager.getUserStake(fourthUser.address) + const { manager, firstUser, secondUser, thirdUser, fourthUser } = await loadFixture(simulationFixture) + const stake = await manager.getStake() + const firstStake = await manager.getUserStake(firstUser.address) + const secondStake = await manager.getUserStake(secondUser.address) + const thirdStake = await manager.getUserStake(thirdUser.address) + const fourthStake = await manager.getUserStake(fourthUser.address) const line = '----------------------------------------' console.log(`${line}\n💿 Simulation results\n${line}`) @@ -177,7 +195,7 @@ describe('Casimir manager', async function () { console.log('👤 Second user stake', ethers.utils.formatEther(secondStake)) console.log('👤 Third user stake', ethers.utils.formatEther(thirdStake)) console.log('👤 Fourth user stake', ethers.utils.formatEther(fourthStake)) - const openDeposits = await casimirManager.getOpenDeposits() + const openDeposits = await manager.getOpenDeposits() console.log('📦 Open deposits', ethers.utils.formatEther(openDeposits)) const dust = stake.sub(firstStake.add(secondStake).add(thirdStake).add(fourthStake)) if (dust !== ethers.utils.parseEther('0.0')) { diff --git a/services/keys/scripts/dev.ts b/services/keys/scripts/dev.ts index 3362d1d42..69a9ebb87 100644 --- a/services/keys/scripts/dev.ts +++ b/services/keys/scripts/dev.ts @@ -1,21 +1,28 @@ +import { retryFetch } from '@casimir/helpers' import { $ } from 'zx' void async function () { await $`npx esno -r dotenv/config src/index.ts help` - process.env.MESSENGER_SRV_ADDR='http://0.0.0.0:3000' - process.env.USE_HARDCODED_OPERATORS='true' - const dkgServiceUrl = 'http://0.0.0.0:3000' - const groups = [[1, 2, 3, 4]/*, [1, 2, 3, 4]*/] - for (const group of groups) { + const groups = [[1, 2, 3, 4], [1, 2, 3, 4]] + process.env.MESSENGER_SRV_ADDR = dkgServiceUrl + process.env.USE_HARDCODED_OPERATORS ='true' + + /** Start the DKG service */ + await $`docker compose -f scripts/resources/rockx-dkg-cli/docker-compose.yaml up -d` + + /** Ping the DGK service for a pong */ + const ping = await retryFetch(`${dkgServiceUrl}/ping`) + const { message } = await ping.json() + if (message !== 'pong') throw new Error('DKG service is not running') + + await Promise.all(groups.map(async (group) => { console.log(`Starting ceremony for operators: ${group.join(',')}`) await $`npx esno -r dotenv/config src/index.ts create-validator --dkgServiceUrl ${dkgServiceUrl} --operatorIds ${group.join(',')}` console.log('Completed ceremony...') + })) - if (group !== groups[groups.length - 1]) { - console.log('Waiting for 5 seconds before starting the next ceremony...') - await $`sleep 5` - } - } + /** Stop the DKG service */ + await $`docker compose -f scripts/resources/rockx-dkg-cli/docker-compose.yaml down` }() \ No newline at end of file diff --git a/services/keys/src/providers/cli.ts b/services/keys/src/providers/cli.ts index 1f8cbdba0..8a8746983 100644 --- a/services/keys/src/providers/cli.ts +++ b/services/keys/src/providers/cli.ts @@ -19,57 +19,20 @@ export class CLI { commands = { createValidator: async (args: CommandArgs) => { const { dkgServiceUrl, operatorIds, withdrawalAddress } = args - console.log('@casimir/keys') - console.log('Command:\n') - console.log('\tkeys create-validator') - console.log(`\t --dkgServiceUrl ${dkgServiceUrl}`) - console.log(`\t --operatorIds ${operatorIds}`) - console.log(`\t --withdrawalAddress ${withdrawalAddress}\n`) const ssv = new SSV({ dkgServiceUrl }) - - /** Mock the local DKG service in development mode */ - if (ssv.dkgService.serviceUrl.includes('0.0.0.0')) { - console.log('Starting local DKG service...') - await ssv.dkgService.start() - } const validator = await ssv.createValidator({ operatorIds, withdrawalAddress }) - /** Stop the local DKG service */ - if (ssv.dkgService.serviceUrl.includes('0.0.0.0')) { - console.log('Stopping local DKG service...') - await ssv.dkgService.stop() - } - return { status: 200, validator } }, reshareValidator: async (args: CommandArgs) => { const { dkgServiceUrl, operatorIds, validatorPublicKey, oldOperatorIds } = args - console.log('@casimir/keys') - console.log('Command:\n') - console.log('\tkeys reshare-validator') - console.log(`\t --dkgServiceUrl ${dkgServiceUrl}`) - console.log(`\t --operatorIds ${operatorIds}`) - console.log(`\t --validatorPublicKey ${validatorPublicKey}`) - console.log(`\t --oldOperatorIds ${oldOperatorIds}\n`) const ssv = new SSV({ dkgServiceUrl }) - - /** Mock the local DKG service in development mode */ - if (ssv.dkgService.serviceUrl.includes('0.0.0.0')) { - console.log('Starting local DKG service...') - await ssv.dkgService.start() - } const validator = await ssv.reshareValidator({ operatorIds, validatorPublicKey, oldOperatorIds }) - /** Stop the local DKG service */ - if (ssv.dkgService.serviceUrl.includes('0.0.0.0')) { - console.log('Stopping local DKG service...') - await ssv.dkgService.stop() - } - return { status: 200, validator } }, help: () => { diff --git a/services/keys/src/providers/dkg.ts b/services/keys/src/providers/dkg.ts index fa9c9f123..860996ab6 100644 --- a/services/keys/src/providers/dkg.ts +++ b/services/keys/src/providers/dkg.ts @@ -3,7 +3,7 @@ import { DepositData } from '../interfaces/DepositData' import { Shares } from '../interfaces/Shares' import { DKGOptions } from '../interfaces/DKGOptions' import { ReshareInput } from '../interfaces/ReshareInput' -import { retry, run, getWithdrawalCredentials } from '@casimir/helpers' +import { retryFetch, retryRun, run, getWithdrawalCredentials } from '@casimir/helpers' import fs from 'fs' export class DKG { @@ -37,8 +37,10 @@ export class DKG { const thresholdFlag = `--threshold ${Object.keys(operators).length - 1}` const withdrawalCredentialsFlag = `--withdrawal-credentials ${getWithdrawalCredentials(withdrawalAddress)}` const forkVersionFlag = '--fork-version prater' - const startKeyGeneration = await run(`rockx-dkg-cli keygen ${operatorFlags} ${thresholdFlag} ${withdrawalCredentialsFlag} ${forkVersionFlag}`) as string - return startKeyGeneration.split(':')[1].trim() + const command = `rockx-dkg-cli keygen ${operatorFlags} ${thresholdFlag} ${withdrawalCredentialsFlag} ${forkVersionFlag}` + const startKeyGeneration = await retryRun(`${command}`) as string + const ceremonyId = startKeyGeneration.split(' ').pop() as string + return ceremonyId } /** @@ -69,8 +71,10 @@ export class DKG { const thresholdFlag = `--threshold ${Object.keys(operators).length - 1}` const validatorPublicKeyFlag = `--validator-public-key ${validatorPublicKey}` const oldOperatorFlags = Object.entries(oldOperators).map(([id, url]) => `--old-operator ${id}=${url}`).join(' ') - const startReshare = await run(`rockx-dkg-cli reshare ${operatorFlags} ${thresholdFlag} ${validatorPublicKeyFlag} ${oldOperatorFlags}`) as string - return startReshare.split(':')[1].trim() + const command = `rockx-dkg-cli reshare ${operatorFlags} ${thresholdFlag} ${validatorPublicKeyFlag} ${oldOperatorFlags}` + const startReshare = await retryRun(`${command}`) as string + const ceremonyId = startReshare.split(' ').pop() as string + return ceremonyId } /** @@ -87,9 +91,13 @@ export class DKG { */ async getShares(ceremonyId: string): Promise { const requestIdFlag = `--request-id ${ceremonyId}` - const getShares = await run(`rockx-dkg-cli get-keyshares ${requestIdFlag}`) as string - const sharesFile = getShares.split(':')[1].trim() - const sharesJSON = JSON.parse(fs.readFileSync(sharesFile, 'utf8')) + const command = `rockx-dkg-cli get-keyshares ${requestIdFlag}` + const getShares = await retryRun(`${command}`) as string + console.log('shares getShares', getShares) + ceremonyId = getShares.split(':').pop() as string + console.log('shares ceremonyId', ceremonyId) + const sharesFile = `keyshares-${ceremonyId}` + const sharesJSON = JSON.parse(fs.readFileSync(`${sharesFile}`, 'utf8')) fs.rmSync(sharesFile) return { encryptedKeys: sharesJSON.data.shares.encryptedKeys.map((key: string) => '0x' + key), @@ -116,8 +124,10 @@ export class DKG { const requestIdFlag = `--request-id ${ceremonyId}` const withdrawalCredentialsFlag = `--withdrawal-credentials 01${'0'.repeat(22)}${withdrawalAddress.split('0x')[1]}` const forkVersionFlag = '--fork-version prater' - const getDepositData = await run(`rockx-dkg-cli generate-deposit-data ${requestIdFlag} ${withdrawalCredentialsFlag} ${forkVersionFlag}`) as string - const depositDataFile = getDepositData.split('file ')[1].trim() + const command = `rockx-dkg-cli generate-deposit-data ${requestIdFlag} ${withdrawalCredentialsFlag} ${forkVersionFlag}` + const getDepositData = await retryRun(`${command}`) as string + const datetime = getDepositData.split(' ').pop() as string + const depositDataFile = `depositdata-${datetime}` const depositData = JSON.parse(fs.readFileSync(depositDataFile, 'utf8')) fs.rmSync(depositDataFile) const { @@ -133,42 +143,4 @@ export class DKG { withdrawalCredentials: `0x${withdrawalCredentials}` } } - - /** - * Start the local key generation API service - * @returns {Promise} - */ - async start(): Promise { - - await run('docker compose -f scripts/resources/rockx-dkg-cli/docker-compose.yaml up -d') - - /** Wait for the success */ - let pong = false - while (!pong) { - pong = await this.ping() - await new Promise(resolve => setTimeout(resolve, 500)) - } - } - - /** - * Stop the local key generation API service - * @returns {Promise} - */ - async stop(): Promise { - await run('docker compose -f scripts/resources/rockx-dkg-cli/docker-compose.yaml down') - } - - /** - * Ping the key generation service for a pong - * @returns {Promise} - */ - async ping(): Promise { - try { - const ping = await retry(`${this.serviceUrl}/ping`) - const { message } = await ping.json() - return message === 'pong' - } catch (error) { - return false - } - } } \ No newline at end of file diff --git a/services/keys/test/validators.test.ts b/services/keys/test/validators.test.ts index 6702b8e54..4c1fb1adb 100644 --- a/services/keys/test/validators.test.ts +++ b/services/keys/test/validators.test.ts @@ -1,27 +1,14 @@ import { SSV } from '../src/index' test('Create 2 SSV validator with 4 eligible operators', async function () { - const dkgServiceUrl = 'http://0.0.0.0:8000' + const dkgServiceUrl = 'http://0.0.0.0:3000' const groups = [[1, 2, 3, 4], [1, 2, 3, 4]] const ssv = new SSV({ dkgServiceUrl }) - const validators = [] - for (const group of groups) { - - /** Mock the local DKG service in test mode */ - if (ssv.dkgService.serviceUrl.includes('0.0.0.0')) { - console.log('Starting local DKG service...') - await ssv.dkgService.start() - } - + const validators = await Promise.all(groups.map(async (group) => { + console.log(`Starting ceremony for operators: ${group.join(',')}`) const validator = await ssv.createValidator({ operatorIds: group }) - validators.push(validator) - - /** Stop the local DKG service */ - if (ssv.dkgService.serviceUrl.includes('0.0.0.0')) { - console.log('Stopping local DKG service...') - await ssv.dkgService.stop() - } - await new Promise(resolve => setTimeout(resolve, 5000)) - } + console.log('Completed ceremony...') + return validator + })) expect(validators.length).toBe(2) }) \ No newline at end of file diff --git a/services/users/scripts/seed.ts b/services/users/scripts/seed.ts index 1856c18dd..94ab635f3 100644 --- a/services/users/scripts/seed.ts +++ b/services/users/scripts/seed.ts @@ -1,6 +1,6 @@ import minimist from 'minimist' import { userStore, accountStore } from '@casimir/data' -import { retry } from '@casimir/helpers' +import { retryFetch } from '@casimir/helpers' import { Account, User } from '@casimir/types' /** @@ -34,7 +34,7 @@ void async function () { /** Seed Account or User resources with users API */ const port = process.env.PUBLIC_USERS_PORT || 4000 - const seed = await retry(`http://localhost:${port}/seed/${plural}`, { + const seed = await retryFetch(`http://localhost:${port}/seed/${plural}`, { method: 'POST', headers: { 'Content-Type': 'application/json' From 0abb6dbefe391bc0e92f25a35dcdf6799d5626f5 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Fri, 28 Apr 2023 14:18:24 -0400 Subject: [PATCH 14/78] Add FunctionsClient to automation --- contracts/ethereum/docs/index.md | 382 +++++++++++++----- contracts/ethereum/src/CasimirAutomation.sol | 39 +- .../ethereum/src/mock/MockFunctionsOracle.sol | 32 ++ 3 files changed, 336 insertions(+), 117 deletions(-) create mode 100644 contracts/ethereum/src/mock/MockFunctionsOracle.sol diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index af78d2a62..5bb86ec36 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -2,10 +2,58 @@ ## CasimirAutomation +### oracleHeartbeat + +```solidity +uint256 oracleHeartbeat +``` + +Oracle heartbeat + +### oracleThreshold + +```solidity +uint256 oracleThreshold +``` + +Oracle threshold + +### compoundThreshold + +```solidity +uint256 compoundThreshold +``` + +Compound threshold (0.1 ETH) + +### requestCBOR + +```solidity +bytes requestCBOR +``` + +Serialized oracle source code + +### latestRequestId + +```solidity +bytes32 latestRequestId +``` + +Latest oracle request ID + +### fulfillGasLimit + +```solidity +uint32 fulfillGasLimit +``` + +Oracle fulfillment gas limit + ### constructor ```solidity -constructor(address casimirManagerAddress, address linkFunctionsAddress) public +constructor(address managerAddress, address oracleAddress, uint64 _oracleSubId) public ``` Constructor @@ -14,43 +62,64 @@ Constructor | Name | Type | Description | | ---- | ---- | ----------- | -| casimirManagerAddress | address | The manager contract address | -| linkFunctionsAddress | address | | +| managerAddress | address | The manager contract address | +| oracleAddress | address | The oracle contract address | +| _oracleSubId | uint64 | The oracle subscription ID | -### checkUpkeep +### generateRequest ```solidity -function checkUpkeep(bytes checkData) external view returns (bool upkeepNeeded, bytes performData) +function generateRequest(string source, bytes secrets, string[] args) public pure returns (bytes) ``` -Check if the upkeep is needed +Generate a new Functions.Request(off-chain, saving gas) #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| checkData | bytes | The data to check the upkeep | +| source | string | JavaScript source code | +| secrets | bytes | Encrypted secrets payload | +| args | string[] | List of arguments accessible from within the source code | -#### Return Values +### setRequest + +```solidity +function setRequest(uint32 _fulfillGasLimit, uint64 _oracleSubId, bytes _requestCBOR) external +``` + +Set the bytes representing the CBOR-encoded Functions.Request + +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| upkeepNeeded | bool | True if the upkeep is needed | -| performData | bytes | The data to perform the upkeep | +| _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | +| _oracleSubId | uint64 | The oracle billing subscription ID used to pay for Functions requests | +| _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | -### performUpkeep +### checkUpkeep ```solidity -function performUpkeep(bytes performData) external +function checkUpkeep(bytes) public view returns (bool upkeepNeeded, bytes performData) ``` -Perform the upkeep +Check if the upkeep is needed -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| performData | bytes | The data to perform the upkeep | +| upkeepNeeded | bool | True if the upkeep is needed | +| performData | bytes | | + +### performUpkeep + +```solidity +function performUpkeep(bytes) external +``` + +Perform the upkeep ### fulfillRequest @@ -66,12 +135,12 @@ Callback that is invoked once the DON has resolved the request or hit an error | ---- | ---- | ----------- | | requestId | bytes32 | The request ID, returned by sendRequest() | | response | bytes | Aggregated response from the user code | -| err | bytes | Aggregated error from the user code or from the execution pipeline Either response or error parameter will be set, but never both | +| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | ### setOracleAddress ```solidity -function setOracleAddress(address oracle) external +function setOracleAddress(address newOracleAddress) external ``` Update the functions oracle address @@ -80,7 +149,23 @@ Update the functions oracle address | Name | Type | Description | | ---- | ---- | ----------- | -| oracle | address | New oracle address | +| newOracleAddress | address | New oracle address | + +### mockFulfillRequest + +```solidity +function mockFulfillRequest(bytes32 requestId, bytes response, bytes err) external +``` + +Fulfill the request for testing + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | ## CasimirManager @@ -94,18 +179,26 @@ enum Token { } ``` +### latestActiveStake + +```solidity +uint256 latestActiveStake +``` + +Latest active (consensus) balance reported from automation + ### lastPoolId ```solidity uint256 lastPoolId ``` -Last pool ID generated for a new pool +Last pool ID created -### distributionSum +### rewardRatioSum ```solidity -uint256 distributionSum +uint256 rewardRatioSum ``` Sum of scaled reward to stake ratios (intial value required) @@ -129,7 +222,7 @@ SSV fee percentage (intial value required) ### constructor ```solidity -constructor(address beaconDepositAddress, address linkOracleAddress, address linkTokenAddress, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public +constructor(address beaconDepositAddress, address linkTokenAddress, address oracleAddress, uint64 oracleSubId, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public ``` Constructor @@ -139,27 +232,35 @@ Constructor | Name | Type | Description | | ---- | ---- | ----------- | | beaconDepositAddress | address | The Beacon deposit address | -| linkOracleAddress | address | The Chainlink functions oracle address | | linkTokenAddress | address | The Chainlink token address | +| oracleAddress | address | The Chainlink functions oracle address | +| oracleSubId | uint64 | The Chainlink functions oracle subscription ID | | ssvNetworkAddress | address | The SSV network address | | ssvTokenAddress | address | The SSV token address | | swapFactoryAddress | address | The Uniswap factory address | | swapRouterAddress | address | The Uniswap router address | | wethTokenAddress | address | The WETH contract address | -### reward +### reportStake ```solidity -function reward(uint256 amount) external +function reportStake(uint256 active, uint256 swept) external ``` -_Distribute ETH rewards_ +Report the latest consensus stake to the manager #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| amount | uint256 | The amount of ETH to reward | +| active | uint256 | The active consensus stake | +| swept | uint256 | The swept consensus stake | + +### getPrincipal + +```solidity +function getPrincipal() public view returns (uint256) +``` ### deposit @@ -199,13 +300,13 @@ function completeNextWithdrawal() external Complete the next withdrawal of user stake from exited deposits -### stakeNextPool +### stakeReadyPools ```solidity -function stakeNextPool() external +function stakeReadyPools() external ``` -Stake the next ready pool +Stake the ready pools ### requestPoolExit @@ -224,7 +325,7 @@ Request a pool exit ### completePoolExit ```solidity -function completePoolExit(uint256 poolStakedIndex, uint256 validatorStakedIndex, uint256 validatorExitingIndex) external +function completePoolExit(uint256 poolIndex, uint256 validatorIndex) external ``` Complete a pool exit @@ -233,9 +334,22 @@ Complete a pool exit | Name | Type | Description | | ---- | ---- | ----------- | -| poolStakedIndex | uint256 | The pool's staked index | -| validatorStakedIndex | uint256 | The validator's staked index | -| validatorExitingIndex | uint256 | The validator's exiting index | +| poolIndex | uint256 | The staked pool index | +| validatorIndex | uint256 | The staked validator (internal) index | + +### registerOperator + +```solidity +function registerOperator(uint32 operatorId) external payable +``` + +Register an operator with the pool manager + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint32 | The operator ID | ### registerValidator @@ -257,6 +371,23 @@ Register a validator with the pool manager | signature | bytes | The signature | | withdrawalCredentials | bytes | The withdrawal credentials | +### reshareValidator + +```solidity +function reshareValidator(bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys) external +``` + +Reshare a registered validator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| publicKey | bytes | The validator public key | +| operatorIds | uint32[] | The operator IDs | +| sharesEncrypted | bytes[] | The encrypted shares | +| sharesPublicKeys | bytes[] | The public keys of the shares | + ### setLINKFee ```solidity @@ -299,20 +430,6 @@ Update the functions oracle address | ---- | ---- | ----------- | | oracle | address | New oracle address | -### getFees - -```solidity -function getFees() public view returns (struct ICasimirManager.Fees fees) -``` - -Get the current token fees as percentages - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| fees | struct ICasimirManager.Fees | The current token fees as percentages | - ### getStake ```solidity @@ -327,50 +444,47 @@ Get the total manager stake | ---- | ---- | ----------- | | stake | uint256 | The total manager stake | -### getExecutionStake +### getQueuedStake ```solidity -function getExecutionStake() public view returns (int256 executionStake) +function getQueuedStake() public view returns (uint256 queuedStake) ``` -Get the total manager execution stake +Get the total manager queued (execution) stake #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| executionStake | int256 | The total manager execution stake | +| queuedStake | uint256 | The total manager queued (execution) stake | -### getExecutionSwept +### getSweptStake ```solidity -function getExecutionSwept() public view returns (int256 executionSwept) +function getSweptStake() public view returns (uint256 sweptStake) ``` -Get the total manager execution swept amount +Get the total manager swept (execution) stake #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| executionSwept | int256 | The total manager execution swept amount | +| sweptStake | uint256 | The total manager swept (execution) stake | -### getExpectedConsensusStake +### getActiveStake ```solidity -function getExpectedConsensusStake() public view returns (int256 expectedConsensusStake) +function getActiveStake() public view returns (uint256 activeStake) ``` -Get the total manager expected consensus stake - -_Pending user withdrawal amount is subtracted from the expected stake -The expected stake will be honored with penalty recovery in place_ +Get the manager active (consensus) stake #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| expectedConsensusStake | int256 | The total manager expected consensus stake | +| activeStake | uint256 | The total manager active (consensus) stake | ### getUserStake @@ -392,6 +506,20 @@ Get the total user stake for a given user address | ---- | ---- | ----------- | | userStake | uint256 | The total user stake | +### getFees + +```solidity +function getFees() public view returns (struct ICasimirManager.Fees fees) +``` + +Get the current token fees as percentages + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| fees | struct ICasimirManager.Fees | The current token fees as percentages | + ### getLINKFee ```solidity @@ -420,6 +548,20 @@ Get the SSV fee percentage to charge on each deposit | ---- | ---- | ----------- | | [0] | uint32 | The SSV fee percentage to charge on each deposit | +### getReadyValidatorPublicKeys + +```solidity +function getReadyValidatorPublicKeys() external view returns (bytes[]) +``` + +Get ready validator public keys + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes[] | A list of inactive validator public keys | + ### getStakedValidatorPublicKeys ```solidity @@ -434,19 +576,19 @@ Get staked validator public keys | ---- | ---- | ----------- | | [0] | bytes[] | A list of active validator public keys | -### getReadyValidatorPublicKeys +### getExitingValidatorCount ```solidity -function getReadyValidatorPublicKeys() external view returns (bytes[]) +function getExitingValidatorCount() external view returns (uint256) ``` -Get ready validator public keys +Get the count of exiting validators #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes[] | A list of inactive validator public keys | +| [0] | uint256 | The count of exiting validators | ### getOpenPoolIds @@ -476,6 +618,20 @@ Get a list of all ready pool IDs | ---- | ---- | ----------- | | [0] | uint32[] | A list of all ready pool IDs | +### getPendingPoolIds + +```solidity +function getPendingPoolIds() external view returns (uint32[]) +``` + +Get a list of all pending pool IDs + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32[] | A list of all pending pool IDs | + ### getStakedPoolIds ```solidity @@ -549,6 +705,15 @@ Used for mocking sweeps from Beacon to the manager_ ## ICasimirAutomation +### OracleReport + +```solidity +struct OracleReport { + uint256 activeStake; + uint256 withdrawnStake; +} +``` + ### OCRResponse ```solidity @@ -612,6 +777,12 @@ Always validate the data passed in._ function setOracleAddress(address oracleAddress) external ``` +### mockFulfillRequest + +```solidity +function mockFulfillRequest(bytes32 requestId, bytes result, bytes err) external +``` + ## ICasimirManager ### ProcessedDeposit @@ -659,7 +830,7 @@ struct PoolDetails { ```solidity struct User { uint256 stake0; - uint256 distributionSum0; + uint256 rewardRatioSum0; } ``` @@ -682,9 +853,16 @@ struct Validator { bytes[] sharesPublicKeys; bytes signature; bytes withdrawalCredentials; + uint256 reshareCount; } ``` +### DistributionRebalanced + +```solidity +event DistributionRebalanced(address sender, uint256 amount) +``` + ### PoolIncreased ```solidity @@ -709,40 +887,46 @@ event PoolExitRequested(uint32 poolId) event PoolExited(uint32 poolId) ``` -### RewardDistributed +### StakeDistributed ```solidity -event RewardDistributed(address sender, uint256 amount) +event StakeDistributed(address sender, uint256 amount) ``` -### UserDepositDistributed +### StakeWithdrawalRequested ```solidity -event UserDepositDistributed(address sender, uint256 amount) +event StakeWithdrawalRequested(address sender, uint256 amount) ``` -### UserWithdrawalRequested +### StakeWithdrawalInitiated ```solidity -event UserWithdrawalRequested(address sender, uint256 amount) +event StakeWithdrawalInitiated(address sender, uint256 amount) ``` -### UserWithdrawalInitiated +### StakeWithdrawn ```solidity -event UserWithdrawalInitiated(address sender, uint256 amount) +event StakeWithdrawn(address sender, uint256 amount) +``` + +### RewardDistributed + +```solidity +event RewardDistributed(address sender, uint256 amount) ``` -### UserWithdrawed +### ValidatorRegistered ```solidity -event UserWithdrawed(address sender, uint256 amount) +event ValidatorRegistered(bytes publicKey) ``` -### ValidatorAdded +### ValidatorReshared ```solidity -event ValidatorAdded(bytes publicKey) +event ValidatorReshared(bytes publicKey) ``` ### deposit @@ -751,10 +935,10 @@ event ValidatorAdded(bytes publicKey) function deposit() external payable ``` -### reward +### reportStake ```solidity -function reward(uint256 amount) external +function reportStake(uint256 current, uint256 withdrawn) external ``` ### withdraw @@ -763,10 +947,10 @@ function reward(uint256 amount) external function withdraw(uint256 amount) external ``` -### stakeNextPool +### stakeReadyPools ```solidity -function stakeNextPool() external +function stakeReadyPools() external ``` ### requestPoolExit @@ -778,7 +962,7 @@ function requestPoolExit(uint32 poolId) external ### completePoolExit ```solidity -function completePoolExit(uint256 poolIndex, uint256 stakedValidatorIndex, uint256 exitingValidatorIndex) external +function completePoolExit(uint256 poolIndex, uint256 validatorIndex) external ``` ### registerValidator @@ -823,16 +1007,22 @@ function getLINKFee() external view returns (uint32) function getSSVFee() external view returns (uint32) ``` +### getReadyValidatorPublicKeys + +```solidity +function getReadyValidatorPublicKeys() external view returns (bytes[]) +``` + ### getStakedValidatorPublicKeys ```solidity function getStakedValidatorPublicKeys() external view returns (bytes[]) ``` -### getReadyValidatorPublicKeys +### getExitingValidatorCount ```solidity -function getReadyValidatorPublicKeys() external view returns (bytes[]) +function getExitingValidatorCount() external view returns (uint256) ``` ### getReadyPoolIds @@ -841,6 +1031,12 @@ function getReadyValidatorPublicKeys() external view returns (bytes[]) function getReadyPoolIds() external view returns (uint32[]) ``` +### getPendingPoolIds + +```solidity +function getPendingPoolIds() external view returns (uint32[]) +``` + ### getStakedPoolIds ```solidity @@ -853,22 +1049,22 @@ function getStakedPoolIds() external view returns (uint32[]) function getStake() external view returns (uint256) ``` -### getExecutionStake +### getQueuedStake ```solidity -function getExecutionStake() external view returns (int256) +function getQueuedStake() external view returns (uint256) ``` -### getExecutionSwept +### getSweptStake ```solidity -function getExecutionSwept() external view returns (int256) +function getSweptStake() external view returns (uint256) ``` -### getExpectedConsensusStake +### getActiveStake ```solidity -function getExpectedConsensusStake() external view returns (int256) +function getActiveStake() external view returns (uint256) ``` ### getOpenDeposits diff --git a/contracts/ethereum/src/CasimirAutomation.sol b/contracts/ethereum/src/CasimirAutomation.sol index 79174f564..d96037448 100644 --- a/contracts/ethereum/src/CasimirAutomation.sol +++ b/contracts/ethereum/src/CasimirAutomation.sol @@ -163,17 +163,7 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { upkeepNeeded = true; } - /** Get amount swept to manager */ - uint256 sweptStake = manager.getSweptStake(); - - /** Need upkeep for rebalance or compounding */ - if (sweptStake >= compoundThreshold) { - upkeepNeeded = true; - } else { - sweptStake = 0; - } - - performData = abi.encode(readyPoolIds, sweptStake); + performData = abi.encode(readyPoolIds); } /** @@ -183,24 +173,22 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { (bool upkeepNeeded, bytes memory performData) = checkUpkeep(""); require(upkeepNeeded, "Upkeep not needed"); - (uint32[] memory readyPoolIds, uint256 sweptStake) = abi.decode( + (uint32[] memory readyPoolIds) = abi.decode( // Is decoding more efficient than getting again? performData, - (uint32[], uint256) + (uint32[]) ); /** Stake the ready pools */ - manager.stakeReadyPools(); - - /** Need to request a report */ - if (readyPoolIds.length > 0 || sweptStake >= oracleThreshold) { - // Checked in request: - // - readyValidatorPublicKeys - // - stakedValidatorPublicKeys - // - exitingValidatorPublicKeys - // Returned in response: - // - activeStake - // - sweptStake + if (readyPoolIds.length > 0) { + manager.stakeReadyPools(); // Deposit and move ready to pending } + + /** Request a report */ + // bytes32 requestId = s_oracle.sendRequest(oracleSubId, requestCBOR, fulfillGasLimit); + // s_pendingRequests[requestId] = s_oracle.getRegistry(); + // latestRequestId = requestId; + + // emit RequestSent(requestId); } /** @@ -226,6 +214,9 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { response, (uint256, uint256) ); + + // Todo apply a sensible heuristic to bound changes in stake + manager.reportStake(activeStake, sweptStake); } diff --git a/contracts/ethereum/src/mock/MockFunctionsOracle.sol b/contracts/ethereum/src/mock/MockFunctionsOracle.sol new file mode 100644 index 000000000..a631f634b --- /dev/null +++ b/contracts/ethereum/src/mock/MockFunctionsOracle.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "../vendor/interfaces/FunctionsOracleInterface.sol"; // Todo implement this interface +import "hardhat/console.sol"; + +/** + * @title MockFunctionsOracle + */ +contract MockFunctionsOracle { + + uint256 private latestRequestIdNumber; + + constructor() {} + + /** + * @notice Sends a request (encoded as data) using the provided subscriptionId + * @param subscriptionId A unique subscription ID allocated by billing system, + * a client can make requests from different contracts referencing the same subscription + * @param data Encoded Chainlink Functions request data, use FunctionsClient API to encode a request + * @param gasLimit Gas limit for the fulfillment callback + * @return requestId A unique request identifier (unique per DON) + */ + function sendRequest( + uint64 subscriptionId, + bytes calldata data, + uint32 gasLimit + ) external returns (bytes32 requestId) { + latestRequestIdNumber += 1; + requestId = keccak256(abi.encode(latestRequestIdNumber)); + } +} From b624518498a0d15de0e18abc7b224ce4c1889b04 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Fri, 28 Apr 2023 18:25:26 -0400 Subject: [PATCH 15/78] Add requested and pending withdrawals to check --- contracts/ethereum/docs/index.md | 1872 ++++++++--------- contracts/ethereum/src/CasimirAutomation.sol | 38 +- contracts/ethereum/src/CasimirManager.sol | 110 +- .../src/interfaces/ICasimirAutomation.sol | 3 +- .../src/interfaces/ICasimirManager.sol | 11 +- contracts/ethereum/test/fixtures/shared.ts | 100 +- contracts/ethereum/test/integration.ts | 2 +- 7 files changed, 1085 insertions(+), 1051 deletions(-) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 5bb86ec36..04035f427 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -1,1637 +1,1669 @@ # Solidity API -## CasimirAutomation +## MockFunctionsOracle -### oracleHeartbeat +### constructor ```solidity -uint256 oracleHeartbeat +constructor() public ``` -Oracle heartbeat - -### oracleThreshold +### sendRequest ```solidity -uint256 oracleThreshold +function sendRequest(uint64 subscriptionId, bytes data, uint32 gasLimit) external returns (bytes32 requestId) ``` -Oracle threshold - -### compoundThreshold +Sends a request (encoded as data) using the provided subscriptionId -```solidity -uint256 compoundThreshold -``` +#### Parameters -Compound threshold (0.1 ETH) +| Name | Type | Description | +| ---- | ---- | ----------- | +| subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | +| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| gasLimit | uint32 | Gas limit for the fulfillment callback | -### requestCBOR +#### Return Values -```solidity -bytes requestCBOR -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | A unique request identifier (unique per DON) | -Serialized oracle source code +## FunctionsBillingRegistryInterface -### latestRequestId +### RequestBilling ```solidity -bytes32 latestRequestId +struct RequestBilling { + uint64 subscriptionId; + address client; + uint32 gasLimit; + uint256 gasPrice; +} ``` -Latest oracle request ID - -### fulfillGasLimit +### FulfillResult ```solidity -uint32 fulfillGasLimit +enum FulfillResult { + USER_SUCCESS, + USER_ERROR, + INVALID_REQUEST_ID +} ``` -Oracle fulfillment gas limit - -### constructor +### getRequestConfig ```solidity -constructor(address managerAddress, address oracleAddress, uint64 _oracleSubId) public +function getRequestConfig() external view returns (uint32, address[]) ``` -Constructor +Get configuration relevant for making requests -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| managerAddress | address | The manager contract address | -| oracleAddress | address | The oracle contract address | -| _oracleSubId | uint64 | The oracle subscription ID | +| [0] | uint32 | uint32 global max for request gas limit | +| [1] | address[] | address[] list of registered DONs | -### generateRequest +### getRequiredFee ```solidity -function generateRequest(string source, bytes secrets, string[] args) public pure returns (bytes) +function getRequiredFee(bytes data, struct FunctionsBillingRegistryInterface.RequestBilling billing) external view returns (uint96) ``` -Generate a new Functions.Request(off-chain, saving gas) +Determine the charged fee that will be paid to the Registry owner #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| source | string | JavaScript source code | -| secrets | bytes | Encrypted secrets payload | -| args | string[] | List of arguments accessible from within the source code | +| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| billing | struct FunctionsBillingRegistryInterface.RequestBilling | The request's billing configuration | -### setRequest +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint96 | fee Cost in Juels (1e18) of LINK | + +### estimateCost ```solidity -function setRequest(uint32 _fulfillGasLimit, uint64 _oracleSubId, bytes _requestCBOR) external +function estimateCost(uint32 gasLimit, uint256 gasPrice, uint96 donFee, uint96 registryFee) external view returns (uint96) ``` -Set the bytes representing the CBOR-encoded Functions.Request +Estimate the total cost to make a request: gas re-imbursement, plus DON fee, plus Registry fee #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | -| _oracleSubId | uint64 | The oracle billing subscription ID used to pay for Functions requests | -| _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | - -### checkUpkeep - -```solidity -function checkUpkeep(bytes) public view returns (bool upkeepNeeded, bytes performData) -``` - -Check if the upkeep is needed +| gasLimit | uint32 | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| gasPrice | uint256 | The request's billing configuration | +| donFee | uint96 | Fee charged by the DON that is paid to Oracle Node | +| registryFee | uint96 | Fee charged by the DON that is paid to Oracle Node | #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| upkeepNeeded | bool | True if the upkeep is needed | -| performData | bytes | | +| [0] | uint96 | costEstimate Cost in Juels (1e18) of LINK | -### performUpkeep +### startBilling ```solidity -function performUpkeep(bytes) external +function startBilling(bytes data, struct FunctionsBillingRegistryInterface.RequestBilling billing) external returns (bytes32) ``` -Perform the upkeep +Initiate the billing process for an Functions request -### fulfillRequest +_Only callable by a node that has been approved on the Registry_ -```solidity -function fulfillRequest(bytes32 requestId, bytes response, bytes err) internal -``` +#### Parameters -Callback that is invoked once the DON has resolved the request or hit an error +| Name | Type | Description | +| ---- | ---- | ----------- | +| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| billing | struct FunctionsBillingRegistryInterface.RequestBilling | Billing configuration for the request | -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| requestId | bytes32 | The request ID, returned by sendRequest() | -| response | bytes | Aggregated response from the user code | -| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | +| [0] | bytes32 | requestId - A unique identifier of the request. Can be used to match a request to a response in fulfillRequest. | -### setOracleAddress +### fulfillAndBill ```solidity -function setOracleAddress(address newOracleAddress) external +function fulfillAndBill(bytes32 requestId, bytes response, bytes err, address transmitter, address[31] signers, uint8 signerCount, uint256 reportValidationGas, uint256 initialGas) external returns (enum FunctionsBillingRegistryInterface.FulfillResult) ``` -Update the functions oracle address +Finalize billing process for an Functions request by sending a callback to the Client contract and then charging the subscription + +_Only callable by a node that has been approved on the Registry +simulated offchain to determine if sufficient balance is present to fulfill the request_ #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| newOracleAddress | address | New oracle address | +| requestId | bytes32 | identifier for the request that was generated by the Registry in the beginBilling commitment | +| response | bytes | response data from DON consensus | +| err | bytes | error from DON consensus | +| transmitter | address | the Oracle who sent the report | +| signers | address[31] | the Oracles who had a part in generating the report | +| signerCount | uint8 | the number of signers on the report | +| reportValidationGas | uint256 | the amount of gas used for the report validation. Cost is split by all fulfillments on the report. | +| initialGas | uint256 | the initial amount of gas that should be used as a baseline to charge the single fulfillment for execution cost | -### mockFulfillRequest +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | enum FunctionsBillingRegistryInterface.FulfillResult | result fulfillment result | + +### getSubscriptionOwner ```solidity -function mockFulfillRequest(bytes32 requestId, bytes response, bytes err) external +function getSubscriptionOwner(uint64 subscriptionId) external view returns (address owner) ``` -Fulfill the request for testing +Gets subscription owner. #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| requestId | bytes32 | The request ID, returned by sendRequest() | -| response | bytes | Aggregated response from the user code | -| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | +| subscriptionId | uint64 | - ID of the subscription | -## CasimirManager +#### Return Values -### Token +| Name | Type | Description | +| ---- | ---- | ----------- | +| owner | address | - owner of the subscription. | -```solidity -enum Token { - LINK, - SSV, - WETH -} -``` +## FunctionsOracleInterface -### latestActiveStake +### getRegistry ```solidity -uint256 latestActiveStake +function getRegistry() external view returns (address) ``` -Latest active (consensus) balance reported from automation - -### lastPoolId +Gets the stored billing registry address -```solidity -uint256 lastPoolId -``` +#### Return Values -Last pool ID created +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | address | registryAddress The address of Chainlink Functions billing registry contract | -### rewardRatioSum +### setRegistry ```solidity -uint256 rewardRatioSum +function setRegistry(address registryAddress) external ``` -Sum of scaled reward to stake ratios (intial value required) +Sets the stored billing registry address -### linkFee +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| registryAddress | address | The new address of Chainlink Functions billing registry contract | + +### getDONPublicKey ```solidity -uint32 linkFee +function getDONPublicKey() external view returns (bytes) ``` -LINK fee percentage (intial value required) +Returns the DON's secp256k1 public key that is used to encrypt secrets -### ssvFee +_All nodes on the DON have the corresponding private key +needed to decrypt the secrets encrypted with the public key_ -```solidity -uint32 ssvFee -``` +#### Return Values -SSV fee percentage (intial value required) +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes | publicKey the DON's public key | -### constructor +### setDONPublicKey ```solidity -constructor(address beaconDepositAddress, address linkTokenAddress, address oracleAddress, uint64 oracleSubId, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public +function setDONPublicKey(bytes donPublicKey) external ``` -Constructor +Sets DON's secp256k1 public key used to encrypt secrets + +_Used to rotate the key_ #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| beaconDepositAddress | address | The Beacon deposit address | -| linkTokenAddress | address | The Chainlink token address | -| oracleAddress | address | The Chainlink functions oracle address | -| oracleSubId | uint64 | The Chainlink functions oracle subscription ID | -| ssvNetworkAddress | address | The SSV network address | -| ssvTokenAddress | address | The SSV token address | -| swapFactoryAddress | address | The Uniswap factory address | -| swapRouterAddress | address | The Uniswap router address | -| wethTokenAddress | address | The WETH contract address | +| donPublicKey | bytes | The new public key | -### reportStake +### setNodePublicKey ```solidity -function reportStake(uint256 active, uint256 swept) external +function setNodePublicKey(address node, bytes publicKey) external ``` -Report the latest consensus stake to the manager +Sets a per-node secp256k1 public key used to encrypt secrets for that node + +_Callable only by contract owner and DON members_ #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| active | uint256 | The active consensus stake | -| swept | uint256 | The swept consensus stake | +| node | address | node's address | +| publicKey | bytes | node's public key | -### getPrincipal - -```solidity -function getPrincipal() public view returns (uint256) -``` - -### deposit +### deleteNodePublicKey ```solidity -function deposit() external payable +function deleteNodePublicKey(address node) external ``` -Deposit user stake to the pool manager - -### withdraw - -```solidity -function withdraw(uint256 amount) external -``` +Deletes node's public key -Withdraw user stake +_Callable only by contract owner or the node itself_ #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| amount | uint256 | The amount of ETH to withdraw | +| node | address | node's address | -### inititateNextWithdrawal +### getAllNodePublicKeys ```solidity -function inititateNextWithdrawal() external +function getAllNodePublicKeys() external view returns (address[], bytes[]) ``` -Initiate the next withdrawal of user stake from exited deposits +Return two arrays of equal size containing DON members' addresses and their corresponding +public keys (or empty byte arrays if per-node key is not defined) -### completeNextWithdrawal +### getRequiredFee ```solidity -function completeNextWithdrawal() external +function getRequiredFee(bytes data, struct FunctionsBillingRegistryInterface.RequestBilling billing) external view returns (uint96) ``` -Complete the next withdrawal of user stake from exited deposits +Determine the fee charged by the DON that will be split between signing Node Operators for servicing the request -### stakeReadyPools +#### Parameters -```solidity -function stakeReadyPools() external -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| billing | struct FunctionsBillingRegistryInterface.RequestBilling | The request's billing configuration | -Stake the ready pools +#### Return Values -### requestPoolExit +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint96 | fee Cost in Juels (1e18) of LINK | + +### estimateCost ```solidity -function requestPoolExit(uint32 poolId) external +function estimateCost(uint64 subscriptionId, bytes data, uint32 gasLimit, uint256 gasPrice) external view returns (uint96) ``` -Request a pool exit +Estimate the total cost that will be charged to a subscription to make a request: gas re-imbursement, plus DON fee, plus Registry fee #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| poolId | uint32 | The staked pool ID | +| subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | +| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| gasLimit | uint32 | Gas limit for the fulfillment callback | +| gasPrice | uint256 | | -### completePoolExit +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint96 | billedCost Cost in Juels (1e18) of LINK | + +### sendRequest ```solidity -function completePoolExit(uint256 poolIndex, uint256 validatorIndex) external +function sendRequest(uint64 subscriptionId, bytes data, uint32 gasLimit) external returns (bytes32) ``` -Complete a pool exit +Sends a request (encoded as data) using the provided subscriptionId #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| poolIndex | uint256 | The staked pool index | -| validatorIndex | uint256 | The staked validator (internal) index | +| subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | +| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| gasLimit | uint32 | Gas limit for the fulfillment callback | -### registerOperator +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes32 | requestId A unique request identifier (unique per DON) | + +## CasimirAutomation + +### oracleHeartbeat ```solidity -function registerOperator(uint32 operatorId) external payable +uint256 oracleHeartbeat ``` -Register an operator with the pool manager +Oracle heartbeat -#### Parameters +### oracleThreshold -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint32 | The operator ID | +```solidity +uint256 oracleThreshold +``` -### registerValidator +Oracle threshold + +### compoundThreshold ```solidity -function registerValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external +uint256 compoundThreshold ``` -Register a validator with the pool manager +Compound threshold (0.1 ETH) -#### Parameters +### requestCBOR -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositDataRoot | bytes32 | The deposit data root | -| publicKey | bytes | The validator public key | -| operatorIds | uint32[] | The operator IDs | -| sharesEncrypted | bytes[] | The encrypted shares | -| sharesPublicKeys | bytes[] | The public keys of the shares | -| signature | bytes | The signature | -| withdrawalCredentials | bytes | The withdrawal credentials | +```solidity +bytes requestCBOR +``` -### reshareValidator +Serialized oracle source code + +### latestRequestId ```solidity -function reshareValidator(bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys) external +bytes32 latestRequestId ``` -Reshare a registered validator +Latest oracle request ID -#### Parameters +### fulfillGasLimit -| Name | Type | Description | -| ---- | ---- | ----------- | -| publicKey | bytes | The validator public key | -| operatorIds | uint32[] | The operator IDs | -| sharesEncrypted | bytes[] | The encrypted shares | -| sharesPublicKeys | bytes[] | The public keys of the shares | +```solidity +uint32 fulfillGasLimit +``` -### setLINKFee +Oracle fulfillment gas limit + +### constructor ```solidity -function setLINKFee(uint32 newFee) external +constructor(address managerAddress, address oracleAddress, uint64 _oracleSubId) public ``` -_Update link fee_ +Constructor #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| newFee | uint32 | The new fee | +| managerAddress | address | The manager contract address | +| oracleAddress | address | The oracle contract address | +| _oracleSubId | uint64 | The oracle subscription ID | -### setSSVFee +### generateRequest ```solidity -function setSSVFee(uint32 newFee) external +function generateRequest(string source, bytes secrets, string[] args) public pure returns (bytes) ``` -_Update ssv fee_ +Generate a new Functions.Request(off-chain, saving gas) #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| newFee | uint32 | The new fee | +| source | string | JavaScript source code | +| secrets | bytes | Encrypted secrets payload | +| args | string[] | List of arguments accessible from within the source code | -### setOracleAddress +### setRequest ```solidity -function setOracleAddress(address oracle) external +function setRequest(uint32 _fulfillGasLimit, uint64 _oracleSubId, bytes _requestCBOR) external ``` -Update the functions oracle address +Set the bytes representing the CBOR-encoded Functions.Request #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| oracle | address | New oracle address | +| _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | +| _oracleSubId | uint64 | The oracle billing subscription ID used to pay for Functions requests | +| _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | -### getStake +### checkUpkeep ```solidity -function getStake() public view returns (uint256 stake) +function checkUpkeep(bytes) public view returns (bool upkeepNeeded, bytes performData) ``` -Get the total manager stake +Check if the upkeep is needed #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| stake | uint256 | The total manager stake | +| upkeepNeeded | bool | True if the upkeep is needed | +| performData | bytes | | -### getQueuedStake +### performUpkeep ```solidity -function getQueuedStake() public view returns (uint256 queuedStake) +function performUpkeep(bytes) external ``` -Get the total manager queued (execution) stake - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| queuedStake | uint256 | The total manager queued (execution) stake | +Perform the upkeep -### getSweptStake +### fulfillRequest ```solidity -function getSweptStake() public view returns (uint256 sweptStake) +function fulfillRequest(bytes32 requestId, bytes response, bytes err) internal ``` -Get the total manager swept (execution) stake +Callback that is invoked once the DON has resolved the request or hit an error -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| sweptStake | uint256 | The total manager swept (execution) stake | +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | -### getActiveStake +### setOracleAddress ```solidity -function getActiveStake() public view returns (uint256 activeStake) +function setOracleAddress(address newOracleAddress) external ``` -Get the manager active (consensus) stake +Update the functions oracle address -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| activeStake | uint256 | The total manager active (consensus) stake | +| newOracleAddress | address | New oracle address | -### getUserStake +### mockFulfillRequest ```solidity -function getUserStake(address userAddress) public view returns (uint256 userStake) +function mockFulfillRequest(bytes32 requestId, bytes response, bytes err) external ``` -Get the total user stake for a given user address +Fulfill the request for testing #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| userAddress | address | The user address | - -#### Return Values +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | -| Name | Type | Description | -| ---- | ---- | ----------- | -| userStake | uint256 | The total user stake | +## CasimirManager -### getFees +### Token ```solidity -function getFees() public view returns (struct ICasimirManager.Fees fees) +enum Token { + LINK, + SSV, + WETH +} ``` -Get the current token fees as percentages +### latestActiveStake -#### Return Values +```solidity +uint256 latestActiveStake +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| fees | struct ICasimirManager.Fees | The current token fees as percentages | +Latest active (consensus) balance reported from automation -### getLINKFee +### lastPoolId ```solidity -function getLINKFee() external view returns (uint32) +uint256 lastPoolId ``` -Get the LINK fee percentage to charge on each deposit +Last pool ID created -#### Return Values +### rewardRatioSum -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32 | The LINK fee percentage to charge on each deposit | +```solidity +uint256 rewardRatioSum +``` -### getSSVFee +Sum of scaled reward to stake ratios (intial value required) + +### linkFee ```solidity -function getSSVFee() external view returns (uint32) +uint32 linkFee ``` -Get the SSV fee percentage to charge on each deposit +LINK fee percentage (intial value required) -#### Return Values +### ssvFee -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32 | The SSV fee percentage to charge on each deposit | +```solidity +uint32 ssvFee +``` -### getReadyValidatorPublicKeys +SSV fee percentage (intial value required) + +### constructor ```solidity -function getReadyValidatorPublicKeys() external view returns (bytes[]) +constructor(address beaconDepositAddress, address linkTokenAddress, address oracleAddress, uint64 oracleSubId, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public ``` -Get ready validator public keys +Constructor -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes[] | A list of inactive validator public keys | +| beaconDepositAddress | address | The Beacon deposit address | +| linkTokenAddress | address | The Chainlink token address | +| oracleAddress | address | The Chainlink functions oracle address | +| oracleSubId | uint64 | The Chainlink functions oracle subscription ID | +| ssvNetworkAddress | address | The SSV network address | +| ssvTokenAddress | address | The SSV token address | +| swapFactoryAddress | address | The Uniswap factory address | +| swapRouterAddress | address | The Uniswap router address | +| wethTokenAddress | address | The WETH contract address | -### getStakedValidatorPublicKeys +### reportStake ```solidity -function getStakedValidatorPublicKeys() external view returns (bytes[]) +function reportStake(uint256 active, uint256 swept) external ``` -Get staked validator public keys +Report the latest consensus stake to the manager -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes[] | A list of active validator public keys | +| active | uint256 | The active consensus stake | +| swept | uint256 | The swept consensus stake | -### getExitingValidatorCount +### getPrincipal ```solidity -function getExitingValidatorCount() external view returns (uint256) +function getPrincipal() public view returns (uint256) ``` -Get the count of exiting validators +### deposit -#### Return Values +```solidity +function deposit() external payable +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The count of exiting validators | +Deposit user stake to the pool manager -### getOpenPoolIds +### withdraw ```solidity -function getOpenPoolIds() external view returns (uint32[]) +function withdraw(uint256 amount) external ``` -Get a list of all open pool IDs +Withdraw user stake -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32[] | A list of all open pool IDs | +| amount | uint256 | The amount of ETH to withdraw | -### getReadyPoolIds +### inititateNextWithdrawal ```solidity -function getReadyPoolIds() external view returns (uint32[]) +function inititateNextWithdrawal() external ``` -Get a list of all ready pool IDs +Initiate the next withdrawal of user stake from exited deposits -#### Return Values +### completeNextWithdrawal -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32[] | A list of all ready pool IDs | +```solidity +function completeNextWithdrawal() external +``` -### getPendingPoolIds +Complete the next withdrawal of user stake from exited deposits + +### stakeReadyPools ```solidity -function getPendingPoolIds() external view returns (uint32[]) +function stakeReadyPools() external ``` -Get a list of all pending pool IDs +Stake the ready pools -#### Return Values +### requestPoolExit + +```solidity +function requestPoolExit(uint32 poolId) external +``` + +Request a pool exit + +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32[] | A list of all pending pool IDs | +| poolId | uint32 | The staked pool ID | -### getStakedPoolIds +### completePoolExit ```solidity -function getStakedPoolIds() external view returns (uint32[]) +function completePoolExit(uint256 poolIndex, uint256 validatorIndex) external ``` -Get a list of all staked pool IDs +Complete a pool exit -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32[] | A list of all staked pool IDs | +| poolIndex | uint256 | The staked pool index | +| validatorIndex | uint256 | The staked validator (internal) index | -### getOpenDeposits +### registerOperator ```solidity -function getOpenDeposits() external view returns (uint256) +function registerOperator(uint32 operatorId) external payable ``` -Get the total manager open deposits +Register an operator with the pool manager -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | The total manager open deposits | +| operatorId | uint32 | The operator ID | -### getPoolDetails +### registerValidator ```solidity -function getPoolDetails(uint32 poolId) external view returns (struct ICasimirManager.PoolDetails poolDetails) +function registerValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external ``` -Get the pool details for a given pool ID +Register a validator with the pool manager #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | +| depositDataRoot | bytes32 | The deposit data root | +| publicKey | bytes | The validator public key | +| operatorIds | uint32[] | The operator IDs | +| sharesEncrypted | bytes[] | The encrypted shares | +| sharesPublicKeys | bytes[] | The public keys of the shares | +| signature | bytes | The signature | +| withdrawalCredentials | bytes | The withdrawal credentials | -#### Return Values +### reshareValidator + +```solidity +function reshareValidator(bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys) external +``` + +Reshare a registered validator + +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| poolDetails | struct ICasimirManager.PoolDetails | The pool details | +| publicKey | bytes | The validator public key | +| operatorIds | uint32[] | The operator IDs | +| sharesEncrypted | bytes[] | The encrypted shares | +| sharesPublicKeys | bytes[] | The public keys of the shares | -### getAutomationAddress +### setLINKFee ```solidity -function getAutomationAddress() external view returns (address automationAddress) +function setLINKFee(uint32 newFee) external ``` -Get the automation address +_Update link fee_ -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| automationAddress | address | The automation address | +| newFee | uint32 | The new fee | -### receive +### setSSVFee ```solidity -receive() external payable +function setSSVFee(uint32 newFee) external ``` -_Will be removed in production -Used for mocking sweeps from Beacon to the manager_ +_Update ssv fee_ -## ICasimirAutomation +#### Parameters -### OracleReport +| Name | Type | Description | +| ---- | ---- | ----------- | +| newFee | uint32 | The new fee | + +### setOracleAddress ```solidity -struct OracleReport { - uint256 activeStake; - uint256 withdrawnStake; -} +function setOracleAddress(address oracle) external ``` -### OCRResponse +Update the functions oracle address -```solidity -event OCRResponse(bytes32 requestId, bytes result, bytes err) -``` +#### Parameters -### checkUpkeep +| Name | Type | Description | +| ---- | ---- | ----------- | +| oracle | address | New oracle address | + +### getStake ```solidity -function checkUpkeep(bytes checkData) external returns (bool upkeepNeeded, bytes performData) +function getStake() public view returns (uint256 stake) ``` -method that is simulated by the keepers to see if any work actually -needs to be performed. This method does does not actually need to be -executable, and since it is only ever simulated it can consume lots of gas. - -_To ensure that it is never called, you may want to add the -cannotExecute modifier from KeeperBase to your implementation of this -method._ +Get the total manager stake -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| checkData | bytes | specified in the upkeep registration so it is always the same for a registered upkeep. This can easily be broken down into specific arguments using `abi.decode`, so multiple upkeeps can be registered on the same contract and easily differentiated by the contract. | +| stake | uint256 | The total manager stake | + +### getQueuedStake + +```solidity +function getQueuedStake() public view returns (uint256 queuedStake) +``` + +Get the total manager queued (execution) stake #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| upkeepNeeded | bool | boolean to indicate whether the keeper should call performUpkeep or not. | -| performData | bytes | bytes that the keeper should call performUpkeep with, if upkeep is needed. If you would like to encode data to decode later, try `abi.encode`. | +| queuedStake | uint256 | The total manager queued (execution) stake | -### performUpkeep +### getSweptStake ```solidity -function performUpkeep(bytes performData) external +function getSweptStake() public view returns (uint256 sweptStake) ``` -method that is actually executed by the keepers, via the registry. -The data returned by the checkUpkeep simulation will be passed into -this method to actually be executed. - -_The input to this method should not be trusted, and the caller of the -method should not even be restricted to any single registry. Anyone should -be able call it, and the input should be validated, there is no guarantee -that the data passed in is the performData returned from checkUpkeep. This -could happen due to malicious keepers, racing keepers, or simply a state -change while the performUpkeep transaction is waiting for confirmation. -Always validate the data passed in._ +Get the total manager swept (execution) stake -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| performData | bytes | is the data which was passed back from the checkData simulation. If it is encoded, it can easily be decoded into other types by calling `abi.decode`. This data should not be trusted, and should be validated against the contract's current state. | +| sweptStake | uint256 | The total manager swept (execution) stake | -### setOracleAddress +### getActiveStake ```solidity -function setOracleAddress(address oracleAddress) external +function getActiveStake() public view returns (uint256 activeStake) ``` -### mockFulfillRequest +Get the manager active (consensus) stake -```solidity -function mockFulfillRequest(bytes32 requestId, bytes result, bytes err) external -``` +#### Return Values -## ICasimirManager +| Name | Type | Description | +| ---- | ---- | ----------- | +| activeStake | uint256 | The total manager active (consensus) stake | -### ProcessedDeposit +### getUserStake ```solidity -struct ProcessedDeposit { - uint256 ethAmount; - uint256 linkAmount; - uint256 ssvAmount; -} +function getUserStake(address userAddress) public view returns (uint256 userStake) ``` -### Fees - -```solidity -struct Fees { - uint32 LINK; - uint32 SSV; -} -``` +Get the total user stake for a given user address -### Pool +#### Parameters -```solidity -struct Pool { - uint256 deposits; - bytes validatorPublicKey; - bool exiting; -} -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| userAddress | address | The user address | -### PoolDetails +#### Return Values -```solidity -struct PoolDetails { - uint256 deposits; - bytes validatorPublicKey; - uint32[] operatorIds; - bool exiting; -} -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| userStake | uint256 | The total user stake | -### User +### getFees ```solidity -struct User { - uint256 stake0; - uint256 rewardRatioSum0; -} +function getFees() public view returns (struct ICasimirManager.Fees fees) ``` -### UserWithdrawal +Get the current token fees as percentages -```solidity -struct UserWithdrawal { - address user; - uint256 amount; -} -``` +#### Return Values -### Validator +| Name | Type | Description | +| ---- | ---- | ----------- | +| fees | struct ICasimirManager.Fees | The current token fees as percentages | + +### getLINKFee ```solidity -struct Validator { - bytes32 depositDataRoot; - uint32[] operatorIds; - bytes[] sharesEncrypted; - bytes[] sharesPublicKeys; - bytes signature; - bytes withdrawalCredentials; - uint256 reshareCount; -} +function getLINKFee() external view returns (uint32) ``` -### DistributionRebalanced +Get the LINK fee percentage to charge on each deposit -```solidity -event DistributionRebalanced(address sender, uint256 amount) -``` +#### Return Values -### PoolIncreased +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32 | The LINK fee percentage to charge on each deposit | + +### getSSVFee ```solidity -event PoolIncreased(address sender, uint32 poolId, uint256 amount) +function getSSVFee() external view returns (uint32) ``` -### PoolStaked +Get the SSV fee percentage to charge on each deposit -```solidity -event PoolStaked(uint32 poolId) -``` +#### Return Values -### PoolExitRequested +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32 | The SSV fee percentage to charge on each deposit | + +### getReadyValidatorPublicKeys ```solidity -event PoolExitRequested(uint32 poolId) +function getReadyValidatorPublicKeys() external view returns (bytes[]) ``` -### PoolExited +Get ready validator public keys -```solidity -event PoolExited(uint32 poolId) -``` +#### Return Values -### StakeDistributed +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes[] | A list of inactive validator public keys | + +### getStakedValidatorPublicKeys ```solidity -event StakeDistributed(address sender, uint256 amount) +function getStakedValidatorPublicKeys() external view returns (bytes[]) ``` -### StakeWithdrawalRequested +Get staked validator public keys -```solidity -event StakeWithdrawalRequested(address sender, uint256 amount) -``` +#### Return Values -### StakeWithdrawalInitiated +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes[] | A list of active validator public keys | + +### getExitingValidatorCount ```solidity -event StakeWithdrawalInitiated(address sender, uint256 amount) +function getExitingValidatorCount() external view returns (uint256) ``` -### StakeWithdrawn +Get the count of exiting validators -```solidity -event StakeWithdrawn(address sender, uint256 amount) -``` +#### Return Values -### RewardDistributed +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | The count of exiting validators | + +### getOpenPoolIds ```solidity -event RewardDistributed(address sender, uint256 amount) +function getOpenPoolIds() external view returns (uint32[]) ``` -### ValidatorRegistered +Get a list of all open pool IDs -```solidity -event ValidatorRegistered(bytes publicKey) -``` +#### Return Values -### ValidatorReshared +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32[] | A list of all open pool IDs | + +### getReadyPoolIds ```solidity -event ValidatorReshared(bytes publicKey) +function getReadyPoolIds() external view returns (uint32[]) ``` -### deposit +Get a list of all ready pool IDs -```solidity -function deposit() external payable -``` +#### Return Values -### reportStake +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32[] | A list of all ready pool IDs | + +### getPendingPoolIds ```solidity -function reportStake(uint256 current, uint256 withdrawn) external +function getPendingPoolIds() external view returns (uint32[]) ``` -### withdraw +Get a list of all pending pool IDs -```solidity -function withdraw(uint256 amount) external -``` +#### Return Values -### stakeReadyPools +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32[] | A list of all pending pool IDs | + +### getStakedPoolIds ```solidity -function stakeReadyPools() external +function getStakedPoolIds() external view returns (uint32[]) ``` -### requestPoolExit +Get a list of all staked pool IDs -```solidity -function requestPoolExit(uint32 poolId) external -``` +#### Return Values -### completePoolExit +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32[] | A list of all staked pool IDs | + +### getOpenDeposits ```solidity -function completePoolExit(uint256 poolIndex, uint256 validatorIndex) external +function getOpenDeposits() external view returns (uint256) ``` -### registerValidator +Get the total manager open deposits -```solidity -function registerValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external -``` +#### Return Values -### setLINKFee +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | The total manager open deposits | + +### getPoolDetails ```solidity -function setLINKFee(uint32 fee) external +function getPoolDetails(uint32 poolId) external view returns (struct ICasimirManager.PoolDetails poolDetails) ``` -### setSSVFee +Get the pool details for a given pool ID -```solidity -function setSSVFee(uint32 fee) external -``` +#### Parameters -### setOracleAddress +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolId | uint32 | The pool ID | -```solidity -function setOracleAddress(address oracleAddress) external -``` +#### Return Values -### getFees +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolDetails | struct ICasimirManager.PoolDetails | The pool details | + +### getAutomationAddress ```solidity -function getFees() external view returns (struct ICasimirManager.Fees) +function getAutomationAddress() external view returns (address automationAddress) ``` -### getLINKFee +Get the automation address -```solidity -function getLINKFee() external view returns (uint32) -``` +#### Return Values -### getSSVFee +| Name | Type | Description | +| ---- | ---- | ----------- | +| automationAddress | address | The automation address | + +### receive ```solidity -function getSSVFee() external view returns (uint32) +receive() external payable ``` -### getReadyValidatorPublicKeys +_Will be removed in production +Used for mocking sweeps from Beacon to the manager_ -```solidity -function getReadyValidatorPublicKeys() external view returns (bytes[]) -``` +## ICasimirAutomation -### getStakedValidatorPublicKeys +### OracleReport ```solidity -function getStakedValidatorPublicKeys() external view returns (bytes[]) +struct OracleReport { + uint256 activeStake; + uint256 withdrawnStake; +} ``` -### getExitingValidatorCount +### OCRResponse ```solidity -function getExitingValidatorCount() external view returns (uint256) +event OCRResponse(bytes32 requestId, bytes result, bytes err) ``` -### getReadyPoolIds +### checkUpkeep ```solidity -function getReadyPoolIds() external view returns (uint32[]) +function checkUpkeep(bytes checkData) external returns (bool upkeepNeeded, bytes performData) ``` -### getPendingPoolIds +method that is simulated by the keepers to see if any work actually +needs to be performed. This method does does not actually need to be +executable, and since it is only ever simulated it can consume lots of gas. -```solidity -function getPendingPoolIds() external view returns (uint32[]) -``` +_To ensure that it is never called, you may want to add the +cannotExecute modifier from KeeperBase to your implementation of this +method._ -### getStakedPoolIds +#### Parameters -```solidity -function getStakedPoolIds() external view returns (uint32[]) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| checkData | bytes | specified in the upkeep registration so it is always the same for a registered upkeep. This can easily be broken down into specific arguments using `abi.decode`, so multiple upkeeps can be registered on the same contract and easily differentiated by the contract. | -### getStake +#### Return Values -```solidity -function getStake() external view returns (uint256) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| upkeepNeeded | bool | boolean to indicate whether the keeper should call performUpkeep or not. | +| performData | bytes | bytes that the keeper should call performUpkeep with, if upkeep is needed. If you would like to encode data to decode later, try `abi.encode`. | -### getQueuedStake +### performUpkeep ```solidity -function getQueuedStake() external view returns (uint256) +function performUpkeep(bytes performData) external ``` -### getSweptStake +method that is actually executed by the keepers, via the registry. +The data returned by the checkUpkeep simulation will be passed into +this method to actually be executed. -```solidity -function getSweptStake() external view returns (uint256) -``` +_The input to this method should not be trusted, and the caller of the +method should not even be restricted to any single registry. Anyone should +be able call it, and the input should be validated, there is no guarantee +that the data passed in is the performData returned from checkUpkeep. This +could happen due to malicious keepers, racing keepers, or simply a state +change while the performUpkeep transaction is waiting for confirmation. +Always validate the data passed in._ -### getActiveStake +#### Parameters -```solidity -function getActiveStake() external view returns (uint256) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| performData | bytes | is the data which was passed back from the checkData simulation. If it is encoded, it can easily be decoded into other types by calling `abi.decode`. This data should not be trusted, and should be validated against the contract's current state. | -### getOpenDeposits +### setOracleAddress ```solidity -function getOpenDeposits() external view returns (uint256) +function setOracleAddress(address oracleAddress) external ``` -### getUserStake +### mockFulfillRequest ```solidity -function getUserStake(address userAddress) external view returns (uint256) +function mockFulfillRequest(bytes32 requestId, bytes result, bytes err) external ``` -## Types32Array +## ICasimirManager -### remove +### ProcessedDeposit ```solidity -function remove(uint32[] arr, uint256 index) internal +struct ProcessedDeposit { + uint256 ethAmount; + uint256 linkAmount; + uint256 ssvAmount; +} ``` -## TypesBytesArray - -### remove +### Fees ```solidity -function remove(bytes[] arr, uint256 index) internal +struct Fees { + uint32 LINK; + uint32 SSV; +} ``` -## TypesUserWithdrawalArray - -### remove +### Pool ```solidity -function remove(struct ICasimirManager.UserWithdrawal[] arr, uint256 index) internal +struct Pool { + uint256 deposits; + bytes validatorPublicKey; + bool exiting; +} ``` -## Functions - -### DEFAULT_BUFFER_SIZE +### PoolDetails ```solidity -uint256 DEFAULT_BUFFER_SIZE +struct PoolDetails { + uint256 deposits; + bytes validatorPublicKey; + uint32[] operatorIds; + bool exiting; +} ``` -### Location +### User ```solidity -enum Location { - Inline, - Remote +struct User { + uint256 stake0; + uint256 rewardRatioSum0; } ``` -### CodeLanguage +### UserWithdrawal ```solidity -enum CodeLanguage { - JavaScript +struct UserWithdrawal { + address user; + uint256 amount; } ``` -### Request +### Validator ```solidity -struct Request { - enum Functions.Location codeLocation; - enum Functions.Location secretsLocation; - enum Functions.CodeLanguage language; - string source; - bytes secrets; - string[] args; +struct Validator { + bytes32 depositDataRoot; + uint32[] operatorIds; + bytes[] sharesEncrypted; + bytes[] sharesPublicKeys; + bytes signature; + bytes withdrawalCredentials; + uint256 reshareCount; } ``` -### EmptySource +### DistributionRebalanced ```solidity -error EmptySource() +event DistributionRebalanced(address sender, uint256 amount) ``` -### EmptyUrl +### PoolIncreased ```solidity -error EmptyUrl() +event PoolIncreased(address sender, uint32 poolId, uint256 amount) ``` -### EmptySecrets +### PoolStaked ```solidity -error EmptySecrets() +event PoolStaked(uint32 poolId) ``` -### EmptyArgs +### PoolExitRequested ```solidity -error EmptyArgs() +event PoolExitRequested(uint32 poolId) ``` -### NoInlineSecrets +### PoolExited ```solidity -error NoInlineSecrets() +event PoolExited(uint32 poolId) ``` -### encodeCBOR +### StakeDistributed ```solidity -function encodeCBOR(struct Functions.Request self) internal pure returns (bytes) +event StakeDistributed(address sender, uint256 amount) ``` -Encodes a Request to CBOR encoded bytes - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct Functions.Request | The request to encode | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes | CBOR encoded bytes | - -### initializeRequest +### StakeWithdrawalRequested ```solidity -function initializeRequest(struct Functions.Request self, enum Functions.Location location, enum Functions.CodeLanguage language, string source) internal pure +event StakeWithdrawalRequested(address sender, uint256 amount) ``` -Initializes a Chainlink Functions Request - -_Sets the codeLocation and code on the request_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct Functions.Request | The uninitialized request | -| location | enum Functions.Location | The user provided source code location | -| language | enum Functions.CodeLanguage | The programming language of the user code | -| source | string | The user provided source code or a url | - -### initializeRequestForInlineJavaScript +### StakeWithdrawalInitiated ```solidity -function initializeRequestForInlineJavaScript(struct Functions.Request self, string javaScriptSource) internal pure +event StakeWithdrawalInitiated(address sender, uint256 amount) ``` -Initializes a Chainlink Functions Request - -_Simplified version of initializeRequest for PoC_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct Functions.Request | The uninitialized request | -| javaScriptSource | string | The user provided JS code (must not be empty) | - -### addRemoteSecrets +### StakeWithdrawn ```solidity -function addRemoteSecrets(struct Functions.Request self, bytes encryptedSecretsURLs) internal pure +event StakeWithdrawn(address sender, uint256 amount) ``` -Adds Remote user encrypted secrets to a Request - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct Functions.Request | The initialized request | -| encryptedSecretsURLs | bytes | Encrypted comma-separated string of URLs pointing to off-chain secrets | - -### addArgs +### RewardDistributed ```solidity -function addArgs(struct Functions.Request self, string[] args) internal pure +event RewardDistributed(address sender, uint256 amount) ``` -Adds args for the user run function - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct Functions.Request | The initialized request | -| args | string[] | The array of args (must not be empty) | - -## FunctionsClient - -Contract writers can inherit this contract in order to create Chainlink Functions requests - -### s_oracle +### ValidatorRegistered ```solidity -contract FunctionsOracleInterface s_oracle +event ValidatorRegistered(bytes publicKey) ``` -### s_pendingRequests +### ValidatorReshared ```solidity -mapping(bytes32 => address) s_pendingRequests +event ValidatorReshared(bytes publicKey) ``` -### RequestSent +### deposit ```solidity -event RequestSent(bytes32 id) +function deposit() external payable ``` -### RequestFulfilled +### reportStake ```solidity -event RequestFulfilled(bytes32 id) +function reportStake(uint256 current, uint256 withdrawn) external ``` -### SenderIsNotRegistry +### withdraw ```solidity -error SenderIsNotRegistry() +function withdraw(uint256 amount) external ``` -### RequestIsAlreadyPending +### stakeReadyPools ```solidity -error RequestIsAlreadyPending() +function stakeReadyPools() external ``` -### RequestIsNotPending +### requestPoolExit ```solidity -error RequestIsNotPending() +function requestPoolExit(uint32 poolId) external ``` -### constructor +### completePoolExit ```solidity -constructor(address oracle) internal +function completePoolExit(uint256 poolIndex, uint256 validatorIndex) external ``` -### getDONPublicKey +### registerValidator ```solidity -function getDONPublicKey() external view returns (bytes) +function registerValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external ``` -Returns the DON's secp256k1 public key used to encrypt secrets +### setLINKFee -_All Oracles nodes have the corresponding private key -needed to decrypt the secrets encrypted with the public key_ +```solidity +function setLINKFee(uint32 fee) external +``` -#### Return Values +### setSSVFee -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes | publicKey DON's public key | +```solidity +function setSSVFee(uint32 fee) external +``` -### estimateCost +### setOracleAddress ```solidity -function estimateCost(struct Functions.Request req, uint64 subscriptionId, uint32 gasLimit, uint256 gasPrice) public view returns (uint96) +function setOracleAddress(address oracleAddress) external ``` -Estimate the total cost that will be charged to a subscription to make a request: gas re-imbursement, plus DON fee, plus Registry fee - -#### Parameters +### getFees -| Name | Type | Description | -| ---- | ---- | ----------- | -| req | struct Functions.Request | The initialized Functions.Request | -| subscriptionId | uint64 | The subscription ID | -| gasLimit | uint32 | gas limit for the fulfillment callback | -| gasPrice | uint256 | | +```solidity +function getFees() external view returns (struct ICasimirManager.Fees) +``` -#### Return Values +### getLINKFee -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint96 | billedCost Cost in Juels (1e18) of LINK | +```solidity +function getLINKFee() external view returns (uint32) +``` -### sendRequest +### getSSVFee ```solidity -function sendRequest(struct Functions.Request req, uint64 subscriptionId, uint32 gasLimit) internal returns (bytes32) +function getSSVFee() external view returns (uint32) ``` -Sends a Chainlink Functions request to the stored oracle address - -#### Parameters +### getReadyValidatorPublicKeys -| Name | Type | Description | -| ---- | ---- | ----------- | -| req | struct Functions.Request | The initialized Functions.Request | -| subscriptionId | uint64 | The subscription ID | -| gasLimit | uint32 | gas limit for the fulfillment callback | +```solidity +function getReadyValidatorPublicKeys() external view returns (bytes[]) +``` -#### Return Values +### getStakedValidatorPublicKeys -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes32 | requestId The generated request ID | +```solidity +function getStakedValidatorPublicKeys() external view returns (bytes[]) +``` -### fulfillRequest +### getExitingValidatorCount ```solidity -function fulfillRequest(bytes32 requestId, bytes response, bytes err) internal virtual +function getExitingValidatorCount() external view returns (uint256) ``` -User defined function to handle a response - -#### Parameters +### getReadyPoolIds -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The request ID, returned by sendRequest() | -| response | bytes | Aggregated response from the user code | -| err | bytes | Aggregated error from the user code or from the execution pipeline Either response or error parameter will be set, but never both | +```solidity +function getReadyPoolIds() external view returns (uint32[]) +``` -### handleOracleFulfillment +### getPendingPoolIds ```solidity -function handleOracleFulfillment(bytes32 requestId, bytes response, bytes err) external +function getPendingPoolIds() external view returns (uint32[]) ``` -Chainlink Functions response handler called by the designated transmitter node in an OCR round. +### getStakedPoolIds -#### Parameters +```solidity +function getStakedPoolIds() external view returns (uint32[]) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The requestId returned by FunctionsClient.sendRequest(). | -| response | bytes | Aggregated response from the user code. | -| err | bytes | Aggregated error either from the user code or from the execution pipeline. Either response or error parameter will be set, but never both. | +### getStake -### setOracle +```solidity +function getStake() external view returns (uint256) +``` + +### getQueuedStake ```solidity -function setOracle(address oracle) internal +function getQueuedStake() external view returns (uint256) ``` -Sets the stored Oracle address +### getSweptStake -#### Parameters +```solidity +function getSweptStake() external view returns (uint256) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| oracle | address | The address of Functions Oracle contract | +### getActiveStake -### getChainlinkOracleAddress +```solidity +function getActiveStake() external view returns (uint256) +``` + +### getOpenDeposits ```solidity -function getChainlinkOracleAddress() internal view returns (address) +function getOpenDeposits() external view returns (uint256) ``` -Gets the stored address of the oracle contract +### getUserStake -#### Return Values +```solidity +function getUserStake(address userAddress) external view returns (uint256) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | address | The address of the oracle contract | +## Types32Array -### addExternalRequest +### remove ```solidity -function addExternalRequest(address oracleAddress, bytes32 requestId) internal +function remove(uint32[] arr, uint256 index) internal ``` -Allows for a request which was created on another contract to be fulfilled -on this contract +## TypesBytesArray -#### Parameters +### remove -| Name | Type | Description | -| ---- | ---- | ----------- | -| oracleAddress | address | The address of the oracle contract that will fulfill the request | -| requestId | bytes32 | The request ID used for the response | +```solidity +function remove(bytes[] arr, uint256 index) internal +``` -### recordChainlinkFulfillment +## TypesUserWithdrawalArray + +### remove ```solidity -modifier recordChainlinkFulfillment(bytes32 requestId) +function remove(struct ICasimirManager.UserWithdrawal[] arr, uint256 index) internal ``` -_Reverts if the sender is not the oracle that serviced the request. -Emits RequestFulfilled event._ +## Functions -#### Parameters +### DEFAULT_BUFFER_SIZE -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The request ID for fulfillment | +```solidity +uint256 DEFAULT_BUFFER_SIZE +``` -### notPendingRequest +### Location ```solidity -modifier notPendingRequest(bytes32 requestId) +enum Location { + Inline, + Remote +} ``` -_Reverts if the request is already pending_ +### CodeLanguage -#### Parameters +```solidity +enum CodeLanguage { + JavaScript +} +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The request ID for fulfillment | +### Request -## FunctionsBillingRegistryInterface +```solidity +struct Request { + enum Functions.Location codeLocation; + enum Functions.Location secretsLocation; + enum Functions.CodeLanguage language; + string source; + bytes secrets; + string[] args; +} +``` -### RequestBilling +### EmptySource ```solidity -struct RequestBilling { - uint64 subscriptionId; - address client; - uint32 gasLimit; - uint256 gasPrice; -} +error EmptySource() ``` -### FulfillResult +### EmptyUrl ```solidity -enum FulfillResult { - USER_SUCCESS, - USER_ERROR, - INVALID_REQUEST_ID -} +error EmptyUrl() ``` -### getRequestConfig +### EmptySecrets ```solidity -function getRequestConfig() external view returns (uint32, address[]) +error EmptySecrets() ``` -Get configuration relevant for making requests +### EmptyArgs -#### Return Values +```solidity +error EmptyArgs() +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32 | uint32 global max for request gas limit | -| [1] | address[] | address[] list of registered DONs | +### NoInlineSecrets -### getRequiredFee +```solidity +error NoInlineSecrets() +``` + +### encodeCBOR ```solidity -function getRequiredFee(bytes data, struct FunctionsBillingRegistryInterface.RequestBilling billing) external view returns (uint96) +function encodeCBOR(struct Functions.Request self) internal pure returns (bytes) ``` -Determine the charged fee that will be paid to the Registry owner +Encodes a Request to CBOR encoded bytes #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| billing | struct FunctionsBillingRegistryInterface.RequestBilling | The request's billing configuration | +| self | struct Functions.Request | The request to encode | #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint96 | fee Cost in Juels (1e18) of LINK | +| [0] | bytes | CBOR encoded bytes | -### estimateCost +### initializeRequest ```solidity -function estimateCost(uint32 gasLimit, uint256 gasPrice, uint96 donFee, uint96 registryFee) external view returns (uint96) +function initializeRequest(struct Functions.Request self, enum Functions.Location location, enum Functions.CodeLanguage language, string source) internal pure ``` -Estimate the total cost to make a request: gas re-imbursement, plus DON fee, plus Registry fee +Initializes a Chainlink Functions Request + +_Sets the codeLocation and code on the request_ #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| gasLimit | uint32 | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| gasPrice | uint256 | The request's billing configuration | -| donFee | uint96 | Fee charged by the DON that is paid to Oracle Node | -| registryFee | uint96 | Fee charged by the DON that is paid to Oracle Node | +| self | struct Functions.Request | The uninitialized request | +| location | enum Functions.Location | The user provided source code location | +| language | enum Functions.CodeLanguage | The programming language of the user code | +| source | string | The user provided source code or a url | -#### Return Values +### initializeRequestForInlineJavaScript + +```solidity +function initializeRequestForInlineJavaScript(struct Functions.Request self, string javaScriptSource) internal pure +``` + +Initializes a Chainlink Functions Request + +_Simplified version of initializeRequest for PoC_ + +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint96 | costEstimate Cost in Juels (1e18) of LINK | +| self | struct Functions.Request | The uninitialized request | +| javaScriptSource | string | The user provided JS code (must not be empty) | -### startBilling +### addRemoteSecrets ```solidity -function startBilling(bytes data, struct FunctionsBillingRegistryInterface.RequestBilling billing) external returns (bytes32) +function addRemoteSecrets(struct Functions.Request self, bytes encryptedSecretsURLs) internal pure ``` -Initiate the billing process for an Functions request +Adds Remote user encrypted secrets to a Request -_Only callable by a node that has been approved on the Registry_ +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| self | struct Functions.Request | The initialized request | +| encryptedSecretsURLs | bytes | Encrypted comma-separated string of URLs pointing to off-chain secrets | + +### addArgs + +```solidity +function addArgs(struct Functions.Request self, string[] args) internal pure +``` + +Adds args for the user run function #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| billing | struct FunctionsBillingRegistryInterface.RequestBilling | Billing configuration for the request | +| self | struct Functions.Request | The initialized request | +| args | string[] | The array of args (must not be empty) | -#### Return Values +## FunctionsClient -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes32 | requestId - A unique identifier of the request. Can be used to match a request to a response in fulfillRequest. | +Contract writers can inherit this contract in order to create Chainlink Functions requests -### fulfillAndBill +### s_oracle ```solidity -function fulfillAndBill(bytes32 requestId, bytes response, bytes err, address transmitter, address[31] signers, uint8 signerCount, uint256 reportValidationGas, uint256 initialGas) external returns (enum FunctionsBillingRegistryInterface.FulfillResult) +contract FunctionsOracleInterface s_oracle ``` -Finalize billing process for an Functions request by sending a callback to the Client contract and then charging the subscription +### s_pendingRequests -_Only callable by a node that has been approved on the Registry -simulated offchain to determine if sufficient balance is present to fulfill the request_ +```solidity +mapping(bytes32 => address) s_pendingRequests +``` -#### Parameters +### RequestSent -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | identifier for the request that was generated by the Registry in the beginBilling commitment | -| response | bytes | response data from DON consensus | -| err | bytes | error from DON consensus | -| transmitter | address | the Oracle who sent the report | -| signers | address[31] | the Oracles who had a part in generating the report | -| signerCount | uint8 | the number of signers on the report | -| reportValidationGas | uint256 | the amount of gas used for the report validation. Cost is split by all fulfillments on the report. | -| initialGas | uint256 | the initial amount of gas that should be used as a baseline to charge the single fulfillment for execution cost | +```solidity +event RequestSent(bytes32 id) +``` -#### Return Values +### RequestFulfilled -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | enum FunctionsBillingRegistryInterface.FulfillResult | result fulfillment result | +```solidity +event RequestFulfilled(bytes32 id) +``` -### getSubscriptionOwner +### SenderIsNotRegistry ```solidity -function getSubscriptionOwner(uint64 subscriptionId) external view returns (address owner) +error SenderIsNotRegistry() ``` -Gets subscription owner. +### RequestIsAlreadyPending -#### Parameters +```solidity +error RequestIsAlreadyPending() +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| subscriptionId | uint64 | - ID of the subscription | +### RequestIsNotPending -#### Return Values +```solidity +error RequestIsNotPending() +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| owner | address | - owner of the subscription. | +### constructor -## FunctionsClientInterface +```solidity +constructor(address oracle) internal +``` ### getDONPublicKey @@ -1650,192 +1682,190 @@ needed to decrypt the secrets encrypted with the public key_ | ---- | ---- | ----------- | | [0] | bytes | publicKey DON's public key | -### handleOracleFulfillment +### estimateCost ```solidity -function handleOracleFulfillment(bytes32 requestId, bytes response, bytes err) external +function estimateCost(struct Functions.Request req, uint64 subscriptionId, uint32 gasLimit, uint256 gasPrice) public view returns (uint96) ``` -Chainlink Functions response handler called by the designated transmitter node in an OCR round. +Estimate the total cost that will be charged to a subscription to make a request: gas re-imbursement, plus DON fee, plus Registry fee #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| requestId | bytes32 | The requestId returned by FunctionsClient.sendRequest(). | -| response | bytes | Aggregated response from the user code. | -| err | bytes | Aggregated error either from the user code or from the execution pipeline. Either response or error parameter will be set, but never both. | +| req | struct Functions.Request | The initialized Functions.Request | +| subscriptionId | uint64 | The subscription ID | +| gasLimit | uint32 | gas limit for the fulfillment callback | +| gasPrice | uint256 | | -## FunctionsOracleInterface +#### Return Values -### getRegistry +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint96 | billedCost Cost in Juels (1e18) of LINK | + +### sendRequest ```solidity -function getRegistry() external view returns (address) +function sendRequest(struct Functions.Request req, uint64 subscriptionId, uint32 gasLimit) internal returns (bytes32) ``` -Gets the stored billing registry address +Sends a Chainlink Functions request to the stored oracle address + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| req | struct Functions.Request | The initialized Functions.Request | +| subscriptionId | uint64 | The subscription ID | +| gasLimit | uint32 | gas limit for the fulfillment callback | #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | address | registryAddress The address of Chainlink Functions billing registry contract | +| [0] | bytes32 | requestId The generated request ID | -### setRegistry +### fulfillRequest ```solidity -function setRegistry(address registryAddress) external +function fulfillRequest(bytes32 requestId, bytes response, bytes err) internal virtual ``` -Sets the stored billing registry address +User defined function to handle a response #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| registryAddress | address | The new address of Chainlink Functions billing registry contract | +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| err | bytes | Aggregated error from the user code or from the execution pipeline Either response or error parameter will be set, but never both | -### getDONPublicKey +### handleOracleFulfillment ```solidity -function getDONPublicKey() external view returns (bytes) +function handleOracleFulfillment(bytes32 requestId, bytes response, bytes err) external ``` -Returns the DON's secp256k1 public key that is used to encrypt secrets - -_All nodes on the DON have the corresponding private key -needed to decrypt the secrets encrypted with the public key_ +Chainlink Functions response handler called by the designated transmitter node in an OCR round. -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes | publicKey the DON's public key | +| requestId | bytes32 | The requestId returned by FunctionsClient.sendRequest(). | +| response | bytes | Aggregated response from the user code. | +| err | bytes | Aggregated error either from the user code or from the execution pipeline. Either response or error parameter will be set, but never both. | -### setDONPublicKey +### setOracle ```solidity -function setDONPublicKey(bytes donPublicKey) external +function setOracle(address oracle) internal ``` -Sets DON's secp256k1 public key used to encrypt secrets - -_Used to rotate the key_ +Sets the stored Oracle address #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| donPublicKey | bytes | The new public key | +| oracle | address | The address of Functions Oracle contract | -### setNodePublicKey +### getChainlinkOracleAddress ```solidity -function setNodePublicKey(address node, bytes publicKey) external +function getChainlinkOracleAddress() internal view returns (address) ``` -Sets a per-node secp256k1 public key used to encrypt secrets for that node - -_Callable only by contract owner and DON members_ +Gets the stored address of the oracle contract -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| node | address | node's address | -| publicKey | bytes | node's public key | +| [0] | address | The address of the oracle contract | -### deleteNodePublicKey +### addExternalRequest ```solidity -function deleteNodePublicKey(address node) external +function addExternalRequest(address oracleAddress, bytes32 requestId) internal ``` -Deletes node's public key - -_Callable only by contract owner or the node itself_ +Allows for a request which was created on another contract to be fulfilled +on this contract #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| node | address | node's address | +| oracleAddress | address | The address of the oracle contract that will fulfill the request | +| requestId | bytes32 | The request ID used for the response | -### getAllNodePublicKeys +### recordChainlinkFulfillment ```solidity -function getAllNodePublicKeys() external view returns (address[], bytes[]) +modifier recordChainlinkFulfillment(bytes32 requestId) ``` -Return two arrays of equal size containing DON members' addresses and their corresponding -public keys (or empty byte arrays if per-node key is not defined) +_Reverts if the sender is not the oracle that serviced the request. +Emits RequestFulfilled event._ -### getRequiredFee +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | The request ID for fulfillment | + +### notPendingRequest ```solidity -function getRequiredFee(bytes data, struct FunctionsBillingRegistryInterface.RequestBilling billing) external view returns (uint96) +modifier notPendingRequest(bytes32 requestId) ``` -Determine the fee charged by the DON that will be split between signing Node Operators for servicing the request +_Reverts if the request is already pending_ #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| billing | struct FunctionsBillingRegistryInterface.RequestBilling | The request's billing configuration | - -#### Return Values +| requestId | bytes32 | The request ID for fulfillment | -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint96 | fee Cost in Juels (1e18) of LINK | +## FunctionsClientInterface -### estimateCost +### getDONPublicKey ```solidity -function estimateCost(uint64 subscriptionId, bytes data, uint32 gasLimit, uint256 gasPrice) external view returns (uint96) +function getDONPublicKey() external view returns (bytes) ``` -Estimate the total cost that will be charged to a subscription to make a request: gas re-imbursement, plus DON fee, plus Registry fee - -#### Parameters +Returns the DON's secp256k1 public key used to encrypt secrets -| Name | Type | Description | -| ---- | ---- | ----------- | -| subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| gasLimit | uint32 | Gas limit for the fulfillment callback | -| gasPrice | uint256 | | +_All Oracles nodes have the corresponding private key +needed to decrypt the secrets encrypted with the public key_ #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint96 | billedCost Cost in Juels (1e18) of LINK | +| [0] | bytes | publicKey DON's public key | -### sendRequest +### handleOracleFulfillment ```solidity -function sendRequest(uint64 subscriptionId, bytes data, uint32 gasLimit) external returns (bytes32) +function handleOracleFulfillment(bytes32 requestId, bytes response, bytes err) external ``` -Sends a request (encoded as data) using the provided subscriptionId +Chainlink Functions response handler called by the designated transmitter node in an OCR round. #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| gasLimit | uint32 | Gas limit for the fulfillment callback | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes32 | requestId A unique request identifier (unique per DON) | +| requestId | bytes32 | The requestId returned by FunctionsClient.sendRequest(). | +| response | bytes | Aggregated response from the user code. | +| err | bytes | Aggregated error either from the user code or from the execution pipeline. Either response or error parameter will be set, but never both. | ## IDepositContract @@ -2308,36 +2338,6 @@ function writeKVMap(struct CBOR.CBORBuffer buf, string key) internal pure function writeKVArray(struct CBOR.CBORBuffer buf, string key) internal pure ``` -## MockFunctionsOracle - -### constructor - -```solidity -constructor() public -``` - -### sendRequest - -```solidity -function sendRequest(uint64 subscriptionId, bytes data, uint32 gasLimit) external returns (bytes32) -``` - -Sends a request (encoded as data) using the provided subscriptionId - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| gasLimit | uint32 | Gas limit for the fulfillment callback | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes32 | requestId A unique request identifier (unique per DON) | - ## MockKeeperRegistry ### registerUpkeep diff --git a/contracts/ethereum/src/CasimirAutomation.sol b/contracts/ethereum/src/CasimirAutomation.sol index d96037448..57f18342c 100644 --- a/contracts/ethereum/src/CasimirAutomation.sol +++ b/contracts/ethereum/src/CasimirAutomation.sol @@ -43,10 +43,6 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { /** Oracle heartbeat */ uint256 public constant oracleHeartbeat = 0; // Will use ~half a day in production - /** Oracle threshold */ - uint256 public constant oracleThreshold = 16 ether; - /** Compound threshold (0.1 ETH) */ - uint256 public constant compoundThreshold = 100000000000000000; /*************/ /* Contracts */ @@ -118,7 +114,6 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { if (args.length > 0) { req.addArgs(args); } - return req.encodeCBOR(); } @@ -150,15 +145,20 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { override returns (bool upkeepNeeded, bytes memory performData) { - /** Get whether heartbeat interval is lapsed */ + /** Check if the heartbeat interval is lapsed */ if ((block.timestamp - latestResponseTimestamp) >= oracleHeartbeat) { upkeepNeeded = true; } - /** Get pools ready to stake */ - uint32[] memory readyPoolIds = manager.getReadyPoolIds(); + /** Check if any pools need to exit */ + int256 requiredWithdrawals = int256(manager.getRequestedWithdrawals() + manager.getPendingWithdrawals()) - int256(manager.getExitingValidatorCount() * 32 ether); + if (requiredWithdrawals > 0) { + upkeepNeeded = true; + } + // Todo provide required withdrawals as performData (or some optimial input, maybe validator count) - /** Need upkeep for staking */ + /** Check if any pools are ready */ + uint32[] memory readyPoolIds = manager.getReadyPoolIds(); if (readyPoolIds.length > 0) { upkeepNeeded = true; } @@ -173,10 +173,7 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { (bool upkeepNeeded, bytes memory performData) = checkUpkeep(""); require(upkeepNeeded, "Upkeep not needed"); - (uint32[] memory readyPoolIds) = abi.decode( // Is decoding more efficient than getting again? - performData, - (uint32[]) - ); + uint32[] memory readyPoolIds = abi.decode(performData, (uint32[])); // Is encode/decode more efficient than getting again? /** Stake the ready pools */ if (readyPoolIds.length > 0) { @@ -210,14 +207,17 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { if (err.length == 0) { /** Decode report */ - (uint256 activeStake, uint256 sweptStake) = abi.decode( - response, - (uint256, uint256) - ); + ( + uint256 activeStake, + uint256 sweptStake, + uint256 sweptExits + ) = abi.decode(response, (uint256, uint256, uint256)); - // Todo apply a sensible heuristic to bound changes in stake + // Todo apply sensible heuristics to bound changes in stake - manager.reportStake(activeStake, sweptStake); + // Todo check simulation test for mistyped input + manager.rebalance(activeStake, sweptStake); + manager.completePendingPools(); } emit OCRResponse(requestId, response, err); diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index f80f2f007..bd93663d2 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -40,8 +40,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /* Constants */ /*************/ - /** Pool capacity */ - uint256 private constant poolCapacity = 32 ether; /* Distribution threshold (100 WEI) */ uint256 private constant distributionThreshold = 100 wei; /** Scale factor for each reward to stake ratio */ @@ -172,33 +170,20 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Report the latest consensus stake to the manager - * @param active The active consensus stake - * @param swept The swept consensus stake + * @notice Rebalance the reward to stake ratio and redistribute swept rewards + * @param activeStake The active consensus stake + * @param sweptRewards The swept consensus stake */ - function reportStake(uint256 active, uint256 swept) external { + function rebalance(uint256 activeStake, uint256 sweptRewards) external { require( msg.sender == address(automation), "Only automation can distribute rewards" ); - int256 change = int256(active + swept) - - int256(latestActiveStake + pendingPoolIds.length * poolCapacity); + int256 change = int256(activeStake + sweptRewards) - + int256(latestActiveStake + pendingPoolIds.length * 32 ether); - /** Rebalance reward ratio */ - rebalance(change); - - /** Distribute swept */ - distribute(swept); // Todo handle exits - - /** Complete pending pools which were staked */ - completePendingPools(); - - /** Update latest active balance */ - latestActiveStake = active; - } - - function rebalance(int256 change) private { + /** Update reward to stake ratio */ if (change > 0) { uint256 reward = SafeCast.toUint256(change); // /** Reward fees set to zero for testing */ @@ -210,10 +195,12 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { rewardRatioSum -= Math.mulDiv(rewardRatioSum, penalty, getStake()); emit DistributionRebalanced(msg.sender, penalty); } - } - function getPrincipal() public view returns (uint256) { - return getQueuedStake() + getActiveStake(); + /** Distribute swept rewards */ + distribute(sweptRewards); + + /** Update latest active stake */ + latestActiveStake = activeStake; } /** @@ -255,7 +242,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } Pool storage pool; pool = pools[poolId]; - uint256 remainingCapacity = poolCapacity - pool.deposits; + uint256 remainingCapacity = 32 ether - pool.deposits; if (remainingCapacity > amount) { /** Emit event before updating values */ emit PoolIncreased(msg.sender, poolId, amount); @@ -453,7 +440,12 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Move pending pools to staked */ - function completePendingPools() private { + function completePendingPools() external { + require( + msg.sender == address(automation), + "Only automation can complete pending pools" + ); + while (pendingPoolIds.length > 0) { /** Get next pending pool */ uint32 poolId = pendingPoolIds[0]; @@ -470,25 +462,29 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Request a pool exit - * @param poolId The staked pool ID + * @notice Request the next staked pool to exit */ - function requestPoolExit(uint32 poolId) external { + function requestNextPoolExit() external { require( msg.sender == address(automation), "Only automation can request pool exits" ); - Pool storage pool = pools[poolId]; + for (uint256 i = 0; i < stakedPoolIds.length; i++) { + uint32 poolId = stakedPoolIds[i]; + Pool storage pool = pools[poolId]; - require(!pool.exiting, "Pool is already exiting"); + if (!pool.exiting) { + pool.exiting = true; - pool.exiting = true; + /** Increase exiting validators */ + exitingValidatorCount++; - /** Increase exiting validators */ - exitingValidatorCount++; + emit PoolExitRequested(poolId); - emit PoolExitRequested(poolId); + break; + } + } } /** @@ -754,7 +750,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function getQueuedStake() public view returns (uint256 queuedStake) { queuedStake = (readyPoolIds.length + pendingPoolIds.length) * - poolCapacity + + 32 ether + openDeposits; } @@ -801,19 +797,19 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { // External view functions /** - * @notice Get the LINK fee percentage to charge on each deposit - * @return The LINK fee percentage to charge on each deposit + * @notice Get the total requested withdrawals + * @return requestedWithdrawals The total requested withdrawals */ - function getLINKFee() external view returns (uint32) { - return linkFee; + function getRequestedWithdrawals() external view returns (uint256) { + return requestedWithdrawals; } /** - * @notice Get the SSV fee percentage to charge on each deposit - * @return The SSV fee percentage to charge on each deposit + * @notice Get the total pending withdrawals + * @return pendingWithdrawals The total pending withdrawals */ - function getSSVFee() external view returns (uint32) { - return ssvFee; + function getPendingWithdrawals() external view returns (uint256) { + return pendingWithdrawals; } /** @@ -896,14 +892,12 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function getPoolDetails( uint32 poolId ) external view returns (PoolDetails memory poolDetails) { + /** Pool in open or ready state will not have validator or operators */ Pool memory pool = pools[poolId]; - - /** Pool in ready state will not have validator or operators */ - bytes memory emptyBytes = new bytes(0); - if (keccak256(pool.validatorPublicKey) == keccak256(emptyBytes)) { + if (pool.validatorPublicKey.length == 0) { poolDetails = PoolDetails( pool.deposits, - emptyBytes, + pool.validatorPublicKey, new uint32[](0), pool.exiting ); @@ -918,6 +912,22 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } } + /** + * @notice Get the LINK fee percentage to charge on each deposit + * @return The LINK fee percentage to charge on each deposit + */ + function getLINKFee() external view returns (uint32) { + return linkFee; + } + + /** + * @notice Get the SSV fee percentage to charge on each deposit + * @return The SSV fee percentage to charge on each deposit + */ + function getSSVFee() external view returns (uint32) { + return ssvFee; + } + /** * @notice Get the automation address * @return automationAddress The automation address diff --git a/contracts/ethereum/src/interfaces/ICasimirAutomation.sol b/contracts/ethereum/src/interfaces/ICasimirAutomation.sol index 9844fb5f4..2c89e24fd 100644 --- a/contracts/ethereum/src/interfaces/ICasimirAutomation.sol +++ b/contracts/ethereum/src/interfaces/ICasimirAutomation.sol @@ -10,7 +10,8 @@ interface ICasimirAutomation is AutomationCompatibleInterface { struct OracleReport { uint256 activeStake; - uint256 withdrawnStake; + uint256 sweptRewards; + uint256 sweptExits; // bytes[] exitedValidatorPublicKeys; // uint256[] exitedValidatorIndices; } diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index 3d69c041e..68435afb9 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -74,13 +74,15 @@ interface ICasimirManager { function deposit() external payable; - function reportStake(uint256 current, uint256 withdrawn) external; + function rebalance(uint256 activeStake, uint256 sweptRewards) external; function withdraw(uint256 amount) external; function stakeReadyPools() external; - function requestPoolExit(uint32 poolId) external; + function completePendingPools() external; + + function requestNextPoolExit() external; function completePoolExit( uint256 poolIndex, @@ -141,4 +143,9 @@ interface ICasimirManager { function getOpenDeposits() external view returns (uint256); function getUserStake(address userAddress) external view returns (uint256); + + function getRequestedWithdrawals() external view returns (uint256); + + function getPendingWithdrawals() external view returns (uint256); + } diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 5b3a1b173..b69241043 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -137,8 +137,9 @@ export async function secondUserDepositFixture() { const [, , secondUser] = await ethers.getSigners() const stakeAmount = 24 - const nextActiveAmount = 32 - const nextSweptAmount = 0 + const nextActiveStakeAmount = 32 + const nextSweptRewardsAmount = 0 + const nextSweptExitsAmount = 0 const fees = { ...await manager.getFees() } const feePercent = fees.LINK + fees.SSV @@ -160,10 +161,11 @@ export async function secondUserDepositFixture() { if (mockFunctionsOracle) { const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) const responseBytes = ethers.utils.defaultAbiCoder.encode( - ['uint256', 'uint256'], + ['uint256', 'uint256', 'uint256'], [ - ethers.utils.parseEther(nextActiveAmount.toString()), - ethers.utils.parseEther(nextSweptAmount.toString()) + ethers.utils.parseEther(nextActiveStakeAmount.toString()), + ethers.utils.parseEther(nextSweptRewardsAmount.toString()), + ethers.utils.parseEther(nextSweptExitsAmount.toString()) ] ) const errorBytes = ethers.utils.toUtf8Bytes('') @@ -178,8 +180,9 @@ export async function rewardPostSecondUserDepositFixture() { const { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } = await loadFixture(secondUserDepositFixture) const rewardAmount = 0.1 - const nextActiveAmount = 32 + rewardAmount - const nextSweptAmount = 0 + const nextActiveStakeAmount = 32 + rewardAmount + const nextSweptRewardsAmount = 0 + const nextSweptExitsAmount = 0 /** Perform upkeep */ const checkData = ethers.utils.toUtf8Bytes('') @@ -194,10 +197,11 @@ export async function rewardPostSecondUserDepositFixture() { if (mockFunctionsOracle) { const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) const responseBytes = ethers.utils.defaultAbiCoder.encode( - ['uint256', 'uint256'], + ['uint256', 'uint256', 'uint256'], [ - ethers.utils.parseEther(nextActiveAmount.toString()), - ethers.utils.parseEther(nextSweptAmount.toString()) + ethers.utils.parseEther(nextActiveStakeAmount.toString()), + ethers.utils.parseEther(nextSweptRewardsAmount.toString()), + ethers.utils.parseEther(nextSweptExitsAmount.toString()) ] ) const errorBytes = ethers.utils.toUtf8Bytes('') @@ -211,8 +215,9 @@ export async function rewardPostSecondUserDepositFixture() { export async function sweepPostSecondUserDepositFixture() { const { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } = await loadFixture(secondUserDepositFixture) - const nextActiveAmount = 32 - const nextSweptAmount = 0.1 + const nextActiveStakeAmount = 32 + const nextSweptRewardsAmount = 0.1 + const nextSweptExitsAmount = 0 const sweep = await chainlink.sendTransaction({ to: manager?.address, value: ethers.utils.parseEther('0.1') }) await sweep.wait() @@ -230,10 +235,11 @@ export async function sweepPostSecondUserDepositFixture() { if (mockFunctionsOracle) { const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) const responseBytes = ethers.utils.defaultAbiCoder.encode( - ['uint256', 'uint256'], + ['uint256', 'uint256', 'uint256'], [ - ethers.utils.parseEther(nextActiveAmount.toString()), - ethers.utils.parseEther(nextSweptAmount.toString()) + ethers.utils.parseEther(nextActiveStakeAmount.toString()), + ethers.utils.parseEther(nextSweptRewardsAmount.toString()), + ethers.utils.parseEther(nextSweptExitsAmount.toString()) ] ) const errorBytes = ethers.utils.toUtf8Bytes('') @@ -249,8 +255,9 @@ export async function thirdUserDepositFixture() { const [, , , thirdUser] = await ethers.getSigners() const stakeAmount = 24 - const nextActiveAmount = 64 - const nextSweptAmount = 0 + const nextActiveStakeAmount = 64 + const nextSweptRewardsAmount = 0 + const nextSweptExitsAmount = 0 const fees = { ...await manager.getFees() } const feePercent = fees.LINK + fees.SSV @@ -270,10 +277,11 @@ export async function thirdUserDepositFixture() { /** Fulfill oracle answer */ const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) const responseBytes = ethers.utils.defaultAbiCoder.encode( - ['uint256', 'uint256'], + ['uint256', 'uint256', 'uint256'], [ - ethers.utils.parseEther(nextActiveAmount.toString()), - ethers.utils.parseEther(nextSweptAmount.toString()) + ethers.utils.parseEther(nextActiveStakeAmount.toString()), + ethers.utils.parseEther(nextSweptRewardsAmount.toString()), + ethers.utils.parseEther(nextSweptExitsAmount.toString()) ] ) const errorBytes = ethers.utils.toUtf8Bytes('') @@ -288,8 +296,9 @@ export async function rewardPostThirdUserDepositFixture() { const { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(thirdUserDepositFixture) const rewardAmount = 0.2 - const nextActiveAmount = 64 + rewardAmount - const nextSweptAmount = 0 + const nextActiveStakeAmount = 64 + rewardAmount + const nextSweptRewardsAmount = 0 + const nextSweptExitsAmount = 0 /** Perform upkeep */ const checkData = ethers.utils.toUtf8Bytes('') @@ -302,10 +311,11 @@ export async function rewardPostThirdUserDepositFixture() { /** Fulfill oracle answer */ const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) const responseBytes = ethers.utils.defaultAbiCoder.encode( - ['uint256', 'uint256'], + ['uint256', 'uint256', 'uint256'], [ - ethers.utils.parseEther(nextActiveAmount.toString()), - ethers.utils.parseEther(nextSweptAmount.toString()) + ethers.utils.parseEther(nextActiveStakeAmount.toString()), + ethers.utils.parseEther(nextSweptRewardsAmount.toString()), + ethers.utils.parseEther(nextSweptExitsAmount.toString()) ] ) const errorBytes = ethers.utils.toUtf8Bytes('') @@ -319,11 +329,12 @@ export async function rewardPostThirdUserDepositFixture() { export async function sweepPostThirdUserDepositFixture() { const { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(rewardPostThirdUserDepositFixture) - const nextActiveAmount = 64 - const nextSweptAmount = 0.2 + const nextActiveStakeAmount = 64 + const nextSweptRewardsAmount = 0.2 + const nextSweptExitsAmount = 0 /** Sweep rewards before upkeep (balance will increment silently) */ - const sweep = await chainlink.sendTransaction({ to: manager?.address, value: ethers.utils.parseEther(nextSweptAmount.toString()) }) + const sweep = await chainlink.sendTransaction({ to: manager?.address, value: ethers.utils.parseEther(nextSweptRewardsAmount.toString()) }) await sweep.wait() /** Perform upkeep */ @@ -337,10 +348,11 @@ export async function sweepPostThirdUserDepositFixture() { /** Fulfill oracle answer */ const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) const responseBytes = ethers.utils.defaultAbiCoder.encode( - ['uint256', 'uint256'], + ['uint256', 'uint256', 'uint256'], [ - ethers.utils.parseEther(nextActiveAmount.toString()), - ethers.utils.parseEther(nextSweptAmount.toString()) + ethers.utils.parseEther(nextActiveStakeAmount.toString()), + ethers.utils.parseEther(nextSweptRewardsAmount.toString()), + ethers.utils.parseEther(nextSweptExitsAmount.toString()) ] ) const errorBytes = ethers.utils.toUtf8Bytes('') @@ -365,8 +377,9 @@ export async function fourthUserDepositFixture() { const [, , , , fourthUser] = await ethers.getSigners() const stakeAmount = 72 - const nextActiveAmount = 128 - const nextSweptAmount = 0 + const nextActiveStakeAmount = 128 + const nextSweptRewardsAmount = 0 + const nextSweptExitsAmount = 0 const fees = { ...await manager.getFees() } const feePercent = fees.LINK + fees.SSV @@ -386,10 +399,11 @@ export async function fourthUserDepositFixture() { /** Fulfill oracle answer */ const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) const responseBytes = ethers.utils.defaultAbiCoder.encode( - ['uint256', 'uint256'], + ['uint256', 'uint256', 'uint256'], [ - ethers.utils.parseEther(nextActiveAmount.toString()), - ethers.utils.parseEther(nextSweptAmount.toString()) + ethers.utils.parseEther(nextActiveStakeAmount.toString()), + ethers.utils.parseEther(nextSweptRewardsAmount.toString()), + ethers.utils.parseEther(nextSweptExitsAmount.toString()) ] ) const errorBytes = ethers.utils.toUtf8Bytes('') @@ -409,8 +423,9 @@ export async function simulationFixture() { const stakedValidatorCount = (await manager?.getStakedValidatorPublicKeys())?.length if (stakedValidatorCount) { const rewardAmount = rewardPerValidator * stakedValidatorCount - const nextActiveAmount = activeAmount + rewardAmount - const nextSweptAmount = 0 + const nextActiveStakeAmount = activeAmount + rewardAmount + const nextSweptRewardsAmount = 0 + const nextSweptExitsAmount = 0 /** Perform upkeep */ const checkData = ethers.utils.toUtf8Bytes('') @@ -423,17 +438,18 @@ export async function simulationFixture() { /** Fulfill oracle answer */ const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) const responseBytes = ethers.utils.defaultAbiCoder.encode( - ['uint256', 'uint256'], + ['uint256', 'uint256', 'uint256'], [ - ethers.utils.parseEther(nextActiveAmount.toString()), - ethers.utils.parseEther(nextSweptAmount.toString()) + ethers.utils.parseEther(nextActiveStakeAmount.toString()), + ethers.utils.parseEther(nextSweptRewardsAmount.toString()), + ethers.utils.parseEther(nextSweptExitsAmount.toString()) ] ) const errorBytes = ethers.utils.toUtf8Bytes('') const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) await mockFulfillRequest.wait() - activeAmount = nextActiveAmount // For next iteration + activeAmount = nextActiveStakeAmount // For next iteration } } } diff --git a/contracts/ethereum/test/integration.ts b/contracts/ethereum/test/integration.ts index 512e8a027..a17ef6620 100644 --- a/contracts/ethereum/test/integration.ts +++ b/contracts/ethereum/test/integration.ts @@ -199,7 +199,7 @@ describe('Casimir manager', async function () { console.log('📦 Open deposits', ethers.utils.formatEther(openDeposits)) const dust = stake.sub(firstStake.add(secondStake).add(thirdStake).add(fourthStake)) if (dust !== ethers.utils.parseEther('0.0')) { - console.log('🧹 Dust', ethers.utils.formatEther(dust)) + console.log('🧹 Dust', ethers.utils.formatEther(dust)) } console.log(line) }) From 617694afb7a2808e68363342161fa25bd094b810 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Sun, 30 Apr 2023 12:31:22 -0400 Subject: [PATCH 16/78] Add explicit counts to unbounded loops --- contracts/ethereum/src/CasimirAutomation.sol | 13 +- contracts/ethereum/src/CasimirManager.sol | 242 +++++++++--------- .../src/interfaces/ICasimirManager.sol | 34 +-- contracts/ethereum/src/libraries/Types.sol | 64 +++-- contracts/ethereum/test/fixtures/shared.ts | 6 +- contracts/ethereum/test/integration.ts | 10 +- 6 files changed, 197 insertions(+), 172 deletions(-) diff --git a/contracts/ethereum/src/CasimirAutomation.sol b/contracts/ethereum/src/CasimirAutomation.sol index 57f18342c..a83dfa6f2 100644 --- a/contracts/ethereum/src/CasimirAutomation.sol +++ b/contracts/ethereum/src/CasimirAutomation.sol @@ -175,9 +175,9 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { uint32[] memory readyPoolIds = abi.decode(performData, (uint32[])); // Is encode/decode more efficient than getting again? - /** Stake the ready pools */ + /** Initiate a bounded count of ready pools */ if (readyPoolIds.length > 0) { - manager.stakeReadyPools(); // Deposit and move ready to pending + manager.initiateReadyPools(readyPoolIds.length); // Todo find good bounds for batching } /** Request a report */ @@ -216,8 +216,13 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { // Todo apply sensible heuristics to bound changes in stake // Todo check simulation test for mistyped input - manager.rebalance(activeStake, sweptStake); - manager.completePendingPools(); + manager.rebalanceStake(activeStake, sweptStake); + + /** Complete the bounded count of pending pools */ + uint32[] memory pendingPoolIds = manager.getPendingPoolIds(); + if (pendingPoolIds.length > 0) { + manager.completePendingPools(pendingPoolIds.length); // Todo find good bounds for batching + } } emit OCRResponse(requestId, response, err); diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index bd93663d2..5b02daf0f 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -33,8 +33,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { using Types32Array for uint32[]; /** Use internal type for bytes array */ using TypesBytesArray for bytes[]; - /** Use internal type for user withdrawal array */ - using TypesUserWithdrawalArray for UserWithdrawal[]; + /** Use internal type for withdrawal array */ + using TypesWithdrawalArray for Withdrawal[]; + /** Use internal type for address */ + using TypesAddress for address; /*************/ /* Constants */ @@ -116,9 +118,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Sum of scaled reward to stake ratios (intial value required) */ uint256 rewardRatioSum = 1000 ether; /** Requested withdrawals */ - UserWithdrawal[] private requestedWithdrawalQueue; + Withdrawal[] private requestedWithdrawalQueue; /** Pending withdrawals */ - UserWithdrawal[] private pendingWithdrawalQueue; + Withdrawal[] private pendingWithdrawalQueue; /** Total requested withdrawals */ uint256 private requestedWithdrawals; /** Total pending withdrawals */ @@ -169,12 +171,38 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ); } + /** + * @notice Deposit user stake + */ + function depositStake() external payable nonReentrant { + require(msg.value > 0, "Deposit amount must be greater than 0"); + uint256 processedAmount = processFees(msg.value, getFees()); + require( + processedAmount >= distributionThreshold, + "Stake amount must be greater than 100 WEI" + ); + // Todo cap deposits to avoid exhausting gas + + /** Update user account state */ + if (users[msg.sender].stake0 > 0) { + /** Settle user's current stake */ + users[msg.sender].stake0 = getUserStake(msg.sender); + } + users[msg.sender].rewardRatioSum0 = rewardRatioSum; + users[msg.sender].stake0 += processedAmount; + + /** Distribute stake to open pools */ + distributeStake(processedAmount); + + emit StakeDistributed(msg.sender, processedAmount); + } + /** * @notice Rebalance the reward to stake ratio and redistribute swept rewards * @param activeStake The active consensus stake * @param sweptRewards The swept consensus stake */ - function rebalance(uint256 activeStake, uint256 sweptRewards) external { + function rebalanceStake(uint256 activeStake, uint256 sweptRewards) external { require( msg.sender == address(automation), "Only automation can distribute rewards" @@ -189,46 +217,27 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { // /** Reward fees set to zero for testing */ // uint256 processedReward = processFees(reward, Fees(0, 0)); rewardRatioSum += Math.mulDiv(rewardRatioSum, reward, getStake()); - emit DistributionRebalanced(msg.sender, reward); + emit StakeRebalanced(msg.sender, reward); } else if (change < 0) { uint256 penalty = SafeCast.toUint256(change); rewardRatioSum -= Math.mulDiv(rewardRatioSum, penalty, getStake()); - emit DistributionRebalanced(msg.sender, penalty); + emit StakeRebalanced(msg.sender, penalty); } - /** Distribute swept rewards */ - distribute(sweptRewards); - /** Update latest active stake */ latestActiveStake = activeStake; - } - /** - * @notice Deposit user stake to the pool manager - */ - function deposit() external payable nonReentrant { - require(msg.value > 0, "Deposit amount must be greater than 0"); - uint256 processedAmount = processFees(msg.value, getFees()); - require( - processedAmount >= distributionThreshold, - "Stake amount must be greater than 100 WEI" - ); - /** Update user account state */ - if (users[msg.sender].stake0 > 0) { - /** Settle user's current stake */ - users[msg.sender].stake0 = getUserStake(msg.sender); - } - users[msg.sender].rewardRatioSum0 = rewardRatioSum; - users[msg.sender].stake0 += processedAmount; - distribute(processedAmount); - emit StakeDistributed(msg.sender, processedAmount); + /** Distribute swept rewards */ + distributeStake(sweptRewards); + + emit StakeDistributed(msg.sender, sweptRewards); } /** - * @dev Distribute ETH to ready pools - * @param amount The amount of ETH to distribute + * @dev Distribute stake to open pools + * @param amount The amount of stake to distribute */ - function distribute(uint256 amount) private { + function distributeStake(uint256 amount) private { /** Distribute ETH to open pools */ while (amount > 0) { /** Get the next open pool */ @@ -266,10 +275,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Withdraw user stake - * @param amount The amount of ETH to withdraw + * @notice Request to withdraw user stake + * @param amount The amount of stake to withdraw */ - function withdraw(uint256 amount) external nonReentrant { + function requestWithdrawal(uint256 amount) external nonReentrant { require(openDeposits >= amount, "Withdrawing more than open deposits"); require(users[msg.sender].stake0 > 0, "User does not have a stake"); @@ -281,119 +290,93 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { "Withdrawing more than user stake" ); - /** Instantly withdraw if full amount is available */ - if (amount <= openDeposits) { - withdrawInstantly(amount); - } else { - requestWithdrawal(amount); - } - } - - /** - * @dev Withdraw user stake instantly from open deposits - * @param amount The amount of ETH to withdraw - */ - function withdrawInstantly(uint256 amount) private { - /** Update user account state */ - users[msg.sender].rewardRatioSum0 = rewardRatioSum; - users[msg.sender].stake0 -= amount; - - /** Update balance state */ - Pool storage pool = pools[openPoolIds[0]]; - pool.deposits -= amount; - openDeposits -= amount; - - send(msg.sender, amount); - - emit StakeWithdrawn(msg.sender, amount); - } - - /** - * @dev Request to withdraw user stake from exited deposits - * @param amount The amount of ETH to withdraw - */ - function requestWithdrawal(uint256 amount) private { /** Update requested withdrawals state */ requestedWithdrawalQueue.push( - UserWithdrawal({user: msg.sender, amount: amount}) + Withdrawal({user: msg.sender, amount: amount}) ); requestedWithdrawals += amount; - emit StakeWithdrawalRequested(msg.sender, amount); + emit WithdrawalRequested(msg.sender, amount); } /** - * @notice Initiate the next withdrawal of user stake from exited deposits + * @notice Initiate a given count of requested withdrawals + * @param count The number of withdrawals to initiate */ - function inititateNextWithdrawal() external { + function initiateRequestedWithdrawals(uint256 count) external { require( msg.sender == address(automation), "Only automation can initiate withdrawals" ); - /** Get next requested withdrawal */ - UserWithdrawal memory userWithdrawal = requestedWithdrawalQueue[0]; + while (count > 0) { + count--; - /** Update requested withdrawals state */ - requestedWithdrawalQueue.remove(0); - requestedWithdrawals -= userWithdrawal.amount; + /** Get next requested withdrawal */ + Withdrawal memory withdrawal = requestedWithdrawalQueue[0]; - /** Update pending withdrawals state */ - pendingWithdrawalQueue.push(userWithdrawal); - pendingWithdrawals += userWithdrawal.amount; + /** Update requested withdrawals state */ + requestedWithdrawalQueue.remove(0); + requestedWithdrawals -= withdrawal.amount; - /** Update user account state */ - users[userWithdrawal.user].rewardRatioSum0 = rewardRatioSum; - users[userWithdrawal.user].stake0 -= userWithdrawal.amount; + /** Update requested withdrawals state */ + pendingWithdrawalQueue.push(withdrawal); + pendingWithdrawals += withdrawal.amount; - emit StakeWithdrawalInitiated( - userWithdrawal.user, - userWithdrawal.amount - ); + /** Update user account state */ + users[withdrawal.user].rewardRatioSum0 = rewardRatioSum; + users[withdrawal.user].stake0 -= withdrawal.amount; + + emit WithdrawalInitiated( + withdrawal.user, + withdrawal.amount + ); + } } /** - * @notice Complete the next withdrawal of user stake from exited deposits + * @notice Complete a given count of pending withdrawals + * @param count The number of withdrawals to complete */ - function completeNextWithdrawal() external { + function completePendingWithdrawals(uint256 count) external { require( msg.sender == address(automation), "Only automation can complete withdrawals" ); - /** Get next pending withdrawal */ - UserWithdrawal memory userWithdrawal = pendingWithdrawalQueue[0]; + while (count > 0) { + count--; - /** Update pending withdrawals state */ - pendingWithdrawalQueue.remove(0); - pendingWithdrawals -= userWithdrawal.amount; + /** Get next pending withdrawal */ + Withdrawal memory withdrawal = pendingWithdrawalQueue[0]; - send(userWithdrawal.user, userWithdrawal.amount); + /** Update pending withdrawals state */ + pendingWithdrawalQueue.remove(0); + pendingWithdrawals -= withdrawal.amount; - emit StakeWithdrawn(userWithdrawal.user, userWithdrawal.amount); - } + withdrawal.user.send(withdrawal.amount); - /** - * @dev Send ETH to a recipient - * @param recipient The recipient address - * @param amount The amount of ETH to send - */ - function send(address recipient, uint256 amount) private { - (bool success, ) = recipient.call{value: amount}(""); - require(success, "Transfer failed"); + emit WithdrawalCompleted(withdrawal.user, withdrawal.amount); + } } /** - * @notice Stake the ready pools + * @notice Initiate a given count of next ready pools + * @param count The number of pools to stake */ - function stakeReadyPools() external { + function initiateReadyPools(uint256 count) external { require( msg.sender == address(automation), "Only automation can stake pools" ); - require(readyValidatorPublicKeys.length > 0, "No ready validators"); - while (readyPoolIds.length > 0) { + // Todo move these checks to automation + require(readyValidatorPublicKeys.length >= count, "Not enough ready validators"); + require(readyPoolIds.length >= count, "Not enough ready pools"); + + while (count > 0) { + count--; + /** Get next ready pool ID */ uint32 poolId = readyPoolIds[0]; @@ -433,20 +416,24 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { mockSSVFee // uint256 (fees handled on user deposits) ); - emit PoolStaked(poolId); + emit PoolInitiated(poolId); } } /** - * @notice Move pending pools to staked + * @notice Complete a given count of the next pending pools + * @param count The number of pools to complete */ - function completePendingPools() external { + function completePendingPools(uint256 count) external { require( msg.sender == address(automation), "Only automation can complete pending pools" ); + require(pendingPoolIds.length >= count, "Not enough pending pools"); + + while (count > 0) { + count--; - while (pendingPoolIds.length > 0) { /** Get next pending pool */ uint32 poolId = pendingPoolIds[0]; Pool memory pool = pools[poolId]; @@ -458,31 +445,36 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Move validator from pending to staked state */ pendingValidatorPublicKeys.remove(0); stakedValidatorPublicKeys.push(pool.validatorPublicKey); + + emit PoolCompleted(poolId); } } /** - * @notice Request the next staked pool to exit + * @notice Request a given count of staked pool exits + * @param count The number of exits to request */ - function requestNextPoolExit() external { + function requestPoolExits(uint256 count) external { require( msg.sender == address(automation), "Only automation can request pool exits" ); - for (uint256 i = 0; i < stakedPoolIds.length; i++) { - uint32 poolId = stakedPoolIds[i]; + uint256 index = 0; // Keeping the same staked pool array + while (count > 0) { + uint32 poolId = stakedPoolIds[index]; Pool storage pool = pools[poolId]; if (!pool.exiting) { + count--; + index++; + pool.exiting = true; /** Increase exiting validators */ exitingValidatorCount++; emit PoolExitRequested(poolId); - - break; } } } @@ -740,15 +732,15 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @return stake The total manager stake */ function getStake() public view returns (uint256 stake) { - stake = getQueuedStake() + getActiveStake(); // - pendingWithdrawals; + stake = getBufferedStake() + getActiveStake(); // - pendingWithdrawals; } /** - * @notice Get the total manager queued (execution) stake - * @return queuedStake The total manager queued (execution) stake + * @notice Get the total manager buffered (execution) stake + * @return bufferedStake The total manager buffered (execution) stake */ - function getQueuedStake() public view returns (uint256 queuedStake) { - queuedStake = + function getBufferedStake() public view returns (uint256 bufferedStake) { + bufferedStake = (readyPoolIds.length + pendingPoolIds.length) * 32 ether + openDeposits; @@ -759,7 +751,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @return sweptStake The total manager swept (execution) stake */ function getSweptStake() public view returns (uint256 sweptStake) { - sweptStake = address(this).balance - getQueuedStake(); + sweptStake = address(this).balance - getBufferedStake(); } /** diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index 68435afb9..57e374be3 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -35,8 +35,8 @@ interface ICasimirManager { uint256 stake0; uint256 rewardRatioSum0; } - /** User withdrawal */ - struct UserWithdrawal { + /** Withdrawal */ + struct Withdrawal { address user; uint256 amount; } @@ -55,16 +55,16 @@ interface ICasimirManager { /* Events */ /**********/ - event DistributionRebalanced(address indexed sender, uint256 amount); event PoolIncreased(address indexed sender, uint32 poolId, uint256 amount); - event PoolStaked(uint32 indexed poolId); + event PoolInitiated(uint32 indexed poolId); + event PoolCompleted(uint32 indexed poolId); event PoolExitRequested(uint32 indexed poolId); event PoolExited(uint32 indexed poolId); event StakeDistributed(address indexed sender, uint256 amount); - event StakeWithdrawalRequested(address indexed sender, uint256 amount); - event StakeWithdrawalInitiated(address indexed sender, uint256 amount); - event StakeWithdrawn(address indexed sender, uint256 amount); - event RewardDistributed(address indexed sender, uint256 amount); + event StakeRebalanced(address indexed sender, uint256 amount); + event WithdrawalRequested(address indexed sender, uint256 amount); + event WithdrawalInitiated(address indexed sender, uint256 amount); + event WithdrawalCompleted(address indexed sender, uint256 amount); event ValidatorRegistered(bytes indexed publicKey); event ValidatorReshared(bytes indexed publicKey); @@ -72,17 +72,21 @@ interface ICasimirManager { /* Functions */ /*************/ - function deposit() external payable; + function depositStake() external payable; - function rebalance(uint256 activeStake, uint256 sweptRewards) external; + function rebalanceStake(uint256 activeStake, uint256 sweptRewards) external; - function withdraw(uint256 amount) external; + function requestWithdrawal(uint256 amount) external; - function stakeReadyPools() external; + function initiateRequestedWithdrawals(uint256 count) external; - function completePendingPools() external; + function completePendingWithdrawals(uint256 count) external; - function requestNextPoolExit() external; + function initiateReadyPools(uint256 count) external; + + function completePendingPools(uint256 count) external; + + function requestPoolExits(uint256 count) external; function completePoolExit( uint256 poolIndex, @@ -134,7 +138,7 @@ interface ICasimirManager { function getStake() external view returns (uint256); - function getQueuedStake() external view returns (uint256); + function getBufferedStake() external view returns (uint256); function getSweptStake() external view returns (uint256); diff --git a/contracts/ethereum/src/libraries/Types.sol b/contracts/ethereum/src/libraries/Types.sol index 920ed5729..805c5b1c5 100644 --- a/contracts/ethereum/src/libraries/Types.sol +++ b/contracts/ethereum/src/libraries/Types.sol @@ -4,34 +4,60 @@ pragma solidity ^0.8.7; import "../interfaces/ICasimirManager.sol"; library Types32Array { - function remove(uint32[] storage arr, uint index) internal { - require(arr.length > 0, "Can't remove from empty array"); - require(index < arr.length, "Index out of bounds"); - for (uint i = index; i < arr.length - 1; i++) { - arr[i] = arr[i + 1]; + /** + * @dev Remove a uint32 element from the array + * @param uint32Array The array of uint32 + */ + function remove(uint32[] storage uint32Array, uint index) internal { + require(uint32Array.length > 0, "Can't remove from empty array"); + require(index < uint32Array.length, "Index out of bounds"); + for (uint i = index; i < uint32Array.length - 1; i++) { + uint32Array[i] = uint32Array[i + 1]; } - arr.pop(); + uint32Array.pop(); } } library TypesBytesArray { - function remove(bytes[] storage arr, uint index) internal { - require(arr.length > 0, "Can't remove from empty array"); - require(index < arr.length, "Index out of bounds"); - for (uint i = index; i < arr.length - 1; i++) { - arr[i] = arr[i + 1]; + /** + * @dev Remove a bytes element from the array + * @param bytesArray The array of bytes + * @param index The index of the element to remove + */ + function remove(bytes[] storage bytesArray, uint index) internal { + require(bytesArray.length > 0, "Can't remove from empty array"); + require(index < bytesArray.length, "Index out of bounds"); + for (uint i = index; i < bytesArray.length - 1; i++) { + bytesArray[i] = bytesArray[i + 1]; } - arr.pop(); + bytesArray.pop(); } } -library TypesUserWithdrawalArray { - function remove(ICasimirManager.UserWithdrawal[] storage arr, uint index) internal { - require(arr.length > 0, "Can't remove from empty array"); - require(index < arr.length, "Index out of bounds"); - for (uint i = index; i < arr.length - 1; i++) { - arr[i] = arr[i + 1]; +library TypesWithdrawalArray { + /** + * @dev Remove a withdrawal from the array + * @param withdrawals The array of withdrawals + * @param index The index of the withdrawal to remove + */ + function remove(ICasimirManager.Withdrawal[] storage withdrawals, uint index) internal { + require(withdrawals.length > 0, "Can't remove from empty array"); + require(index < withdrawals.length, "Index out of bounds"); + for (uint i = index; i < withdrawals.length - 1; i++) { + withdrawals[i] = withdrawals[i + 1]; } - arr.pop(); + withdrawals.pop(); + } +} + +library TypesAddress { + /** + * @dev Send ETH to a user + * @param user The user address + * @param amount The amount of stake to send + */ + function send(address user, uint256 amount) internal { + (bool success, ) = user.call{value: amount}(""); + require(success, "Transfer failed"); } } \ No newline at end of file diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index b69241043..53f7d8ce6 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -417,13 +417,13 @@ export async function fourthUserDepositFixture() { export async function simulationFixture() { const { manager, automation, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser, fourthUser } = await loadFixture(fourthUserDepositFixture) - let activeAmount = 128 + let nextActiveStakeAmount = 128 for (let i = 0; i < 5; i++) { const stakedValidatorCount = (await manager?.getStakedValidatorPublicKeys())?.length if (stakedValidatorCount) { const rewardAmount = rewardPerValidator * stakedValidatorCount - const nextActiveStakeAmount = activeAmount + rewardAmount + nextActiveStakeAmount = Math.round((nextActiveStakeAmount + rewardAmount) * 10) / 10 // Fixes weird rounding error const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 @@ -448,8 +448,6 @@ export async function simulationFixture() { const errorBytes = ethers.utils.toUtf8Bytes('') const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) await mockFulfillRequest.wait() - - activeAmount = nextActiveStakeAmount // For next iteration } } } diff --git a/contracts/ethereum/test/integration.ts b/contracts/ethereum/test/integration.ts index a17ef6620..871acd607 100644 --- a/contracts/ethereum/test/integration.ts +++ b/contracts/ethereum/test/integration.ts @@ -94,8 +94,8 @@ describe('Casimir manager', async function () { it('First pool\'s 0.1 is swept and compounded after some time', async function () { const { manager } = await loadFixture(sweepPostSecondUserDepositFixture) - const queuedStake = await manager.getQueuedStake() - expect(ethers.utils.formatEther(queuedStake)).equal('8.1') + const bufferedStake = await manager.getBufferedStake() + expect(ethers.utils.formatEther(bufferedStake)).equal('8.1') }) it('Third user\'s 24.0 stake completes the second pool with 32.0', async function () { @@ -147,8 +147,8 @@ describe('Casimir manager', async function () { it('First and second pool\'s 0.2 is swept and compounded after some time', async function () { const { manager } = await loadFixture(sweepPostThirdUserDepositFixture) - const queuedStake = await manager.getQueuedStake() - expect(ethers.utils.formatEther(queuedStake)).equal('0.3') + const bufferedStake = await manager.getBufferedStake() + expect(ethers.utils.formatEther(bufferedStake)).equal('0.3') }) it('First user\'s 0.3 withdrawal decreases their stake to ~15.79', async function () { @@ -187,7 +187,7 @@ describe('Casimir manager', async function () { const secondStake = await manager.getUserStake(secondUser.address) const thirdStake = await manager.getUserStake(thirdUser.address) const fourthStake = await manager.getUserStake(fourthUser.address) - + const line = '----------------------------------------' console.log(`${line}\n💿 Simulation results\n${line}`) console.log('🏦 Manager stake', ethers.utils.formatEther(stake)) From a483725c3453397725e38b11fb41ffab688b1309 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Sun, 30 Apr 2023 14:47:27 -0400 Subject: [PATCH 17/78] Remove open pools concept --- contracts/ethereum/docs/index.md | 1817 +++++++++-------- contracts/ethereum/src/CasimirAutomation.sol | 11 +- contracts/ethereum/src/CasimirManager.sol | 119 +- .../src/interfaces/ICasimirManager.sol | 5 +- contracts/ethereum/test/fixtures/shared.ts | 19 +- contracts/ethereum/test/integration.ts | 35 - 6 files changed, 1058 insertions(+), 948 deletions(-) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 04035f427..d558acdf1 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -1,1176 +1,859 @@ # Solidity API -## MockFunctionsOracle +## CasimirAutomation -### constructor +### oracleHeartbeat ```solidity -constructor() public +uint256 oracleHeartbeat ``` -### sendRequest +Oracle heartbeat + +### requestCBOR ```solidity -function sendRequest(uint64 subscriptionId, bytes data, uint32 gasLimit) external returns (bytes32 requestId) +bytes requestCBOR ``` -Sends a request (encoded as data) using the provided subscriptionId - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| gasLimit | uint32 | Gas limit for the fulfillment callback | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | A unique request identifier (unique per DON) | - -## FunctionsBillingRegistryInterface +Serialized oracle source code -### RequestBilling +### latestRequestId ```solidity -struct RequestBilling { - uint64 subscriptionId; - address client; - uint32 gasLimit; - uint256 gasPrice; -} +bytes32 latestRequestId ``` -### FulfillResult +Latest oracle request ID + +### fulfillGasLimit ```solidity -enum FulfillResult { - USER_SUCCESS, - USER_ERROR, - INVALID_REQUEST_ID -} +uint32 fulfillGasLimit ``` -### getRequestConfig +Oracle fulfillment gas limit + +### constructor ```solidity -function getRequestConfig() external view returns (uint32, address[]) +constructor(address managerAddress, address oracleAddress, uint64 _oracleSubId) public ``` -Get configuration relevant for making requests +Constructor -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32 | uint32 global max for request gas limit | -| [1] | address[] | address[] list of registered DONs | +| managerAddress | address | The manager contract address | +| oracleAddress | address | The oracle contract address | +| _oracleSubId | uint64 | The oracle subscription ID | -### getRequiredFee +### generateRequest ```solidity -function getRequiredFee(bytes data, struct FunctionsBillingRegistryInterface.RequestBilling billing) external view returns (uint96) +function generateRequest(string source, bytes secrets, string[] args) public pure returns (bytes) ``` -Determine the charged fee that will be paid to the Registry owner +Generate a new Functions.Request(off-chain, saving gas) #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| billing | struct FunctionsBillingRegistryInterface.RequestBilling | The request's billing configuration | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint96 | fee Cost in Juels (1e18) of LINK | +| source | string | JavaScript source code | +| secrets | bytes | Encrypted secrets payload | +| args | string[] | List of arguments accessible from within the source code | -### estimateCost +### setRequest ```solidity -function estimateCost(uint32 gasLimit, uint256 gasPrice, uint96 donFee, uint96 registryFee) external view returns (uint96) +function setRequest(uint32 _fulfillGasLimit, uint64 _oracleSubId, bytes _requestCBOR) external ``` -Estimate the total cost to make a request: gas re-imbursement, plus DON fee, plus Registry fee +Set the bytes representing the CBOR-encoded Functions.Request #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| gasLimit | uint32 | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| gasPrice | uint256 | The request's billing configuration | -| donFee | uint96 | Fee charged by the DON that is paid to Oracle Node | -| registryFee | uint96 | Fee charged by the DON that is paid to Oracle Node | +| _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | +| _oracleSubId | uint64 | The oracle billing subscription ID used to pay for Functions requests | +| _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | + +### checkUpkeep + +```solidity +function checkUpkeep(bytes) public view returns (bool upkeepNeeded, bytes performData) +``` + +Check if the upkeep is needed #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint96 | costEstimate Cost in Juels (1e18) of LINK | +| upkeepNeeded | bool | True if the upkeep is needed | +| performData | bytes | | -### startBilling +### performUpkeep ```solidity -function startBilling(bytes data, struct FunctionsBillingRegistryInterface.RequestBilling billing) external returns (bytes32) +function performUpkeep(bytes) external ``` -Initiate the billing process for an Functions request +Perform the upkeep -_Only callable by a node that has been approved on the Registry_ +### fulfillRequest -#### Parameters +```solidity +function fulfillRequest(bytes32 requestId, bytes response, bytes err) internal +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| billing | struct FunctionsBillingRegistryInterface.RequestBilling | Billing configuration for the request | +Callback that is invoked once the DON has resolved the request or hit an error -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes32 | requestId - A unique identifier of the request. Can be used to match a request to a response in fulfillRequest. | +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | -### fulfillAndBill +### setOracleAddress ```solidity -function fulfillAndBill(bytes32 requestId, bytes response, bytes err, address transmitter, address[31] signers, uint8 signerCount, uint256 reportValidationGas, uint256 initialGas) external returns (enum FunctionsBillingRegistryInterface.FulfillResult) +function setOracleAddress(address newOracleAddress) external ``` -Finalize billing process for an Functions request by sending a callback to the Client contract and then charging the subscription - -_Only callable by a node that has been approved on the Registry -simulated offchain to determine if sufficient balance is present to fulfill the request_ +Update the functions oracle address #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| requestId | bytes32 | identifier for the request that was generated by the Registry in the beginBilling commitment | -| response | bytes | response data from DON consensus | -| err | bytes | error from DON consensus | -| transmitter | address | the Oracle who sent the report | -| signers | address[31] | the Oracles who had a part in generating the report | -| signerCount | uint8 | the number of signers on the report | -| reportValidationGas | uint256 | the amount of gas used for the report validation. Cost is split by all fulfillments on the report. | -| initialGas | uint256 | the initial amount of gas that should be used as a baseline to charge the single fulfillment for execution cost | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | enum FunctionsBillingRegistryInterface.FulfillResult | result fulfillment result | +| newOracleAddress | address | New oracle address | -### getSubscriptionOwner +### mockFulfillRequest ```solidity -function getSubscriptionOwner(uint64 subscriptionId) external view returns (address owner) +function mockFulfillRequest(bytes32 requestId, bytes response, bytes err) external ``` -Gets subscription owner. +Fulfill the request for testing #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| subscriptionId | uint64 | - ID of the subscription | +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | -#### Return Values +## CasimirManager -| Name | Type | Description | -| ---- | ---- | ----------- | -| owner | address | - owner of the subscription. | +### Token -## FunctionsOracleInterface +```solidity +enum Token { + LINK, + SSV, + WETH +} +``` -### getRegistry +### latestActiveStake ```solidity -function getRegistry() external view returns (address) +uint256 latestActiveStake ``` -Gets the stored billing registry address +Latest active (consensus) balance reported from automation -#### Return Values +### lastPoolId -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | address | registryAddress The address of Chainlink Functions billing registry contract | +```solidity +uint256 lastPoolId +``` -### setRegistry +Last pool ID created + +### rewardRatioSum ```solidity -function setRegistry(address registryAddress) external +uint256 rewardRatioSum ``` -Sets the stored billing registry address +Sum of scaled reward to stake ratios (intial value required) -#### Parameters +### linkFee -| Name | Type | Description | -| ---- | ---- | ----------- | -| registryAddress | address | The new address of Chainlink Functions billing registry contract | +```solidity +uint32 linkFee +``` -### getDONPublicKey +LINK fee percentage (intial value required) + +### ssvFee ```solidity -function getDONPublicKey() external view returns (bytes) +uint32 ssvFee ``` -Returns the DON's secp256k1 public key that is used to encrypt secrets +SSV fee percentage (intial value required) -_All nodes on the DON have the corresponding private key -needed to decrypt the secrets encrypted with the public key_ +### constructor -#### Return Values +```solidity +constructor(address beaconDepositAddress, address linkTokenAddress, address oracleAddress, uint64 oracleSubId, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public +``` + +Constructor + +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes | publicKey the DON's public key | +| beaconDepositAddress | address | The Beacon deposit address | +| linkTokenAddress | address | The Chainlink token address | +| oracleAddress | address | The Chainlink functions oracle address | +| oracleSubId | uint64 | The Chainlink functions oracle subscription ID | +| ssvNetworkAddress | address | The SSV network address | +| ssvTokenAddress | address | The SSV token address | +| swapFactoryAddress | address | The Uniswap factory address | +| swapRouterAddress | address | The Uniswap router address | +| wethTokenAddress | address | The WETH contract address | -### setDONPublicKey +### depositStake ```solidity -function setDONPublicKey(bytes donPublicKey) external +function depositStake() external payable ``` -Sets DON's secp256k1 public key used to encrypt secrets +Deposit user stake -_Used to rotate the key_ +### rebalanceStake + +```solidity +function rebalanceStake(uint256 activeStake, uint256 sweptRewards) external +``` + +Rebalance the reward to stake ratio and redistribute swept rewards #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| donPublicKey | bytes | The new public key | +| activeStake | uint256 | The active consensus stake | +| sweptRewards | uint256 | The swept consensus stake | -### setNodePublicKey +### requestWithdrawal ```solidity -function setNodePublicKey(address node, bytes publicKey) external +function requestWithdrawal(uint256 amount) external ``` -Sets a per-node secp256k1 public key used to encrypt secrets for that node - -_Callable only by contract owner and DON members_ +Request to withdraw user stake #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| node | address | node's address | -| publicKey | bytes | node's public key | +| amount | uint256 | The amount of stake to withdraw | -### deleteNodePublicKey +### initiateRequestedWithdrawals ```solidity -function deleteNodePublicKey(address node) external +function initiateRequestedWithdrawals(uint256 count) external ``` -Deletes node's public key - -_Callable only by contract owner or the node itself_ +Initiate a given count of requested withdrawals #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| node | address | node's address | +| count | uint256 | The number of withdrawals to initiate | -### getAllNodePublicKeys +### completePendingWithdrawals ```solidity -function getAllNodePublicKeys() external view returns (address[], bytes[]) +function completePendingWithdrawals(uint256 count) external ``` -Return two arrays of equal size containing DON members' addresses and their corresponding -public keys (or empty byte arrays if per-node key is not defined) +Complete a given count of pending withdrawals -### getRequiredFee +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| count | uint256 | The number of withdrawals to complete | + +### initiateReadyPools ```solidity -function getRequiredFee(bytes data, struct FunctionsBillingRegistryInterface.RequestBilling billing) external view returns (uint96) +function initiateReadyPools(uint256 count) external ``` -Determine the fee charged by the DON that will be split between signing Node Operators for servicing the request +Initiate a given count of next ready pools #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| billing | struct FunctionsBillingRegistryInterface.RequestBilling | The request's billing configuration | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint96 | fee Cost in Juels (1e18) of LINK | +| count | uint256 | The number of pools to stake | -### estimateCost +### completePendingPools ```solidity -function estimateCost(uint64 subscriptionId, bytes data, uint32 gasLimit, uint256 gasPrice) external view returns (uint96) +function completePendingPools(uint256 count) external ``` -Estimate the total cost that will be charged to a subscription to make a request: gas re-imbursement, plus DON fee, plus Registry fee +Complete a given count of the next pending pools #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| gasLimit | uint32 | Gas limit for the fulfillment callback | -| gasPrice | uint256 | | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint96 | billedCost Cost in Juels (1e18) of LINK | +| count | uint256 | The number of pools to complete | -### sendRequest +### requestPoolExits ```solidity -function sendRequest(uint64 subscriptionId, bytes data, uint32 gasLimit) external returns (bytes32) +function requestPoolExits(uint256 count) external ``` -Sends a request (encoded as data) using the provided subscriptionId +Request a given count of staked pool exits #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| gasLimit | uint32 | Gas limit for the fulfillment callback | +| count | uint256 | The number of exits to request | -#### Return Values +### completePoolExit + +```solidity +function completePoolExit(uint256 poolIndex, uint256 validatorIndex) external +``` + +Complete a pool exit + +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes32 | requestId A unique request identifier (unique per DON) | - -## CasimirAutomation +| poolIndex | uint256 | The staked pool index | +| validatorIndex | uint256 | The staked validator (internal) index | -### oracleHeartbeat +### registerOperator ```solidity -uint256 oracleHeartbeat +function registerOperator(uint32 operatorId) external payable ``` -Oracle heartbeat - -### oracleThreshold +Register an operator with the pool manager -```solidity -uint256 oracleThreshold -``` +#### Parameters -Oracle threshold +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint32 | The operator ID | -### compoundThreshold +### registerValidator ```solidity -uint256 compoundThreshold +function registerValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external ``` -Compound threshold (0.1 ETH) - -### requestCBOR +Register a validator with the pool manager -```solidity -bytes requestCBOR -``` +#### Parameters -Serialized oracle source code +| Name | Type | Description | +| ---- | ---- | ----------- | +| depositDataRoot | bytes32 | The deposit data root | +| publicKey | bytes | The validator public key | +| operatorIds | uint32[] | The operator IDs | +| sharesEncrypted | bytes[] | The encrypted shares | +| sharesPublicKeys | bytes[] | The public keys of the shares | +| signature | bytes | The signature | +| withdrawalCredentials | bytes | The withdrawal credentials | -### latestRequestId +### reshareValidator ```solidity -bytes32 latestRequestId +function reshareValidator(bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys) external ``` -Latest oracle request ID - -### fulfillGasLimit +Reshare a registered validator -```solidity -uint32 fulfillGasLimit -``` +#### Parameters -Oracle fulfillment gas limit +| Name | Type | Description | +| ---- | ---- | ----------- | +| publicKey | bytes | The validator public key | +| operatorIds | uint32[] | The operator IDs | +| sharesEncrypted | bytes[] | The encrypted shares | +| sharesPublicKeys | bytes[] | The public keys of the shares | -### constructor +### setLINKFee ```solidity -constructor(address managerAddress, address oracleAddress, uint64 _oracleSubId) public +function setLINKFee(uint32 newFee) external ``` -Constructor +_Update link fee_ #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| managerAddress | address | The manager contract address | -| oracleAddress | address | The oracle contract address | -| _oracleSubId | uint64 | The oracle subscription ID | +| newFee | uint32 | The new fee | -### generateRequest +### setSSVFee ```solidity -function generateRequest(string source, bytes secrets, string[] args) public pure returns (bytes) +function setSSVFee(uint32 newFee) external ``` -Generate a new Functions.Request(off-chain, saving gas) +_Update ssv fee_ #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| source | string | JavaScript source code | -| secrets | bytes | Encrypted secrets payload | -| args | string[] | List of arguments accessible from within the source code | +| newFee | uint32 | The new fee | -### setRequest +### setOracleAddress ```solidity -function setRequest(uint32 _fulfillGasLimit, uint64 _oracleSubId, bytes _requestCBOR) external +function setOracleAddress(address oracle) external ``` -Set the bytes representing the CBOR-encoded Functions.Request +Update the functions oracle address #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | -| _oracleSubId | uint64 | The oracle billing subscription ID used to pay for Functions requests | -| _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | +| oracle | address | New oracle address | -### checkUpkeep +### getStake ```solidity -function checkUpkeep(bytes) public view returns (bool upkeepNeeded, bytes performData) +function getStake() public view returns (uint256 stake) ``` -Check if the upkeep is needed +Get the total manager stake #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| upkeepNeeded | bool | True if the upkeep is needed | -| performData | bytes | | +| stake | uint256 | The total manager stake | -### performUpkeep +### getBufferedStake ```solidity -function performUpkeep(bytes) external +function getBufferedStake() public view returns (uint256 bufferedStake) ``` -Perform the upkeep +Get the total manager buffered (execution) stake -### fulfillRequest +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| bufferedStake | uint256 | The total manager buffered (execution) stake | + +### getSweptStake ```solidity -function fulfillRequest(bytes32 requestId, bytes response, bytes err) internal +function getSweptStake() public view returns (uint256 sweptStake) ``` -Callback that is invoked once the DON has resolved the request or hit an error +Get the total manager swept (execution) stake -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| requestId | bytes32 | The request ID, returned by sendRequest() | -| response | bytes | Aggregated response from the user code | -| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | +| sweptStake | uint256 | The total manager swept (execution) stake | -### setOracleAddress +### getActiveStake ```solidity -function setOracleAddress(address newOracleAddress) external +function getActiveStake() public view returns (uint256 activeStake) ``` -Update the functions oracle address +Get the manager active (consensus) stake -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| newOracleAddress | address | New oracle address | +| activeStake | uint256 | The total manager active (consensus) stake | -### mockFulfillRequest +### getUserStake ```solidity -function mockFulfillRequest(bytes32 requestId, bytes response, bytes err) external +function getUserStake(address userAddress) public view returns (uint256 userStake) ``` -Fulfill the request for testing +Get the total user stake for a given user address #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| requestId | bytes32 | The request ID, returned by sendRequest() | -| response | bytes | Aggregated response from the user code | -| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | +| userAddress | address | The user address | -## CasimirManager +#### Return Values -### Token +| Name | Type | Description | +| ---- | ---- | ----------- | +| userStake | uint256 | The total user stake | + +### getFees ```solidity -enum Token { - LINK, - SSV, - WETH -} +function getFees() public view returns (struct ICasimirManager.Fees fees) ``` -### latestActiveStake +Get the current token fees as percentages -```solidity -uint256 latestActiveStake -``` +#### Return Values -Latest active (consensus) balance reported from automation +| Name | Type | Description | +| ---- | ---- | ----------- | +| fees | struct ICasimirManager.Fees | The current token fees as percentages | -### lastPoolId +### getRequestedWithdrawals ```solidity -uint256 lastPoolId +function getRequestedWithdrawals() external view returns (uint256) ``` -Last pool ID created - -### rewardRatioSum +Get the total requested withdrawals -```solidity -uint256 rewardRatioSum -``` +#### Return Values -Sum of scaled reward to stake ratios (intial value required) +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | requestedWithdrawals The total requested withdrawals | -### linkFee +### getPendingWithdrawals ```solidity -uint32 linkFee +function getPendingWithdrawals() external view returns (uint256) ``` -LINK fee percentage (intial value required) - -### ssvFee +Get the total pending withdrawals -```solidity -uint32 ssvFee -``` +#### Return Values -SSV fee percentage (intial value required) +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | pendingWithdrawals The total pending withdrawals | -### constructor +### getReadyValidatorPublicKeys ```solidity -constructor(address beaconDepositAddress, address linkTokenAddress, address oracleAddress, uint64 oracleSubId, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public +function getReadyValidatorPublicKeys() external view returns (bytes[]) ``` -Constructor +Get ready validator public keys -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| beaconDepositAddress | address | The Beacon deposit address | -| linkTokenAddress | address | The Chainlink token address | -| oracleAddress | address | The Chainlink functions oracle address | -| oracleSubId | uint64 | The Chainlink functions oracle subscription ID | -| ssvNetworkAddress | address | The SSV network address | -| ssvTokenAddress | address | The SSV token address | -| swapFactoryAddress | address | The Uniswap factory address | -| swapRouterAddress | address | The Uniswap router address | -| wethTokenAddress | address | The WETH contract address | +| [0] | bytes[] | A list of inactive validator public keys | -### reportStake +### getStakedValidatorPublicKeys ```solidity -function reportStake(uint256 active, uint256 swept) external +function getStakedValidatorPublicKeys() external view returns (bytes[]) ``` -Report the latest consensus stake to the manager +Get staked validator public keys -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| active | uint256 | The active consensus stake | -| swept | uint256 | The swept consensus stake | - -### getPrincipal - -```solidity -function getPrincipal() public view returns (uint256) -``` - -### deposit - -```solidity -function deposit() external payable -``` - -Deposit user stake to the pool manager +| [0] | bytes[] | A list of active validator public keys | -### withdraw +### getExitingValidatorCount ```solidity -function withdraw(uint256 amount) external +function getExitingValidatorCount() external view returns (uint256) ``` -Withdraw user stake +Get the count of exiting validators -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| amount | uint256 | The amount of ETH to withdraw | - -### inititateNextWithdrawal - -```solidity -function inititateNextWithdrawal() external -``` - -Initiate the next withdrawal of user stake from exited deposits - -### completeNextWithdrawal - -```solidity -function completeNextWithdrawal() external -``` - -Complete the next withdrawal of user stake from exited deposits - -### stakeReadyPools - -```solidity -function stakeReadyPools() external -``` - -Stake the ready pools +| [0] | uint256 | The count of exiting validators | -### requestPoolExit +### getOpenPoolIds ```solidity -function requestPoolExit(uint32 poolId) external +function getOpenPoolIds() external view returns (uint32[]) ``` -Request a pool exit +Get a list of all open pool IDs -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| poolId | uint32 | The staked pool ID | +| [0] | uint32[] | A list of all open pool IDs | -### completePoolExit +### getReadyPoolIds ```solidity -function completePoolExit(uint256 poolIndex, uint256 validatorIndex) external +function getReadyPoolIds() external view returns (uint32[]) ``` -Complete a pool exit +Get a list of all ready pool IDs -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| poolIndex | uint256 | The staked pool index | -| validatorIndex | uint256 | The staked validator (internal) index | +| [0] | uint32[] | A list of all ready pool IDs | -### registerOperator +### getPendingPoolIds ```solidity -function registerOperator(uint32 operatorId) external payable +function getPendingPoolIds() external view returns (uint32[]) ``` -Register an operator with the pool manager +Get a list of all pending pool IDs -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint32 | The operator ID | +| [0] | uint32[] | A list of all pending pool IDs | -### registerValidator +### getStakedPoolIds ```solidity -function registerValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external +function getStakedPoolIds() external view returns (uint32[]) ``` -Register a validator with the pool manager +Get a list of all staked pool IDs -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| depositDataRoot | bytes32 | The deposit data root | -| publicKey | bytes | The validator public key | -| operatorIds | uint32[] | The operator IDs | -| sharesEncrypted | bytes[] | The encrypted shares | -| sharesPublicKeys | bytes[] | The public keys of the shares | -| signature | bytes | The signature | -| withdrawalCredentials | bytes | The withdrawal credentials | +| [0] | uint32[] | A list of all staked pool IDs | -### reshareValidator +### getOpenDeposits ```solidity -function reshareValidator(bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys) external +function getOpenDeposits() external view returns (uint256) ``` -Reshare a registered validator +Get the total manager open deposits -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| publicKey | bytes | The validator public key | -| operatorIds | uint32[] | The operator IDs | -| sharesEncrypted | bytes[] | The encrypted shares | -| sharesPublicKeys | bytes[] | The public keys of the shares | +| [0] | uint256 | The total manager open deposits | -### setLINKFee +### getPoolDetails ```solidity -function setLINKFee(uint32 newFee) external +function getPoolDetails(uint32 poolId) external view returns (struct ICasimirManager.PoolDetails poolDetails) ``` -_Update link fee_ +Get the pool details for a given pool ID #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| newFee | uint32 | The new fee | - -### setSSVFee - -```solidity -function setSSVFee(uint32 newFee) external -``` - -_Update ssv fee_ +| poolId | uint32 | The pool ID | -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| newFee | uint32 | The new fee | +| poolDetails | struct ICasimirManager.PoolDetails | The pool details | -### setOracleAddress +### getLINKFee ```solidity -function setOracleAddress(address oracle) external +function getLINKFee() external view returns (uint32) ``` -Update the functions oracle address +Get the LINK fee percentage to charge on each deposit -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| oracle | address | New oracle address | +| [0] | uint32 | The LINK fee percentage to charge on each deposit | -### getStake +### getSSVFee ```solidity -function getStake() public view returns (uint256 stake) +function getSSVFee() external view returns (uint32) ``` -Get the total manager stake +Get the SSV fee percentage to charge on each deposit #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| stake | uint256 | The total manager stake | +| [0] | uint32 | The SSV fee percentage to charge on each deposit | -### getQueuedStake +### getAutomationAddress ```solidity -function getQueuedStake() public view returns (uint256 queuedStake) +function getAutomationAddress() external view returns (address automationAddress) ``` -Get the total manager queued (execution) stake +Get the automation address #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| queuedStake | uint256 | The total manager queued (execution) stake | +| automationAddress | address | The automation address | -### getSweptStake +### receive ```solidity -function getSweptStake() public view returns (uint256 sweptStake) +receive() external payable ``` -Get the total manager swept (execution) stake - -#### Return Values +_Will be removed in production +Used for mocking sweeps from Beacon to the manager_ -| Name | Type | Description | -| ---- | ---- | ----------- | -| sweptStake | uint256 | The total manager swept (execution) stake | +## ICasimirAutomation -### getActiveStake +### OracleReport ```solidity -function getActiveStake() public view returns (uint256 activeStake) +struct OracleReport { + uint256 activeStake; + uint256 sweptRewards; + uint256 sweptExits; +} ``` -Get the manager active (consensus) stake - -#### Return Values +### OCRResponse -| Name | Type | Description | -| ---- | ---- | ----------- | -| activeStake | uint256 | The total manager active (consensus) stake | +```solidity +event OCRResponse(bytes32 requestId, bytes result, bytes err) +``` -### getUserStake +### checkUpkeep ```solidity -function getUserStake(address userAddress) public view returns (uint256 userStake) +function checkUpkeep(bytes checkData) external returns (bool upkeepNeeded, bytes performData) ``` -Get the total user stake for a given user address +method that is simulated by the keepers to see if any work actually +needs to be performed. This method does does not actually need to be +executable, and since it is only ever simulated it can consume lots of gas. + +_To ensure that it is never called, you may want to add the +cannotExecute modifier from KeeperBase to your implementation of this +method._ #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| userAddress | address | The user address | +| checkData | bytes | specified in the upkeep registration so it is always the same for a registered upkeep. This can easily be broken down into specific arguments using `abi.decode`, so multiple upkeeps can be registered on the same contract and easily differentiated by the contract. | #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| userStake | uint256 | The total user stake | +| upkeepNeeded | bool | boolean to indicate whether the keeper should call performUpkeep or not. | +| performData | bytes | bytes that the keeper should call performUpkeep with, if upkeep is needed. If you would like to encode data to decode later, try `abi.encode`. | -### getFees +### performUpkeep ```solidity -function getFees() public view returns (struct ICasimirManager.Fees fees) +function performUpkeep(bytes performData) external ``` -Get the current token fees as percentages +method that is actually executed by the keepers, via the registry. +The data returned by the checkUpkeep simulation will be passed into +this method to actually be executed. -#### Return Values +_The input to this method should not be trusted, and the caller of the +method should not even be restricted to any single registry. Anyone should +be able call it, and the input should be validated, there is no guarantee +that the data passed in is the performData returned from checkUpkeep. This +could happen due to malicious keepers, racing keepers, or simply a state +change while the performUpkeep transaction is waiting for confirmation. +Always validate the data passed in._ + +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| fees | struct ICasimirManager.Fees | The current token fees as percentages | +| performData | bytes | is the data which was passed back from the checkData simulation. If it is encoded, it can easily be decoded into other types by calling `abi.decode`. This data should not be trusted, and should be validated against the contract's current state. | -### getLINKFee +### setOracleAddress ```solidity -function getLINKFee() external view returns (uint32) +function setOracleAddress(address oracleAddress) external ``` -Get the LINK fee percentage to charge on each deposit - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32 | The LINK fee percentage to charge on each deposit | - -### getSSVFee +### mockFulfillRequest ```solidity -function getSSVFee() external view returns (uint32) +function mockFulfillRequest(bytes32 requestId, bytes result, bytes err) external ``` -Get the SSV fee percentage to charge on each deposit - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32 | The SSV fee percentage to charge on each deposit | +## ICasimirManager -### getReadyValidatorPublicKeys +### ProcessedDeposit ```solidity -function getReadyValidatorPublicKeys() external view returns (bytes[]) +struct ProcessedDeposit { + uint256 ethAmount; + uint256 linkAmount; + uint256 ssvAmount; +} ``` -Get ready validator public keys - -#### Return Values +### Fees -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes[] | A list of inactive validator public keys | +```solidity +struct Fees { + uint32 LINK; + uint32 SSV; +} +``` -### getStakedValidatorPublicKeys +### Pool ```solidity -function getStakedValidatorPublicKeys() external view returns (bytes[]) +struct Pool { + uint256 deposits; + bytes validatorPublicKey; + bool exiting; +} ``` -Get staked validator public keys - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes[] | A list of active validator public keys | - -### getExitingValidatorCount - -```solidity -function getExitingValidatorCount() external view returns (uint256) -``` - -Get the count of exiting validators - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The count of exiting validators | - -### getOpenPoolIds - -```solidity -function getOpenPoolIds() external view returns (uint32[]) -``` - -Get a list of all open pool IDs - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32[] | A list of all open pool IDs | - -### getReadyPoolIds - -```solidity -function getReadyPoolIds() external view returns (uint32[]) -``` - -Get a list of all ready pool IDs - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32[] | A list of all ready pool IDs | - -### getPendingPoolIds - -```solidity -function getPendingPoolIds() external view returns (uint32[]) -``` - -Get a list of all pending pool IDs - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32[] | A list of all pending pool IDs | - -### getStakedPoolIds - -```solidity -function getStakedPoolIds() external view returns (uint32[]) -``` - -Get a list of all staked pool IDs - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32[] | A list of all staked pool IDs | - -### getOpenDeposits - -```solidity -function getOpenDeposits() external view returns (uint256) -``` - -Get the total manager open deposits - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The total manager open deposits | - -### getPoolDetails - -```solidity -function getPoolDetails(uint32 poolId) external view returns (struct ICasimirManager.PoolDetails poolDetails) -``` - -Get the pool details for a given pool ID - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolDetails | struct ICasimirManager.PoolDetails | The pool details | - -### getAutomationAddress - -```solidity -function getAutomationAddress() external view returns (address automationAddress) -``` - -Get the automation address - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| automationAddress | address | The automation address | - -### receive - -```solidity -receive() external payable -``` - -_Will be removed in production -Used for mocking sweeps from Beacon to the manager_ - -## ICasimirAutomation - -### OracleReport - -```solidity -struct OracleReport { - uint256 activeStake; - uint256 withdrawnStake; -} -``` - -### OCRResponse - -```solidity -event OCRResponse(bytes32 requestId, bytes result, bytes err) -``` - -### checkUpkeep - -```solidity -function checkUpkeep(bytes checkData) external returns (bool upkeepNeeded, bytes performData) -``` - -method that is simulated by the keepers to see if any work actually -needs to be performed. This method does does not actually need to be -executable, and since it is only ever simulated it can consume lots of gas. - -_To ensure that it is never called, you may want to add the -cannotExecute modifier from KeeperBase to your implementation of this -method._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| checkData | bytes | specified in the upkeep registration so it is always the same for a registered upkeep. This can easily be broken down into specific arguments using `abi.decode`, so multiple upkeeps can be registered on the same contract and easily differentiated by the contract. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| upkeepNeeded | bool | boolean to indicate whether the keeper should call performUpkeep or not. | -| performData | bytes | bytes that the keeper should call performUpkeep with, if upkeep is needed. If you would like to encode data to decode later, try `abi.encode`. | - -### performUpkeep - -```solidity -function performUpkeep(bytes performData) external -``` - -method that is actually executed by the keepers, via the registry. -The data returned by the checkUpkeep simulation will be passed into -this method to actually be executed. - -_The input to this method should not be trusted, and the caller of the -method should not even be restricted to any single registry. Anyone should -be able call it, and the input should be validated, there is no guarantee -that the data passed in is the performData returned from checkUpkeep. This -could happen due to malicious keepers, racing keepers, or simply a state -change while the performUpkeep transaction is waiting for confirmation. -Always validate the data passed in._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| performData | bytes | is the data which was passed back from the checkData simulation. If it is encoded, it can easily be decoded into other types by calling `abi.decode`. This data should not be trusted, and should be validated against the contract's current state. | - -### setOracleAddress - -```solidity -function setOracleAddress(address oracleAddress) external -``` - -### mockFulfillRequest - -```solidity -function mockFulfillRequest(bytes32 requestId, bytes result, bytes err) external -``` - -## ICasimirManager - -### ProcessedDeposit - -```solidity -struct ProcessedDeposit { - uint256 ethAmount; - uint256 linkAmount; - uint256 ssvAmount; -} -``` - -### Fees - -```solidity -struct Fees { - uint32 LINK; - uint32 SSV; -} -``` - -### Pool - -```solidity -struct Pool { - uint256 deposits; - bytes validatorPublicKey; - bool exiting; -} -``` - -### PoolDetails +### PoolDetails ```solidity struct PoolDetails { @@ -1190,10 +873,10 @@ struct User { } ``` -### UserWithdrawal +### Withdrawal ```solidity -struct UserWithdrawal { +struct Withdrawal { address user; uint256 amount; } @@ -1213,22 +896,22 @@ struct Validator { } ``` -### DistributionRebalanced +### PoolIncreased ```solidity -event DistributionRebalanced(address sender, uint256 amount) +event PoolIncreased(address sender, uint32 poolId, uint256 amount) ``` -### PoolIncreased +### PoolInitiated ```solidity -event PoolIncreased(address sender, uint32 poolId, uint256 amount) +event PoolInitiated(uint32 poolId) ``` -### PoolStaked +### PoolCompleted ```solidity -event PoolStaked(uint32 poolId) +event PoolCompleted(uint32 poolId) ``` ### PoolExitRequested @@ -1249,28 +932,28 @@ event PoolExited(uint32 poolId) event StakeDistributed(address sender, uint256 amount) ``` -### StakeWithdrawalRequested +### StakeRebalanced ```solidity -event StakeWithdrawalRequested(address sender, uint256 amount) +event StakeRebalanced(address sender, uint256 amount) ``` -### StakeWithdrawalInitiated +### WithdrawalRequested ```solidity -event StakeWithdrawalInitiated(address sender, uint256 amount) +event WithdrawalRequested(address sender, uint256 amount) ``` -### StakeWithdrawn +### WithdrawalInitiated ```solidity -event StakeWithdrawn(address sender, uint256 amount) +event WithdrawalInitiated(address sender, uint256 amount) ``` -### RewardDistributed +### WithdrawalCompleted ```solidity -event RewardDistributed(address sender, uint256 amount) +event WithdrawalCompleted(address sender, uint256 amount) ``` ### ValidatorRegistered @@ -1285,55 +968,73 @@ event ValidatorRegistered(bytes publicKey) event ValidatorReshared(bytes publicKey) ``` -### deposit +### depositStake ```solidity -function deposit() external payable +function depositStake() external payable ``` -### reportStake +### rebalanceStake ```solidity -function reportStake(uint256 current, uint256 withdrawn) external +function rebalanceStake(uint256 activeStake, uint256 sweptRewards) external ``` -### withdraw +### requestWithdrawal ```solidity -function withdraw(uint256 amount) external +function requestWithdrawal(uint256 amount) external ``` -### stakeReadyPools +### initiateRequestedWithdrawals ```solidity -function stakeReadyPools() external +function initiateRequestedWithdrawals(uint256 count) external ``` -### requestPoolExit +### completePendingWithdrawals ```solidity -function requestPoolExit(uint32 poolId) external +function completePendingWithdrawals(uint256 count) external ``` -### completePoolExit +### initiateReadyPools ```solidity -function completePoolExit(uint256 poolIndex, uint256 validatorIndex) external +function initiateReadyPools(uint256 count) external ``` -### registerValidator +### completePendingPools ```solidity -function registerValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external +function completePendingPools(uint256 count) external ``` -### setLINKFee +### requestPoolExits ```solidity -function setLINKFee(uint32 fee) external +function requestPoolExits(uint256 count) external ``` -### setSSVFee +### completePoolExit + +```solidity +function completePoolExit(uint256 poolIndex, uint256 validatorIndex) external +``` + +### registerValidator + +```solidity +function registerValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external +``` + +### setLINKFee + +```solidity +function setLINKFee(uint32 fee) external +``` + +### setSSVFee ```solidity function setSSVFee(uint32 fee) external @@ -1405,10 +1106,10 @@ function getStakedPoolIds() external view returns (uint32[]) function getStake() external view returns (uint256) ``` -### getQueuedStake +### getBufferedStake ```solidity -function getQueuedStake() external view returns (uint256) +function getBufferedStake() external view returns (uint256) ``` ### getSweptStake @@ -1435,30 +1136,86 @@ function getOpenDeposits() external view returns (uint256) function getUserStake(address userAddress) external view returns (uint256) ``` +### getRequestedWithdrawals + +```solidity +function getRequestedWithdrawals() external view returns (uint256) +``` + +### getPendingWithdrawals + +```solidity +function getPendingWithdrawals() external view returns (uint256) +``` + ## Types32Array ### remove ```solidity -function remove(uint32[] arr, uint256 index) internal +function remove(uint32[] uint32Array, uint256 index) internal ``` +_Remove a uint32 element from the array_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| uint32Array | uint32[] | The array of uint32 | +| index | uint256 | | + ## TypesBytesArray ### remove ```solidity -function remove(bytes[] arr, uint256 index) internal +function remove(bytes[] bytesArray, uint256 index) internal ``` -## TypesUserWithdrawalArray +_Remove a bytes element from the array_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| bytesArray | bytes[] | The array of bytes | +| index | uint256 | The index of the element to remove | + +## TypesWithdrawalArray ### remove ```solidity -function remove(struct ICasimirManager.UserWithdrawal[] arr, uint256 index) internal +function remove(struct ICasimirManager.Withdrawal[] withdrawals, uint256 index) internal +``` + +_Remove a withdrawal from the array_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| withdrawals | struct ICasimirManager.Withdrawal[] | The array of withdrawals | +| index | uint256 | The index of the withdrawal to remove | + +## TypesAddress + +### send + +```solidity +function send(address user, uint256 amount) internal ``` +_Send ETH to a user_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| user | address | The user address | +| amount | uint256 | The amount of stake to send | + ## Functions ### DEFAULT_BUFFER_SIZE @@ -1613,57 +1370,381 @@ Adds args for the user run function | self | struct Functions.Request | The initialized request | | args | string[] | The array of args (must not be empty) | -## FunctionsClient +## FunctionsClient + +Contract writers can inherit this contract in order to create Chainlink Functions requests + +### s_oracle + +```solidity +contract FunctionsOracleInterface s_oracle +``` + +### s_pendingRequests + +```solidity +mapping(bytes32 => address) s_pendingRequests +``` + +### RequestSent + +```solidity +event RequestSent(bytes32 id) +``` + +### RequestFulfilled + +```solidity +event RequestFulfilled(bytes32 id) +``` + +### SenderIsNotRegistry + +```solidity +error SenderIsNotRegistry() +``` + +### RequestIsAlreadyPending + +```solidity +error RequestIsAlreadyPending() +``` + +### RequestIsNotPending + +```solidity +error RequestIsNotPending() +``` + +### constructor + +```solidity +constructor(address oracle) internal +``` + +### getDONPublicKey + +```solidity +function getDONPublicKey() external view returns (bytes) +``` + +Returns the DON's secp256k1 public key used to encrypt secrets + +_All Oracles nodes have the corresponding private key +needed to decrypt the secrets encrypted with the public key_ + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes | publicKey DON's public key | + +### estimateCost + +```solidity +function estimateCost(struct Functions.Request req, uint64 subscriptionId, uint32 gasLimit, uint256 gasPrice) public view returns (uint96) +``` + +Estimate the total cost that will be charged to a subscription to make a request: gas re-imbursement, plus DON fee, plus Registry fee + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| req | struct Functions.Request | The initialized Functions.Request | +| subscriptionId | uint64 | The subscription ID | +| gasLimit | uint32 | gas limit for the fulfillment callback | +| gasPrice | uint256 | | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint96 | billedCost Cost in Juels (1e18) of LINK | + +### sendRequest + +```solidity +function sendRequest(struct Functions.Request req, uint64 subscriptionId, uint32 gasLimit) internal returns (bytes32) +``` + +Sends a Chainlink Functions request to the stored oracle address + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| req | struct Functions.Request | The initialized Functions.Request | +| subscriptionId | uint64 | The subscription ID | +| gasLimit | uint32 | gas limit for the fulfillment callback | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes32 | requestId The generated request ID | + +### fulfillRequest + +```solidity +function fulfillRequest(bytes32 requestId, bytes response, bytes err) internal virtual +``` + +User defined function to handle a response + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| err | bytes | Aggregated error from the user code or from the execution pipeline Either response or error parameter will be set, but never both | + +### handleOracleFulfillment + +```solidity +function handleOracleFulfillment(bytes32 requestId, bytes response, bytes err) external +``` + +Chainlink Functions response handler called by the designated transmitter node in an OCR round. + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | The requestId returned by FunctionsClient.sendRequest(). | +| response | bytes | Aggregated response from the user code. | +| err | bytes | Aggregated error either from the user code or from the execution pipeline. Either response or error parameter will be set, but never both. | + +### setOracle + +```solidity +function setOracle(address oracle) internal +``` + +Sets the stored Oracle address + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| oracle | address | The address of Functions Oracle contract | + +### getChainlinkOracleAddress + +```solidity +function getChainlinkOracleAddress() internal view returns (address) +``` + +Gets the stored address of the oracle contract + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | address | The address of the oracle contract | + +### addExternalRequest + +```solidity +function addExternalRequest(address oracleAddress, bytes32 requestId) internal +``` + +Allows for a request which was created on another contract to be fulfilled +on this contract + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| oracleAddress | address | The address of the oracle contract that will fulfill the request | +| requestId | bytes32 | The request ID used for the response | + +### recordChainlinkFulfillment + +```solidity +modifier recordChainlinkFulfillment(bytes32 requestId) +``` + +_Reverts if the sender is not the oracle that serviced the request. +Emits RequestFulfilled event._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | The request ID for fulfillment | + +### notPendingRequest + +```solidity +modifier notPendingRequest(bytes32 requestId) +``` + +_Reverts if the request is already pending_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | The request ID for fulfillment | + +## FunctionsBillingRegistryInterface + +### RequestBilling + +```solidity +struct RequestBilling { + uint64 subscriptionId; + address client; + uint32 gasLimit; + uint256 gasPrice; +} +``` + +### FulfillResult + +```solidity +enum FulfillResult { + USER_SUCCESS, + USER_ERROR, + INVALID_REQUEST_ID +} +``` + +### getRequestConfig + +```solidity +function getRequestConfig() external view returns (uint32, address[]) +``` + +Get configuration relevant for making requests + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32 | uint32 global max for request gas limit | +| [1] | address[] | address[] list of registered DONs | + +### getRequiredFee + +```solidity +function getRequiredFee(bytes data, struct FunctionsBillingRegistryInterface.RequestBilling billing) external view returns (uint96) +``` + +Determine the charged fee that will be paid to the Registry owner + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| billing | struct FunctionsBillingRegistryInterface.RequestBilling | The request's billing configuration | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint96 | fee Cost in Juels (1e18) of LINK | + +### estimateCost + +```solidity +function estimateCost(uint32 gasLimit, uint256 gasPrice, uint96 donFee, uint96 registryFee) external view returns (uint96) +``` + +Estimate the total cost to make a request: gas re-imbursement, plus DON fee, plus Registry fee + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| gasLimit | uint32 | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| gasPrice | uint256 | The request's billing configuration | +| donFee | uint96 | Fee charged by the DON that is paid to Oracle Node | +| registryFee | uint96 | Fee charged by the DON that is paid to Oracle Node | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint96 | costEstimate Cost in Juels (1e18) of LINK | + +### startBilling + +```solidity +function startBilling(bytes data, struct FunctionsBillingRegistryInterface.RequestBilling billing) external returns (bytes32) +``` + +Initiate the billing process for an Functions request + +_Only callable by a node that has been approved on the Registry_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| billing | struct FunctionsBillingRegistryInterface.RequestBilling | Billing configuration for the request | + +#### Return Values -Contract writers can inherit this contract in order to create Chainlink Functions requests +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes32 | requestId - A unique identifier of the request. Can be used to match a request to a response in fulfillRequest. | -### s_oracle +### fulfillAndBill ```solidity -contract FunctionsOracleInterface s_oracle +function fulfillAndBill(bytes32 requestId, bytes response, bytes err, address transmitter, address[31] signers, uint8 signerCount, uint256 reportValidationGas, uint256 initialGas) external returns (enum FunctionsBillingRegistryInterface.FulfillResult) ``` -### s_pendingRequests +Finalize billing process for an Functions request by sending a callback to the Client contract and then charging the subscription -```solidity -mapping(bytes32 => address) s_pendingRequests -``` +_Only callable by a node that has been approved on the Registry +simulated offchain to determine if sufficient balance is present to fulfill the request_ -### RequestSent +#### Parameters -```solidity -event RequestSent(bytes32 id) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | identifier for the request that was generated by the Registry in the beginBilling commitment | +| response | bytes | response data from DON consensus | +| err | bytes | error from DON consensus | +| transmitter | address | the Oracle who sent the report | +| signers | address[31] | the Oracles who had a part in generating the report | +| signerCount | uint8 | the number of signers on the report | +| reportValidationGas | uint256 | the amount of gas used for the report validation. Cost is split by all fulfillments on the report. | +| initialGas | uint256 | the initial amount of gas that should be used as a baseline to charge the single fulfillment for execution cost | -### RequestFulfilled +#### Return Values -```solidity -event RequestFulfilled(bytes32 id) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | enum FunctionsBillingRegistryInterface.FulfillResult | result fulfillment result | -### SenderIsNotRegistry +### getSubscriptionOwner ```solidity -error SenderIsNotRegistry() +function getSubscriptionOwner(uint64 subscriptionId) external view returns (address owner) ``` -### RequestIsAlreadyPending +Gets subscription owner. -```solidity -error RequestIsAlreadyPending() -``` +#### Parameters -### RequestIsNotPending +| Name | Type | Description | +| ---- | ---- | ----------- | +| subscriptionId | uint64 | - ID of the subscription | -```solidity -error RequestIsNotPending() -``` +#### Return Values -### constructor +| Name | Type | Description | +| ---- | ---- | ----------- | +| owner | address | - owner of the subscription. | -```solidity -constructor(address oracle) internal -``` +## FunctionsClientInterface ### getDONPublicKey @@ -1682,190 +1763,192 @@ needed to decrypt the secrets encrypted with the public key_ | ---- | ---- | ----------- | | [0] | bytes | publicKey DON's public key | -### estimateCost +### handleOracleFulfillment ```solidity -function estimateCost(struct Functions.Request req, uint64 subscriptionId, uint32 gasLimit, uint256 gasPrice) public view returns (uint96) +function handleOracleFulfillment(bytes32 requestId, bytes response, bytes err) external ``` -Estimate the total cost that will be charged to a subscription to make a request: gas re-imbursement, plus DON fee, plus Registry fee +Chainlink Functions response handler called by the designated transmitter node in an OCR round. #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| req | struct Functions.Request | The initialized Functions.Request | -| subscriptionId | uint64 | The subscription ID | -| gasLimit | uint32 | gas limit for the fulfillment callback | -| gasPrice | uint256 | | - -#### Return Values +| requestId | bytes32 | The requestId returned by FunctionsClient.sendRequest(). | +| response | bytes | Aggregated response from the user code. | +| err | bytes | Aggregated error either from the user code or from the execution pipeline. Either response or error parameter will be set, but never both. | -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint96 | billedCost Cost in Juels (1e18) of LINK | +## FunctionsOracleInterface -### sendRequest +### getRegistry ```solidity -function sendRequest(struct Functions.Request req, uint64 subscriptionId, uint32 gasLimit) internal returns (bytes32) +function getRegistry() external view returns (address) ``` -Sends a Chainlink Functions request to the stored oracle address - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| req | struct Functions.Request | The initialized Functions.Request | -| subscriptionId | uint64 | The subscription ID | -| gasLimit | uint32 | gas limit for the fulfillment callback | +Gets the stored billing registry address #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes32 | requestId The generated request ID | +| [0] | address | registryAddress The address of Chainlink Functions billing registry contract | -### fulfillRequest +### setRegistry ```solidity -function fulfillRequest(bytes32 requestId, bytes response, bytes err) internal virtual +function setRegistry(address registryAddress) external ``` -User defined function to handle a response +Sets the stored billing registry address #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| requestId | bytes32 | The request ID, returned by sendRequest() | -| response | bytes | Aggregated response from the user code | -| err | bytes | Aggregated error from the user code or from the execution pipeline Either response or error parameter will be set, but never both | +| registryAddress | address | The new address of Chainlink Functions billing registry contract | -### handleOracleFulfillment +### getDONPublicKey ```solidity -function handleOracleFulfillment(bytes32 requestId, bytes response, bytes err) external +function getDONPublicKey() external view returns (bytes) ``` -Chainlink Functions response handler called by the designated transmitter node in an OCR round. +Returns the DON's secp256k1 public key that is used to encrypt secrets -#### Parameters +_All nodes on the DON have the corresponding private key +needed to decrypt the secrets encrypted with the public key_ + +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| requestId | bytes32 | The requestId returned by FunctionsClient.sendRequest(). | -| response | bytes | Aggregated response from the user code. | -| err | bytes | Aggregated error either from the user code or from the execution pipeline. Either response or error parameter will be set, but never both. | +| [0] | bytes | publicKey the DON's public key | -### setOracle +### setDONPublicKey ```solidity -function setOracle(address oracle) internal +function setDONPublicKey(bytes donPublicKey) external ``` -Sets the stored Oracle address +Sets DON's secp256k1 public key used to encrypt secrets + +_Used to rotate the key_ #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| oracle | address | The address of Functions Oracle contract | +| donPublicKey | bytes | The new public key | -### getChainlinkOracleAddress +### setNodePublicKey ```solidity -function getChainlinkOracleAddress() internal view returns (address) +function setNodePublicKey(address node, bytes publicKey) external ``` -Gets the stored address of the oracle contract +Sets a per-node secp256k1 public key used to encrypt secrets for that node -#### Return Values +_Callable only by contract owner and DON members_ + +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | address | The address of the oracle contract | +| node | address | node's address | +| publicKey | bytes | node's public key | -### addExternalRequest +### deleteNodePublicKey ```solidity -function addExternalRequest(address oracleAddress, bytes32 requestId) internal +function deleteNodePublicKey(address node) external ``` -Allows for a request which was created on another contract to be fulfilled -on this contract +Deletes node's public key + +_Callable only by contract owner or the node itself_ #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| oracleAddress | address | The address of the oracle contract that will fulfill the request | -| requestId | bytes32 | The request ID used for the response | +| node | address | node's address | -### recordChainlinkFulfillment +### getAllNodePublicKeys ```solidity -modifier recordChainlinkFulfillment(bytes32 requestId) +function getAllNodePublicKeys() external view returns (address[], bytes[]) ``` -_Reverts if the sender is not the oracle that serviced the request. -Emits RequestFulfilled event._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The request ID for fulfillment | +Return two arrays of equal size containing DON members' addresses and their corresponding +public keys (or empty byte arrays if per-node key is not defined) -### notPendingRequest +### getRequiredFee ```solidity -modifier notPendingRequest(bytes32 requestId) +function getRequiredFee(bytes data, struct FunctionsBillingRegistryInterface.RequestBilling billing) external view returns (uint96) ``` -_Reverts if the request is already pending_ +Determine the fee charged by the DON that will be split between signing Node Operators for servicing the request #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| requestId | bytes32 | The request ID for fulfillment | +| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| billing | struct FunctionsBillingRegistryInterface.RequestBilling | The request's billing configuration | -## FunctionsClientInterface +#### Return Values -### getDONPublicKey +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint96 | fee Cost in Juels (1e18) of LINK | + +### estimateCost ```solidity -function getDONPublicKey() external view returns (bytes) +function estimateCost(uint64 subscriptionId, bytes data, uint32 gasLimit, uint256 gasPrice) external view returns (uint96) ``` -Returns the DON's secp256k1 public key used to encrypt secrets +Estimate the total cost that will be charged to a subscription to make a request: gas re-imbursement, plus DON fee, plus Registry fee -_All Oracles nodes have the corresponding private key -needed to decrypt the secrets encrypted with the public key_ +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | +| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| gasLimit | uint32 | Gas limit for the fulfillment callback | +| gasPrice | uint256 | | #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes | publicKey DON's public key | +| [0] | uint96 | billedCost Cost in Juels (1e18) of LINK | -### handleOracleFulfillment +### sendRequest ```solidity -function handleOracleFulfillment(bytes32 requestId, bytes response, bytes err) external +function sendRequest(uint64 subscriptionId, bytes data, uint32 gasLimit) external returns (bytes32) ``` -Chainlink Functions response handler called by the designated transmitter node in an OCR round. +Sends a request (encoded as data) using the provided subscriptionId #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| requestId | bytes32 | The requestId returned by FunctionsClient.sendRequest(). | -| response | bytes | Aggregated response from the user code. | -| err | bytes | Aggregated error either from the user code or from the execution pipeline. Either response or error parameter will be set, but never both. | +| subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | +| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| gasLimit | uint32 | Gas limit for the fulfillment callback | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes32 | requestId A unique request identifier (unique per DON) | ## IDepositContract @@ -2338,6 +2421,36 @@ function writeKVMap(struct CBOR.CBORBuffer buf, string key) internal pure function writeKVArray(struct CBOR.CBORBuffer buf, string key) internal pure ``` +## MockFunctionsOracle + +### constructor + +```solidity +constructor() public +``` + +### sendRequest + +```solidity +function sendRequest(uint64 subscriptionId, bytes data, uint32 gasLimit) external returns (bytes32 requestId) +``` + +Sends a request (encoded as data) using the provided subscriptionId + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | +| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| gasLimit | uint32 | Gas limit for the fulfillment callback | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | A unique request identifier (unique per DON) | + ## MockKeeperRegistry ### registerUpkeep diff --git a/contracts/ethereum/src/CasimirAutomation.sol b/contracts/ethereum/src/CasimirAutomation.sol index a83dfa6f2..059c7b842 100644 --- a/contracts/ethereum/src/CasimirAutomation.sol +++ b/contracts/ethereum/src/CasimirAutomation.sol @@ -163,7 +163,7 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { upkeepNeeded = true; } - performData = abi.encode(readyPoolIds); + performData = abi.encode(requiredWithdrawals, readyPoolIds); } /** @@ -173,7 +173,14 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { (bool upkeepNeeded, bytes memory performData) = checkUpkeep(""); require(upkeepNeeded, "Upkeep not needed"); - uint32[] memory readyPoolIds = abi.decode(performData, (uint32[])); // Is encode/decode more efficient than getting again? + (int256 requiredWithdrawals, uint32[] memory readyPoolIds) = abi.decode(performData, (int256, uint32[])); + + /** Initiate withdrawals and request exits */ + if (requiredWithdrawals > 0) { + // Todo this should bound withdrawals and request exits + manager.initiateRequestedWithdrawals(manager.getRequestedWithdrawalQueue().length); + manager.completePendingWithdrawals(manager.getPendingWithdrawalQueue().length); + } /** Initiate a bounded count of ready pools */ if (readyPoolIds.length > 0) { diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index 5b02daf0f..0ab486438 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -48,6 +48,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint256 private constant scaleFactor = 1 ether; /** Uniswap 0.3% fee tier */ uint24 private constant uniswapFeeTier = 3000; + /** Pool capacity */ + uint256 private constant poolCapacity = 32 ether; /*************/ /* Contracts */ @@ -95,15 +97,13 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { mapping(address => User) private users; /** All pools (open, ready, or staked) */ mapping(uint32 => Pool) private pools; - /** Total deposits in open pools */ + /** Total deposits not yet in pools */ uint256 private openDeposits; - /** IDs of pools open for deposits */ - uint32[] private openPoolIds; - /** IDs of pools ready for stake */ + /** IDs of pools ready for initiation */ uint32[] private readyPoolIds; - /** IDS of pools pending stake */ + /** IDS of pools pending deposit confirmation */ uint32[] private pendingPoolIds; - /** IDs of staking pools at full capacity */ + /** IDs of pools staked */ uint32[] private stakedPoolIds; /** All validators (ready or staked) */ mapping(bytes => Validator) private validators; @@ -193,8 +193,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Distribute stake to open pools */ distributeStake(processedAmount); - - emit StakeDistributed(msg.sender, processedAmount); } /** @@ -209,7 +207,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ); int256 change = int256(activeStake + sweptRewards) - - int256(latestActiveStake + pendingPoolIds.length * 32 ether); + int256(latestActiveStake + pendingPoolIds.length * poolCapacity); /** Update reward to stake ratio */ if (change > 0) { @@ -229,8 +227,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Distribute swept rewards */ distributeStake(sweptRewards); - - emit StakeDistributed(msg.sender, sweptRewards); } /** @@ -238,38 +234,29 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param amount The amount of stake to distribute */ function distributeStake(uint256 amount) private { + emit StakeDistributed(msg.sender, amount); + /** Distribute ETH to open pools */ while (amount > 0) { - /** Get the next open pool */ - uint32 poolId; - if (openPoolIds.length > 0) { - poolId = openPoolIds[0]; - } else { - lastPoolId++; - poolId = uint32(lastPoolId); - openPoolIds.push(poolId); - } - Pool storage pool; - pool = pools[poolId]; - uint256 remainingCapacity = 32 ether - pool.deposits; + uint256 remainingCapacity = poolCapacity - openDeposits; if (remainingCapacity > amount) { - /** Emit event before updating values */ - emit PoolIncreased(msg.sender, poolId, amount); - + /** Add remaining amount to open deposits */ openDeposits += amount; - pool.deposits += amount; amount = 0; } else { - /** Emit event before updating values */ - emit PoolIncreased(msg.sender, poolId, remainingCapacity); + /** Create new pool */ + lastPoolId++; + uint32 poolId = uint32(lastPoolId); + Pool storage pool; + pool = pools[poolId]; - openDeposits -= pool.deposits; - pool.deposits += remainingCapacity; + /** Move open deposits and remaining capacity to pool */ + openDeposits = 0; amount -= remainingCapacity; - - /** Move pool from open to ready state */ - openPoolIds.remove(0); + pool.deposits = poolCapacity; readyPoolIds.push(poolId); + + emit PoolFilled(msg.sender, poolId); } } } @@ -315,22 +302,34 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Get next requested withdrawal */ Withdrawal memory withdrawal = requestedWithdrawalQueue[0]; + /** Update user account state */ + users[withdrawal.user].rewardRatioSum0 = rewardRatioSum; + users[withdrawal.user].stake0 -= withdrawal.amount; + /** Update requested withdrawals state */ requestedWithdrawalQueue.remove(0); requestedWithdrawals -= withdrawal.amount; - /** Update requested withdrawals state */ - pendingWithdrawalQueue.push(withdrawal); - pendingWithdrawals += withdrawal.amount; + if (withdrawal.amount <= openDeposits) { + /** Withdraw amount from open deposits */ + openDeposits -= withdrawal.amount; - /** Update user account state */ - users[withdrawal.user].rewardRatioSum0 = rewardRatioSum; - users[withdrawal.user].stake0 -= withdrawal.amount; + withdrawal.user.send(withdrawal.amount); - emit WithdrawalInitiated( - withdrawal.user, - withdrawal.amount - ); + emit WithdrawalCompleted( + withdrawal.user, + withdrawal.amount + ); + } else { + /** Update requested withdrawals state */ + pendingWithdrawalQueue.push(withdrawal); + pendingWithdrawals += withdrawal.amount; + + emit WithdrawalInitiated( + withdrawal.user, + withdrawal.amount + ); + } } } @@ -742,7 +741,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function getBufferedStake() public view returns (uint256 bufferedStake) { bufferedStake = (readyPoolIds.length + pendingPoolIds.length) * - 32 ether + + poolCapacity + openDeposits; } @@ -804,6 +803,28 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { return pendingWithdrawals; } + /** + * @notice Get the requested withdrawal queue + * @return requestedWithdrawalQueue The requested withdrawal queue + */ + function getRequestedWithdrawalQueue() + external + view + returns (Withdrawal[] memory) { + return requestedWithdrawalQueue; + } + + /** + * @notice Get the pending withdrawal queue + * @return pendingWithdrawalQueue The pending withdrawal queue + */ + function getPendingWithdrawalQueue() + external + view + returns (Withdrawal[] memory) { + return pendingWithdrawalQueue; + } + /** * @notice Get ready validator public keys * @return A list of inactive validator public keys @@ -836,14 +857,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { return exitingValidatorCount; } - /** - * @notice Get a list of all open pool IDs - * @return A list of all open pool IDs - */ - function getOpenPoolIds() external view returns (uint32[] memory) { - return openPoolIds; - } - /** * @notice Get a list of all ready pool IDs * @return A list of all ready pool IDs diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index 57e374be3..95b949dc6 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -55,7 +55,7 @@ interface ICasimirManager { /* Events */ /**********/ - event PoolIncreased(address indexed sender, uint32 poolId, uint256 amount); + event PoolFilled(address indexed sender, uint32 poolId); event PoolInitiated(uint32 indexed poolId); event PoolCompleted(uint32 indexed poolId); event PoolExitRequested(uint32 indexed poolId); @@ -152,4 +152,7 @@ interface ICasimirManager { function getPendingWithdrawals() external view returns (uint256); + function getRequestedWithdrawalQueue() external view returns (Withdrawal[] memory); + + function getPendingWithdrawalQueue() external view returns (Withdrawal[] memory); } diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 53f7d8ce6..59988ba66 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -117,7 +117,7 @@ export async function firstUserDepositFixture() { const feePercent = fees.LINK + fees.SSV const depositAmount = stakeAmount * ((100 + feePercent) / 100) const value = ethers.utils.parseEther(depositAmount.toString()) - const deposit = await manager.connect(firstUser).deposit({ value }) + const deposit = await manager.connect(firstUser).depositStake({ value }) await deposit.wait() /** Perform upkeep */ @@ -145,7 +145,7 @@ export async function secondUserDepositFixture() { const feePercent = fees.LINK + fees.SSV const depositAmount = stakeAmount * ((100 + feePercent) / 100) const value = ethers.utils.parseEther(depositAmount.toString()) - const deposit = await manager.connect(secondUser).deposit({ value }) + const deposit = await manager.connect(secondUser).depositStake({ value }) await deposit.wait() /** Perform upkeep */ @@ -263,7 +263,7 @@ export async function thirdUserDepositFixture() { const feePercent = fees.LINK + fees.SSV const depositAmount = stakeAmount * ((100 + feePercent) / 100) const value = ethers.utils.parseEther(depositAmount.toString()) - const deposit = await manager.connect(thirdUser).deposit({ value }) + const deposit = await manager.connect(thirdUser).depositStake({ value }) await deposit.wait() /** Perform upkeep */ @@ -366,8 +366,17 @@ export async function sweepPostThirdUserDepositFixture() { export async function firstUserPartialWithdrawalFixture() { const { manager, automation, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(sweepPostThirdUserDepositFixture) const openDeposits = await manager?.getOpenDeposits() - const withdraw = await manager.connect(firstUser).withdraw(openDeposits) + const withdraw = await manager.connect(firstUser).requestWithdrawal(openDeposits) await withdraw.wait() + + /** Perform upkeep */ + const checkData = ethers.utils.toUtf8Bytes('') + const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) + const { upkeepNeeded, performData } = check + if (upkeepNeeded) { + const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) + await performUpkeep.wait() + } return { manager, automation, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser } } @@ -385,7 +394,7 @@ export async function fourthUserDepositFixture() { const feePercent = fees.LINK + fees.SSV const depositAmount = stakeAmount * ((100 + feePercent) / 100) const value = ethers.utils.parseEther(depositAmount.toString()) - const deposit = await manager.connect(fourthUser).deposit({ value }) + const deposit = await manager.connect(fourthUser).depositStake({ value }) await deposit.wait() /** Perform upkeep */ diff --git a/contracts/ethereum/test/integration.ts b/contracts/ethereum/test/integration.ts index 871acd607..893247237 100644 --- a/contracts/ethereum/test/integration.ts +++ b/contracts/ethereum/test/integration.ts @@ -13,19 +13,6 @@ describe('Casimir manager', async function () { expect(operators.length).equal(4 * validators.length) }) - it('First user\'s 16.0 stake opens the first pool with 16.0', async function () { - const { manager, owner } = await loadFixture(firstUserDepositFixture) - const ssvOwnerAddress = await manager.signer.getAddress() - expect(ssvOwnerAddress).equal(owner.address) - - const openPools = await manager.getOpenPoolIds() - expect(openPools.length).equal(1) - - const firstPoolId = openPools[0] - const pool = await manager.getPoolDetails(firstPoolId) - expect(ethers.utils.formatEther(pool.deposits)).equal('16.0') - }) - it('First user\'s 16.0 stake increases the total stake to 16.0', async function () { const { manager } = await loadFixture(firstUserDepositFixture) const stake = await manager.getStake() @@ -50,16 +37,6 @@ describe('Casimir manager', async function () { expect(pool.operatorIds.length).equal(4) }) - it('Second user\'s 24.0 stake opens a second pool with 8.0', async function () { - const { manager } = await loadFixture(secondUserDepositFixture) - const openPools = await manager.getOpenPoolIds() - expect(openPools.length).equal(1) - - const secondPoolId = openPools[0] - const pool = await manager.getPoolDetails(secondPoolId) - expect(ethers.utils.formatEther(pool.deposits)).equal('8.0') - }) - it('Second user\'s 24.0 stake increases the total stake to 40.0', async function () { const { manager } = await loadFixture(secondUserDepositFixture) const stake = await manager.getStake() @@ -72,12 +49,6 @@ describe('Casimir manager', async function () { expect(ethers.utils.formatEther(stake)).equal('24.0') }) - it('First pool is staked after the oracle request is fulfilled', async function () { - const { manager } = await loadFixture(secondUserDepositFixture) - const stakedPools = await manager.getStakedPoolIds() - expect(stakedPools.length).equal(1) - }) - it('First and second user\'s stake earns 0.1 in total after some time', async function () { const { manager } = await loadFixture(rewardPostSecondUserDepositFixture) const stake = await manager.getStake() @@ -110,12 +81,6 @@ describe('Casimir manager', async function () { expect(pool.operatorIds.length).equal(4) }) - it('Third user\'s 24.0 stake opens a third pool', async function () { - const { manager } = await loadFixture(thirdUserDepositFixture) - const openPools = await manager.getOpenPoolIds() - expect(openPools.length).equal(1) - }) - it('Third user\'s 24.0 stake increases the total stake to 64.1', async function () { const { manager } = await loadFixture(thirdUserDepositFixture) const stake = await manager.getStake() From af877a74656727b6a6dbc96b2ab56287da04d70c Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Sun, 30 Apr 2023 15:59:07 -0400 Subject: [PATCH 18/78] Extract upkeep and oracle test helpers --- contracts/ethereum/docs/index.md | 58 +++-- contracts/ethereum/scripts/dev.ts | 81 +++--- contracts/ethereum/test/fixtures/shared.ts | 242 +++++------------- contracts/ethereum/test/helpers/automation.ts | 31 +++ 4 files changed, 177 insertions(+), 235 deletions(-) create mode 100644 contracts/ethereum/test/helpers/automation.ts diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index d558acdf1..db549d156 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -558,6 +558,34 @@ Get the total pending withdrawals | ---- | ---- | ----------- | | [0] | uint256 | pendingWithdrawals The total pending withdrawals | +### getRequestedWithdrawalQueue + +```solidity +function getRequestedWithdrawalQueue() external view returns (struct ICasimirManager.Withdrawal[]) +``` + +Get the requested withdrawal queue + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | struct ICasimirManager.Withdrawal[] | requestedWithdrawalQueue The requested withdrawal queue | + +### getPendingWithdrawalQueue + +```solidity +function getPendingWithdrawalQueue() external view returns (struct ICasimirManager.Withdrawal[]) +``` + +Get the pending withdrawal queue + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | struct ICasimirManager.Withdrawal[] | pendingWithdrawalQueue The pending withdrawal queue | + ### getReadyValidatorPublicKeys ```solidity @@ -600,20 +628,6 @@ Get the count of exiting validators | ---- | ---- | ----------- | | [0] | uint256 | The count of exiting validators | -### getOpenPoolIds - -```solidity -function getOpenPoolIds() external view returns (uint32[]) -``` - -Get a list of all open pool IDs - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32[] | A list of all open pool IDs | - ### getReadyPoolIds ```solidity @@ -896,10 +910,10 @@ struct Validator { } ``` -### PoolIncreased +### PoolFilled ```solidity -event PoolIncreased(address sender, uint32 poolId, uint256 amount) +event PoolFilled(address sender, uint32 poolId) ``` ### PoolInitiated @@ -1148,6 +1162,18 @@ function getRequestedWithdrawals() external view returns (uint256) function getPendingWithdrawals() external view returns (uint256) ``` +### getRequestedWithdrawalQueue + +```solidity +function getRequestedWithdrawalQueue() external view returns (struct ICasimirManager.Withdrawal[]) +``` + +### getPendingWithdrawalQueue + +```solidity +function getPendingWithdrawalQueue() external view returns (struct ICasimirManager.Withdrawal[]) +``` + ## Types32Array ### remove diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index a4d557c9b..dc240c932 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -3,9 +3,10 @@ import { ContractConfig, DeploymentConfig, Validator } from '@casimir/types' import { validatorStore } from '@casimir/data' import { CasimirAutomation, CasimirManager, MockFunctionsOracle } from '../build/artifacts/types' import { ethers } from 'hardhat' +import { fulfillOracleAnswer, runUpkeep } from '../test/helpers/automation' void async function () { - let casimirManager: CasimirManager | undefined + let manager: CasimirManager | undefined let mockFunctionsOracle: MockFunctionsOracle | undefined const [, , , , , chainlink] = await ethers.getSigners() let config: DeploymentConfig = { @@ -60,12 +61,15 @@ void async function () { (config[name as keyof DeploymentConfig] as ContractConfig).address = address // Save SSV manager for export - if (name == 'CasimirManager') casimirManager = contract as CasimirManager + if (name == 'CasimirManager') manager = contract as CasimirManager // Save mock functions oracle for export if (name == 'MockFunctionsOracle') mockFunctionsOracle = contract as MockFunctionsOracle } + const automationAddress = await manager?.getAutomationAddress() as string + const automation = await ethers.getContractAt('CasimirAutomation', automationAddress) as CasimirAutomation + const validators = Object.keys(validatorStore).map((key) => validatorStore[key]) as Validator[] for (const validator of validators) { const { @@ -77,7 +81,7 @@ void async function () { signature, withdrawalCredentials } = validator - const registration = await casimirManager?.registerValidator( + const registration = await manager?.registerValidator( depositDataRoot, publicKey, operatorIds, @@ -89,9 +93,6 @@ void async function () { await registration?.wait() } - const automationAddress = await casimirManager?.getAutomationAddress() as string - const casimirAutomation = await ethers.getContractAt('CasimirAutomation', automationAddress) as CasimirAutomation - /** Distribute rewards every ${blocksPerReward} blocks */ const blocksPerReward = 10 @@ -102,39 +103,51 @@ void async function () { ethers.provider.on('block', async (block) => { if (block - blocksPerReward === lastRewardBlock) { lastRewardBlock = block - const activeValidatorPublicKeys = await casimirManager?.getStakedValidatorPublicKeys() - if (activeValidatorPublicKeys?.length) { - console.log(`Distributing rewards from ${activeValidatorPublicKeys.length} active validators...`) - const rewardAmount = (rewardPerValidator * activeValidatorPublicKeys.length).toString() - const reward = await chainlink.sendTransaction({ to: casimirManager?.address, value: ethers.utils.parseEther(rewardAmount) }) - await reward.wait() - - /** Perform upkeep (todo add bounds to check data) */ - const checkData = ethers.utils.defaultAbiCoder.encode(['string'], ['']) - const { ...check } = await casimirAutomation.connect(chainlink).checkUpkeep(checkData) - const { upkeepNeeded, performData } = check - if (upkeepNeeded) { - const performUpkeep = await casimirAutomation.performUpkeep(performData) - await performUpkeep.wait() + const stakedValidatorPublicKeys = await manager?.getStakedValidatorPublicKeys() + if (stakedValidatorPublicKeys?.length) { + + const rewardAmount = (rewardPerValidator * stakedValidatorPublicKeys.length).toString() + + // const nextActiveStakeAmount = ethers.utils.formatEther(await manager?.getActiveStake() as ) + parseFloat(rewardAmount) + // const nextSweptRewardsAmount = 0.2 + // const nextSweptExitsAmount = 0 + + /** Perform upkeep */ + const ranUpkeepBefore = await runUpkeep(automation, chainlink) + + /** Fulfill oracle answer */ + if (ranUpkeepBefore) { + // await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) } + + /** Sweep rewards before next upkeep (balance will increment silently) */ + // const sweep = await chainlink.sendTransaction({ to: manager?.address, value: ethers.utils.parseEther(nextSweptRewardsAmount.toString()) }) + // await sweep.wait() + + /** Perform upkeep */ + const ranUpkeepAfter = await runUpkeep(automation, chainlink) + + /** Fulfill oracle answer */ + if (ranUpkeepAfter) { + // await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) + } + } } }) - - /** Increase PoR mock aggregator answer after each pool is staked */ - casimirManager?.on('PoolStaked(uint32)', async () => { - - /** Perform upkeep (todo add bounds to check data) */ - const checkData = ethers.utils.defaultAbiCoder.encode(['string'], ['']) - const { ...check } = await casimirAutomation.connect(chainlink).checkUpkeep(checkData) - const { upkeepNeeded, performData } = check - if (upkeepNeeded) { - const performUpkeep = await casimirAutomation.connect(chainlink).performUpkeep(performData) - await performUpkeep.wait() - } - if (mockFunctionsOracle) { - // + /** Perform upkeep and fulfill oracle answer after each pool is staked */ + manager?.on('PoolStaked(uint32)', async () => { + + /** Perform upkeep */ + const ranUpkeep = await runUpkeep(automation, chainlink) + + /** Fulfill oracle answer */ + if (ranUpkeep) { + // const nextActiveStakeAmount = + // const nextSweptRewardsAmount = + // const nextSweptExitsAmount = + // await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) } }) }() \ No newline at end of file diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 59988ba66..928381d10 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -2,6 +2,7 @@ import { ethers } from 'hardhat' import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' import { deployContract } from '@casimir/hardhat' import { CasimirManager, CasimirAutomation, MockFunctionsOracle } from '../../build/artifacts/types' +import { fulfillOracleAnswer, runUpkeep } from '../helpers/automation' import { ContractConfig, DeploymentConfig, Validator } from '@casimir/types' import { validatorStore } from '@casimir/data' @@ -120,14 +121,9 @@ export async function firstUserDepositFixture() { const deposit = await manager.connect(firstUser).depositStake({ value }) await deposit.wait() - /** Perform upkeep */ - const checkData = ethers.utils.toUtf8Bytes('') - const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) - const { upkeepNeeded, performData } = check - if (upkeepNeeded) { - const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) - await performUpkeep.wait() - } + /** Run upkeep */ + await runUpkeep(automation, chainlink) + return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser } } @@ -148,30 +144,14 @@ export async function secondUserDepositFixture() { const deposit = await manager.connect(secondUser).depositStake({ value }) await deposit.wait() - /** Perform upkeep */ - const checkData = ethers.utils.toUtf8Bytes('') - const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) - const { upkeepNeeded, performData } = check - if (upkeepNeeded) { - const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) - await performUpkeep.wait() - } + /** Run upkeep */ + const ranUpkeep = await runUpkeep(automation, chainlink) /** Fulfill oracle answer */ - if (mockFunctionsOracle) { - const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) - const responseBytes = ethers.utils.defaultAbiCoder.encode( - ['uint256', 'uint256', 'uint256'], - [ - ethers.utils.parseEther(nextActiveStakeAmount.toString()), - ethers.utils.parseEther(nextSweptRewardsAmount.toString()), - ethers.utils.parseEther(nextSweptExitsAmount.toString()) - ] - ) - const errorBytes = ethers.utils.toUtf8Bytes('') - const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) - await mockFulfillRequest.wait() + if (ranUpkeep) { + await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) } + return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } } @@ -184,30 +164,14 @@ export async function rewardPostSecondUserDepositFixture() { const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 - /** Perform upkeep */ - const checkData = ethers.utils.toUtf8Bytes('') - const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) - const { upkeepNeeded, performData } = check - if (upkeepNeeded) { - const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) - await performUpkeep.wait() - } + /** Run upkeep */ + const ranUpkeep = await runUpkeep(automation, chainlink) - /** Fulfill mock Functions oracle answer */ - if (mockFunctionsOracle) { - const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) - const responseBytes = ethers.utils.defaultAbiCoder.encode( - ['uint256', 'uint256', 'uint256'], - [ - ethers.utils.parseEther(nextActiveStakeAmount.toString()), - ethers.utils.parseEther(nextSweptRewardsAmount.toString()), - ethers.utils.parseEther(nextSweptExitsAmount.toString()) - ] - ) - const errorBytes = ethers.utils.toUtf8Bytes('') - const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) - await mockFulfillRequest.wait() + /** Fulfill oracle answer */ + if (ranUpkeep) { + await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) } + return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } } @@ -222,30 +186,14 @@ export async function sweepPostSecondUserDepositFixture() { const sweep = await chainlink.sendTransaction({ to: manager?.address, value: ethers.utils.parseEther('0.1') }) await sweep.wait() - /** Perform upkeep */ - const checkData = ethers.utils.toUtf8Bytes('') - const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) - const { upkeepNeeded, performData } = check - if (upkeepNeeded) { - const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) - await performUpkeep.wait() - } + /** Run upkeep */ + const ranUpkeep = await runUpkeep(automation, chainlink) /** Fulfill oracle answer */ - if (mockFunctionsOracle) { - const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) - const responseBytes = ethers.utils.defaultAbiCoder.encode( - ['uint256', 'uint256', 'uint256'], - [ - ethers.utils.parseEther(nextActiveStakeAmount.toString()), - ethers.utils.parseEther(nextSweptRewardsAmount.toString()), - ethers.utils.parseEther(nextSweptExitsAmount.toString()) - ] - ) - const errorBytes = ethers.utils.toUtf8Bytes('') - const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) - await mockFulfillRequest.wait() + if (ranUpkeep) { + await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) } + return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } } @@ -266,28 +214,14 @@ export async function thirdUserDepositFixture() { const deposit = await manager.connect(thirdUser).depositStake({ value }) await deposit.wait() - /** Perform upkeep */ - const checkData = ethers.utils.toUtf8Bytes('') - const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) - const { upkeepNeeded, performData } = check - if (upkeepNeeded) { - const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) - await performUpkeep.wait() - - /** Fulfill oracle answer */ - const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) - const responseBytes = ethers.utils.defaultAbiCoder.encode( - ['uint256', 'uint256', 'uint256'], - [ - ethers.utils.parseEther(nextActiveStakeAmount.toString()), - ethers.utils.parseEther(nextSweptRewardsAmount.toString()), - ethers.utils.parseEther(nextSweptExitsAmount.toString()) - ] - ) - const errorBytes = ethers.utils.toUtf8Bytes('') - const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) - await mockFulfillRequest.wait() + /** Run upkeep */ + const ranUpkeep = await runUpkeep(automation, chainlink) + + /** Fulfill oracle answer */ + if (ranUpkeep) { + await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) } + return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } } @@ -300,28 +234,14 @@ export async function rewardPostThirdUserDepositFixture() { const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 - /** Perform upkeep */ - const checkData = ethers.utils.toUtf8Bytes('') - const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) - const { upkeepNeeded, performData } = check - if (upkeepNeeded) { - const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) - await performUpkeep.wait() - - /** Fulfill oracle answer */ - const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) - const responseBytes = ethers.utils.defaultAbiCoder.encode( - ['uint256', 'uint256', 'uint256'], - [ - ethers.utils.parseEther(nextActiveStakeAmount.toString()), - ethers.utils.parseEther(nextSweptRewardsAmount.toString()), - ethers.utils.parseEther(nextSweptExitsAmount.toString()) - ] - ) - const errorBytes = ethers.utils.toUtf8Bytes('') - const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) - await mockFulfillRequest.wait() + /** Run upkeep */ + const ranUpkeep = await runUpkeep(automation, chainlink) + + /** Fulfill oracle answer */ + if (ranUpkeep) { + await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) } + return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } } @@ -337,28 +257,14 @@ export async function sweepPostThirdUserDepositFixture() { const sweep = await chainlink.sendTransaction({ to: manager?.address, value: ethers.utils.parseEther(nextSweptRewardsAmount.toString()) }) await sweep.wait() - /** Perform upkeep */ - const checkData = ethers.utils.toUtf8Bytes('') - const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) - const { upkeepNeeded, performData } = check - if (upkeepNeeded) { - const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) - await performUpkeep.wait() - - /** Fulfill oracle answer */ - const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) - const responseBytes = ethers.utils.defaultAbiCoder.encode( - ['uint256', 'uint256', 'uint256'], - [ - ethers.utils.parseEther(nextActiveStakeAmount.toString()), - ethers.utils.parseEther(nextSweptRewardsAmount.toString()), - ethers.utils.parseEther(nextSweptExitsAmount.toString()) - ] - ) - const errorBytes = ethers.utils.toUtf8Bytes('') - const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) - await mockFulfillRequest.wait() + /** Run upkeep */ + const ranUpkeep = await runUpkeep(automation, chainlink) + + /** Fulfill oracle answer */ + if (ranUpkeep) { + await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) } + return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } } @@ -369,14 +275,9 @@ export async function firstUserPartialWithdrawalFixture() { const withdraw = await manager.connect(firstUser).requestWithdrawal(openDeposits) await withdraw.wait() - /** Perform upkeep */ - const checkData = ethers.utils.toUtf8Bytes('') - const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) - const { upkeepNeeded, performData } = check - if (upkeepNeeded) { - const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) - await performUpkeep.wait() - } + /** Run upkeep */ + await runUpkeep(automation, chainlink) + return { manager, automation, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser } } @@ -397,28 +298,14 @@ export async function fourthUserDepositFixture() { const deposit = await manager.connect(fourthUser).depositStake({ value }) await deposit.wait() - /** Perform upkeep */ - const checkData = ethers.utils.toUtf8Bytes('') - const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) - const { upkeepNeeded, performData } = check - if (upkeepNeeded) { - const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) - await performUpkeep.wait() - - /** Fulfill oracle answer */ - const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) - const responseBytes = ethers.utils.defaultAbiCoder.encode( - ['uint256', 'uint256', 'uint256'], - [ - ethers.utils.parseEther(nextActiveStakeAmount.toString()), - ethers.utils.parseEther(nextSweptRewardsAmount.toString()), - ethers.utils.parseEther(nextSweptExitsAmount.toString()) - ] - ) - const errorBytes = ethers.utils.toUtf8Bytes('') - const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) - await mockFulfillRequest.wait() + /** Run upkeep */ + const ranUpkeep = await runUpkeep(automation, chainlink) + + /** Fulfill oracle answer */ + if (ranUpkeep) { + await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) } + return { manager, automation, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser, fourthUser } } @@ -436,27 +323,12 @@ export async function simulationFixture() { const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 - /** Perform upkeep */ - const checkData = ethers.utils.toUtf8Bytes('') - const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) - const { upkeepNeeded, performData } = check - if (upkeepNeeded) { - const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) - await performUpkeep.wait() - - /** Fulfill oracle answer */ - const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) - const responseBytes = ethers.utils.defaultAbiCoder.encode( - ['uint256', 'uint256', 'uint256'], - [ - ethers.utils.parseEther(nextActiveStakeAmount.toString()), - ethers.utils.parseEther(nextSweptRewardsAmount.toString()), - ethers.utils.parseEther(nextSweptExitsAmount.toString()) - ] - ) - const errorBytes = ethers.utils.toUtf8Bytes('') - const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) - await mockFulfillRequest.wait() + /** Run upkeep */ + const ranUpkeep = await runUpkeep(automation, chainlink) + + /** Fulfill oracle answer */ + if (ranUpkeep) { + await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) } } } diff --git a/contracts/ethereum/test/helpers/automation.ts b/contracts/ethereum/test/helpers/automation.ts new file mode 100644 index 000000000..d04f80b46 --- /dev/null +++ b/contracts/ethereum/test/helpers/automation.ts @@ -0,0 +1,31 @@ +import { ethers } from 'hardhat' +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' +import { CasimirManager, CasimirAutomation, MockFunctionsOracle } from '../../build/artifacts/types' + +export async function runUpkeep(automation: CasimirAutomation, chainlink: SignerWithAddress) { + let ranUpkeep = false + const checkData = ethers.utils.toUtf8Bytes('') + const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) + const { upkeepNeeded, performData } = check + if (upkeepNeeded) { + const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) + await performUpkeep.wait() + ranUpkeep = true + } + return ranUpkeep +} + +export async function fulfillOracleAnswer(automation: CasimirAutomation, chainlink: SignerWithAddress, nextActiveStakeAmount: number, nextSweptRewardsAmount: number, nextSweptExitsAmount: number) { + const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) + const responseBytes = ethers.utils.defaultAbiCoder.encode( + ['uint256', 'uint256', 'uint256'], + [ + ethers.utils.parseEther(nextActiveStakeAmount.toString()), + ethers.utils.parseEther(nextSweptRewardsAmount.toString()), + ethers.utils.parseEther(nextSweptExitsAmount.toString()) + ] + ) + const errorBytes = ethers.utils.toUtf8Bytes('') + const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) + await mockFulfillRequest.wait() +} \ No newline at end of file From 510d2800b29be55115440fea90c56a32a78711be Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Tue, 2 May 2023 18:16:38 -0400 Subject: [PATCH 19/78] Save state in mock functions oracle --- contracts/ethereum/src/CasimirAutomation.sol | 16 +++-- .../ethereum/src/mock/MockFunctionsOracle.sol | 31 +++++--- package-lock.json | 1 + services/keys/package.json | 1 + services/keys/src/index.ts | 25 +------ services/keys/src/providers/cli.ts | 70 ------------------- 6 files changed, 38 insertions(+), 106 deletions(-) delete mode 100644 services/keys/src/providers/cli.ts diff --git a/contracts/ethereum/src/CasimirAutomation.sol b/contracts/ethereum/src/CasimirAutomation.sol index 059c7b842..f70cbcc60 100644 --- a/contracts/ethereum/src/CasimirAutomation.sol +++ b/contracts/ethereum/src/CasimirAutomation.sol @@ -59,6 +59,8 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { bytes public requestCBOR; /** Latest oracle request ID */ bytes32 public latestRequestId; + /** Latest fulfilled oracle request ID */ + bytes32 public latestFulfilledRequestId; /** Latest oracle response */ bytes private latestResponse; /** Latest oracle response timestamp */ @@ -163,6 +165,11 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { upkeepNeeded = true; } + // /** Check if last request has been fulfilled */ + // if (latestRequestId != latestFulfilledRequestId) { + // upkeepNeeded = false; + // } + performData = abi.encode(requiredWithdrawals, readyPoolIds); } @@ -188,11 +195,11 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { } /** Request a report */ - // bytes32 requestId = s_oracle.sendRequest(oracleSubId, requestCBOR, fulfillGasLimit); - // s_pendingRequests[requestId] = s_oracle.getRegistry(); - // latestRequestId = requestId; + bytes32 requestId = s_oracle.sendRequest(oracleSubId, requestCBOR, fulfillGasLimit); + s_pendingRequests[requestId] = s_oracle.getRegistry(); + latestRequestId = requestId; - // emit RequestSent(requestId); + emit RequestSent(requestId); } /** @@ -207,6 +214,7 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { bytes memory response, bytes memory err ) internal override { + latestFulfilledRequestId = requestId; latestResponseTimestamp = block.timestamp; latestResponse = response; latestError = err; diff --git a/contracts/ethereum/src/mock/MockFunctionsOracle.sol b/contracts/ethereum/src/mock/MockFunctionsOracle.sol index a631f634b..690e80a72 100644 --- a/contracts/ethereum/src/mock/MockFunctionsOracle.sol +++ b/contracts/ethereum/src/mock/MockFunctionsOracle.sol @@ -9,24 +9,39 @@ import "hardhat/console.sol"; */ contract MockFunctionsOracle { - uint256 private latestRequestIdNumber; + uint256 private latestRequestIdNumber = 1; + uint64 private subscriptionId; + bytes private data; + uint32 private gasLimit; constructor() {} + /** + * @notice Returns the address of the registry contract + * @return address The address of the registry contract + */ + function getRegistry() external view returns (address) { + return address(this); // Just returning oracle address instead for mock + } + /** * @notice Sends a request (encoded as data) using the provided subscriptionId - * @param subscriptionId A unique subscription ID allocated by billing system, + * @param _subscriptionId A unique subscription ID allocated by billing system, * a client can make requests from different contracts referencing the same subscription - * @param data Encoded Chainlink Functions request data, use FunctionsClient API to encode a request - * @param gasLimit Gas limit for the fulfillment callback + * @param _data Encoded Chainlink Functions request data, use FunctionsClient API to encode a request + * @param _gasLimit Gas limit for the fulfillment callback * @return requestId A unique request identifier (unique per DON) */ function sendRequest( - uint64 subscriptionId, - bytes calldata data, - uint32 gasLimit + uint64 _subscriptionId, + bytes calldata _data, + uint32 _gasLimit ) external returns (bytes32 requestId) { - latestRequestIdNumber += 1; + + subscriptionId = _subscriptionId; + data = _data; + gasLimit = _gasLimit; + requestId = keccak256(abi.encode(latestRequestIdNumber)); } } diff --git a/package-lock.json b/package-lock.json index 7ef4ea0cf..e57683f73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27399,6 +27399,7 @@ "services/keys": { "name": "@casimir/keys", "dependencies": { + "ethers": "^5.7.2", "minimist": "^1.2.7" }, "devDependencies": { diff --git a/services/keys/package.json b/services/keys/package.json index e99cb4243..4d25367ba 100644 --- a/services/keys/package.json +++ b/services/keys/package.json @@ -8,6 +8,7 @@ "test": "jest --config jest.config.js" }, "dependencies": { + "ethers": "^5.7.2", "minimist": "^1.2.7" }, "devDependencies": { diff --git a/services/keys/src/index.ts b/services/keys/src/index.ts index 89800aa4c..65c69a204 100644 --- a/services/keys/src/index.ts +++ b/services/keys/src/index.ts @@ -1,29 +1,6 @@ -import fs from 'fs' -import path from 'path' -import url from 'url' -import { CLI } from './providers/cli' import { SSV } from './providers/ssv' import { Validator } from '@casimir/types' import { CreateValidatorOptions } from './interfaces/CreateValidatorOptions' import { ReshareValidatorOptions } from './interfaces/ReshareValidatorOptions' -export { SSV, Validator, CreateValidatorOptions, ReshareValidatorOptions } - -/** - * Check if module is run directly - */ -(async function isCLI() { - const nodePath = path.resolve(process.argv[1]) - const modulePath = path.resolve(url.pathToFileURL(__filename).toString()).split(':')[1] - if (nodePath === modulePath) { - const cli = new CLI() - const response = await cli.run() - const { validator } = response - - if (validator && fs.existsSync(path.resolve(__dirname, './data/validator_store.json'))) { - const validatorStore: Record = JSON.parse(fs.readFileSync(path.resolve(__dirname, './data/validator_store.json')).toString()) - validatorStore[Date.now()] = validator - fs.writeFileSync(path.resolve(__dirname, './data/validator_store.json'), JSON.stringify(validatorStore, null, 2)) - } - } -})() \ No newline at end of file +export { SSV, Validator, CreateValidatorOptions, ReshareValidatorOptions } \ No newline at end of file diff --git a/services/keys/src/providers/cli.ts b/services/keys/src/providers/cli.ts deleted file mode 100644 index 8a8746983..000000000 --- a/services/keys/src/providers/cli.ts +++ /dev/null @@ -1,70 +0,0 @@ -import minimist from 'minimist' -import { CommandArgs } from '../interfaces/CommandArgs' -import { camelCase } from '@casimir/helpers' -import { SSV } from './ssv' -import { CLIOutput } from '../interfaces/CLIOutput' - - -export class CLI { - async run() { - const { command, args } = this.getCommandArgs() - - if (!command || !Object.keys(this.commands).includes(command)) { - throw new Error('No valid command provided') - } - - return await this.commands[command](args) as CLIOutput - } - - commands = { - createValidator: async (args: CommandArgs) => { - const { dkgServiceUrl, operatorIds, withdrawalAddress } = args - - const ssv = new SSV({ dkgServiceUrl }) - - const validator = await ssv.createValidator({ operatorIds, withdrawalAddress }) - - return { status: 200, validator } - }, - reshareValidator: async (args: CommandArgs) => { - const { dkgServiceUrl, operatorIds, validatorPublicKey, oldOperatorIds } = args - - const ssv = new SSV({ dkgServiceUrl }) - - const validator = await ssv.reshareValidator({ operatorIds, validatorPublicKey, oldOperatorIds }) - - return { status: 200, validator } - }, - help: () => { - console.log('@casimir/keys') - console.log('Usage: keys [options]') - console.log('Commands:\n') - console.log('\tcreate-validator') - console.log('\t --dkgServiceUrl') - console.log('\t --operatorIds') - console.log('\t --withdrawalAddress\n') - console.log('\reshare-validator') - console.log('\t --dkgServiceUrl') - console.log('\t --operatorIds') - console.log('\t --validatorPublicKey') - console.log('\t --oldOperatorIds\n') - console.log('\thelp\n') - - return { status: 200 } - } - } - - getCommandArgs() { - const argv = minimist(process.argv.slice(2)) - const command = camelCase(argv._[0]) as keyof CLI['commands'] - - const dkgServiceUrl = argv?.dkgServiceUrl || process.env.DKG_SERVICE_URL || 'http://0.0.0.0:8000' - const operatorIds = argv?.operatorIds?.split(',').map((id: string) => parseInt(id)) || process.env.OPERATOR_IDS?.split(',').map(id => parseInt(id)) || [1, 2, 3, 4] - const validatorPublicKey = argv?.validatorPublicKey || process.env.VALIDATOR_PUBLIC_KEY || '0x07e05700cb4e946ba50244e27f01805354cd8ef0' - const withdrawalAddress = argv?.withdrawalAddress || process.env.WITHDRAWAL_ADDRESS || '0x07e05700cb4e946ba50244e27f01805354cd8ef0' - const oldOperatorIds = argv?.oldOperatorIds?.split(',').map((id: string) => parseInt(id)) || process.env.OLD_OPERATOR_IDS?.split(',').map(id => parseInt(id)) || [2, 3, 4] - - const args = { dkgServiceUrl, operatorIds, validatorPublicKey, withdrawalAddress, oldOperatorIds } - return { command, args } - } -} \ No newline at end of file From 46207bde51bdd8cdb7b0e2a00c1a9b768d0d3290 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Thu, 4 May 2023 16:09:14 -0400 Subject: [PATCH 20/78] Pack validator report values --- apps/web/src/composables/ssv.ts | 37 ++- apps/web/src/composables/users.ts | 8 +- common/hardhat/.gitignore | 2 - common/hardhat/hardhat.config.ts | 8 - common/hardhat/package.json | 18 -- common/hardhat/tsconfig.json | 27 -- contracts/ethereum/README.md | 6 +- contracts/ethereum/docs/index.md | 4 +- .../ethereum/helpers/deploy.ts | 2 +- contracts/ethereum/helpers/upkeep.ts | 59 ++++ contracts/ethereum/package.json | 2 +- contracts/ethereum/scripts/dev.ts | 80 +++-- contracts/ethereum/src/CasimirManager.sol | 58 ++-- ...asimirAutomation.sol => CasimirUpkeep.sol} | 32 +- .../src/interfaces/ICasimirManager.sol | 24 +- ...simirAutomation.sol => ICasimirUpkeep.sol} | 3 +- .../ethereum/src/mock/MockFunctionsOracle.sol | 3 +- .../ethereum/src/mock/MockKeeperRegistry.sol | 33 -- contracts/ethereum/src/vendor/Functions.sol | 145 --------- .../ethereum/src/vendor/FunctionsClient.sol | 155 ---------- .../FunctionsSandboxLibrary/Functions.js | 0 .../vendor}/FunctionsSandboxLibrary/Log.js | 0 .../FunctionsSandboxLibrary/Sandbox.js | 0 .../FunctionsSandboxLibrary/Validator.js | 0 .../FunctionsSandboxLibrary/buildRequest.js | 0 .../FunctionsSandboxLibrary/encryptSecrets.js | 0 .../getRequestConfig.js | 0 .../FunctionsSandboxLibrary/handler.js | 0 .../vendor}/FunctionsSandboxLibrary/index.js | 0 .../simulateRequest.js | 0 .../FunctionsBillingRegistryInterface.sol | 107 ------- .../interfaces/FunctionsClientInterface.sol | 28 -- .../interfaces/FunctionsOracleInterface.sol | 100 ------ .../src/vendor/interfaces/IKeeperRegistry.sol | 202 ------------ .../ethereum/src/vendor/libraries/Buffer.sol | 287 ------------------ .../ethereum/src/vendor/libraries/CBOR.sol | 274 ----------------- contracts/ethereum/test/fixtures/shared.ts | 129 ++++---- contracts/ethereum/test/helpers/automation.ts | 31 -- contracts/ethereum/tsconfig.json | 5 +- package-lock.json | 68 ++--- scripts/ethereum/dev.ts | 23 ++ scripts/local/dev.ts | 6 +- services/keys/package.json | 5 +- services/keys/scripts/dev.ts | 4 + 44 files changed, 324 insertions(+), 1651 deletions(-) delete mode 100644 common/hardhat/.gitignore delete mode 100644 common/hardhat/hardhat.config.ts delete mode 100644 common/hardhat/package.json delete mode 100644 common/hardhat/tsconfig.json rename common/hardhat/src/index.ts => contracts/ethereum/helpers/deploy.ts (96%) create mode 100644 contracts/ethereum/helpers/upkeep.ts rename contracts/ethereum/src/{CasimirAutomation.sol => CasimirUpkeep.sol} (89%) rename contracts/ethereum/src/interfaces/{ICasimirAutomation.sol => ICasimirUpkeep.sol} (90%) delete mode 100644 contracts/ethereum/src/mock/MockKeeperRegistry.sol delete mode 100644 contracts/ethereum/src/vendor/Functions.sol delete mode 100644 contracts/ethereum/src/vendor/FunctionsClient.sol rename contracts/ethereum/{functions => src/vendor}/FunctionsSandboxLibrary/Functions.js (100%) rename contracts/ethereum/{functions => src/vendor}/FunctionsSandboxLibrary/Log.js (100%) rename contracts/ethereum/{functions => src/vendor}/FunctionsSandboxLibrary/Sandbox.js (100%) rename contracts/ethereum/{functions => src/vendor}/FunctionsSandboxLibrary/Validator.js (100%) rename contracts/ethereum/{functions => src/vendor}/FunctionsSandboxLibrary/buildRequest.js (100%) rename contracts/ethereum/{functions => src/vendor}/FunctionsSandboxLibrary/encryptSecrets.js (100%) rename contracts/ethereum/{functions => src/vendor}/FunctionsSandboxLibrary/getRequestConfig.js (100%) rename contracts/ethereum/{functions => src/vendor}/FunctionsSandboxLibrary/handler.js (100%) rename contracts/ethereum/{functions => src/vendor}/FunctionsSandboxLibrary/index.js (100%) rename contracts/ethereum/{functions => src/vendor}/FunctionsSandboxLibrary/simulateRequest.js (100%) delete mode 100644 contracts/ethereum/src/vendor/interfaces/FunctionsBillingRegistryInterface.sol delete mode 100644 contracts/ethereum/src/vendor/interfaces/FunctionsClientInterface.sol delete mode 100644 contracts/ethereum/src/vendor/interfaces/FunctionsOracleInterface.sol delete mode 100644 contracts/ethereum/src/vendor/interfaces/IKeeperRegistry.sol delete mode 100644 contracts/ethereum/src/vendor/libraries/Buffer.sol delete mode 100644 contracts/ethereum/src/vendor/libraries/CBOR.sol delete mode 100644 contracts/ethereum/test/helpers/automation.ts diff --git a/apps/web/src/composables/ssv.ts b/apps/web/src/composables/ssv.ts index 5f67a3258..358c20ae9 100644 --- a/apps/web/src/composables/ssv.ts +++ b/apps/web/src/composables/ssv.ts @@ -11,7 +11,7 @@ import { Account, Pool, ProviderString } from '@casimir/types' import { ReadyOrStakeString } from '../interfaces' /** Manager contract */ -let casimirManager: CasimirManager +let manager: CasimirManager export default function useSSV() { const { ethereumURL } = useEnvironment() @@ -20,12 +20,12 @@ export default function useSSV() { const { getEthersTrezorSigner } = useTrezor() const { isWalletConnectSigner, getEthersWalletConnectSigner } = useWalletConnect() - if (!casimirManager) { - casimirManager = (() => { - const address = import.meta.env.PUBLIC_CASIMIR_MANAGER + if (!manager) { + manager = (() => { + const address = import.meta.env.PUBLIC_MANAGER_ADDRESS if (!address) console.log( ` - The PUBLIC_CASIMIR_MANAGER environment variable is empty.\n + The PUBLIC_MANAGER_ADDRESS environment variable is empty.\n If you are on mainnet or testnet, the contract does not exist yet.\n If you are on the local network, check your terminal logs for a contract address or errors. ` @@ -45,20 +45,19 @@ export default function useSSV() { const signerCreator = signerCreators[signerType as keyof typeof signerCreators] let signer = signerCreator(walletProvider) if (isWalletConnectSigner(signer)) signer = await signer - const casimirManagerSigner = casimirManager.connect(signer as ethers.Signer) - const fees = await casimirManagerSigner.getFees() + const managerSigner = manager.connect(signer as ethers.Signer) + const fees = await managerSigner.getFees() const { LINK, SSV } = fees const feesTotalPercent = LINK + SSV const depositAmount = parseFloat(amount) * ((100 + feesTotalPercent) / 100) const value = ethers.utils.parseEther(depositAmount.toString()) - const result = await casimirManagerSigner.deposit({ value, type: 0 }) + const result = await managerSigner.depositStake({ value, type: 0 }) return await result.wait() } async function getDepositFees() { const provider = new ethers.providers.JsonRpcProvider(ethereumURL) - const casimirManagerProvider = casimirManager.connect(provider) - const fees = await casimirManagerProvider.getFees() + const fees = await manager.connect(provider).getFees() const { LINK, SSV } = fees const feesTotalPercent = LINK + SSV const feesRounded = Math.round(feesTotalPercent * 100) / 100 @@ -67,19 +66,17 @@ export default function useSSV() { async function getPools(address: string, readyOrStake: ReadyOrStakeString): Promise { const { user } = useUsers() - const provider = new ethers.providers.JsonRpcProvider(ethereumURL) - const casimirManagerProvider = casimirManager.connect(provider) - - const userStake = await casimirManagerProvider.getUserStake(address) // to get user's stake balance - const poolStake = await casimirManagerProvider.getStake() // to get total stake balance - const poolIds = readyOrStake === 'ready' ? await casimirManagerProvider.getReadyPoolIds() : await casimirManagerProvider.getStakedPoolIds() // to get ready (open) pool IDs OR to get staked (active) pool IDs + const provider = new ethers.providers.JsonRpcProvider(ethereumURL) + const userStake = await manager.connect(provider).getUserStake(address) // to get user's stake balance + const poolStake = await manager.connect(provider).getStake() // to get total stake balance + const poolIds = readyOrStake === 'ready' ? await manager.connect(provider).getReadyPoolIds() : await manager.connect(provider).getStakedPoolIds() // to get ready (open) pool IDs OR to get staked (active) pool IDs console.log('userStake :>> ', ethers.utils.formatEther(userStake)) console.log('poolStake :>> ', ethers.utils.formatEther(poolStake)) console.log('poolIds :>> ', poolIds) return await Promise.all(poolIds.map(async (poolId: number) => { - const { deposits, operatorIds, validatorPublicKey } = await casimirManagerProvider.getPool(poolId) + const { deposits, operatorIds, validatorPublicKey } = await manager.connect(provider).getPoolDetails(poolId) // TODO: Decide when/how to get rewards/userRewards let pool: Pool = { @@ -147,11 +144,11 @@ export default function useSSV() { const signerCreator = signerCreators[signerType as keyof typeof signerCreators] let signer = signerCreator(walletProvider) if (isWalletConnectSigner(signer)) signer = await signer - const casimirManagerSigner = casimirManager.connect(signer as ethers.Signer) + const managerSigner = manager.connect(signer as ethers.Signer) const value = ethers.utils.parseEther(amount) - const result = await casimirManagerSigner.withdraw(value) + const result = await managerSigner.requestWithdrawal(value) return await result.wait() } - return { casimirManager, deposit, getDepositFees, getPools, withdraw } + return { manager, deposit, getDepositFees, getPools, withdraw } } \ No newline at end of file diff --git a/apps/web/src/composables/users.ts b/apps/web/src/composables/users.ts index c2bef36fc..3e8e17c28 100644 --- a/apps/web/src/composables/users.ts +++ b/apps/web/src/composables/users.ts @@ -76,7 +76,7 @@ const user = ref() // pools: [] // } // ) -const { casimirManager, getPools } = useSSV() +const { manager, getPools } = useSSV() export default function useUsers () { @@ -176,13 +176,13 @@ export default function useUsers () { const provider = new ethers.providers.JsonRpcProvider(ethereumURL) const validatorInitFilter = { - address: casimirManager.address, + address: manager.address, topics: [ // ethers.utils.id('ManagerDistribution(address,uint256,uint256,uint256)'), // TODO: Make sure to query for past events on page load (Fetch and then subscribe), - ethers.utils.id('PoolStaked(uint32)'), + ethers.utils.id('PoolInitiated(uint32)'), ] } - casimirManager.connect(provider).on(validatorInitFilter, async () => { + manager.connect(provider).on(validatorInitFilter, async () => { console.log('ValidatorInit event... updating pools') user.value.balance = await getUserBalance() user.value.pools = await getPools(user.value.id) diff --git a/common/hardhat/.gitignore b/common/hardhat/.gitignore deleted file mode 100644 index 04c01ba7b..000000000 --- a/common/hardhat/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -dist/ \ No newline at end of file diff --git a/common/hardhat/hardhat.config.ts b/common/hardhat/hardhat.config.ts deleted file mode 100644 index ede214d53..000000000 --- a/common/hardhat/hardhat.config.ts +++ /dev/null @@ -1,8 +0,0 @@ -import defaultConfig from '@casimir/ethereum/hardhat.config' -import { HardhatUserConfig } from 'hardhat/config' - -const config: HardhatUserConfig = { - ...defaultConfig -} - -export default config \ No newline at end of file diff --git a/common/hardhat/package.json b/common/hardhat/package.json deleted file mode 100644 index db70c4f89..000000000 --- a/common/hardhat/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "@casimir/hardhat", - "private": true, - "main": "src/index.ts", - "scripts": { - "build": "echo '@casimir/hardhat build not specified. Disregard this warning and any listed errors above if @casimir/hardhat is not needed for the current project build.' && exit 0", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "devDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.6", - "@typechain/ethers-v5": "^10.1.0", - "@typechain/hardhat": "^6.1.2", - "@types/node": "^17.0.38", - "esbuild": "^0.15.9", - "hardhat": "^2.12.2", - "typechain": "^8.1.0" - } -} diff --git a/common/hardhat/tsconfig.json b/common/hardhat/tsconfig.json deleted file mode 100644 index 70bc036f0..000000000 --- a/common/hardhat/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "strict": true, - "preserveConstEnums": true, - "noEmit": true, - "sourceMap": false, - "module": "CommonJS", - "moduleResolution": "Node", - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "isolatedModules": true - }, - "exclude": [ - "node_modules" - ], - "include": [ - "./src/*" - ], - "typeRoots": [ - "node_modules/@types" - ], - "files": [ - "hardhat.config.ts" - ] -} \ No newline at end of file diff --git a/contracts/ethereum/README.md b/contracts/ethereum/README.md index ee07fdbb6..0e9ae78c8 100644 --- a/contracts/ethereum/README.md +++ b/contracts/ethereum/README.md @@ -92,7 +92,7 @@ Core internal contracts and interfaces are located in the [src](./src) directory | Contract | Description | Docs | | --- | --- | --- | | [CasimirManager](./src/CasimirManager.sol) | Manages stake distribution | [docs/index.md#casimirmanager](./docs/index.md#casimirmanager) | -| [CasimirAutomation](./src/CasimirAutomation.sol) | Automates event handling | [docs/index.md#casimirautomation](./docs/index.md#casimirautomation) | +| [CasimirUpkeep](./src/CasimirUpkeep.sol) | Automates event handling | [docs/index.md#CasimirUpkeep](./docs/index.md#CasimirUpkeep) | **Vendor Contracts:** @@ -116,11 +116,11 @@ Mock (development-only) contracts and interfaces are located in the [src/mock](. ### Distributed Key Generation -Casimir trustlessly distributes validator key shares to operators using the [rockx-dkg-cli](https://github.com/RockX-SG/rockx-dkg-cli). The DKG server is called via [Automated Chainlink Functions](https://docs.chain.link/chainlink-functions/tutorials/automate-functions/) to generate, reshare, and exit validators. +Casimir trustlessly distributes validator key shares to operators using the [rockx-dkg-cli](https://github.com/RockX-SG/rockx-dkg-cli). ### Oracles -The contract loosely depends on two decentralized oracles. The first oracle provides a PoR feed aggregating the total of all Casimir validator balances on the Beacon chain. The second oracle automates checking balance changes, responds with relevant validator actions, and updates the contract only when necessary conditions are met (see [Chainlink PoR](https://docs.chain.link/data-feeds/proof-of-reserve) and [Chainlink Automation](https://docs.chain.link/chainlink-automation/introduction)). External requests are made using trust-minimized compute infrastructure (see [Chainlink Functions](https://docs.chain.link/chainlink-functions)). +The contract loosely depends on two decentralized oracles. The first oracle automatically syncs validator configuration, statuses, and balances when necessary conditions are met (see [Chainlink Automation](https://docs.chain.link/chainlink-automation/introduction)) by performing external requests with trust-minimized compute infrastructure (see [Chainlink Functions](https://docs.chain.link/chainlink-functions)). The second oracle watches the manager contract events, automatically executes zero-coordination distributed key generation (DKG) operations: validator key creating, resharing, and exiting (see [Chainlink Keepers](https://docs.chain.link/chainlink-keepers/introduction)) off-chain, and submits ceremony verification proofs. ## 👥 Users diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index db549d156..17de85412 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -1,6 +1,6 @@ # Solidity API -## CasimirAutomation +## CasimirUpkeep ### oracleHeartbeat @@ -755,7 +755,7 @@ receive() external payable _Will be removed in production Used for mocking sweeps from Beacon to the manager_ -## ICasimirAutomation +## ICasimirUpkeep ### OracleReport diff --git a/common/hardhat/src/index.ts b/contracts/ethereum/helpers/deploy.ts similarity index 96% rename from common/hardhat/src/index.ts rename to contracts/ethereum/helpers/deploy.ts index ad06f6020..c612c2475 100644 --- a/common/hardhat/src/index.ts +++ b/contracts/ethereum/helpers/deploy.ts @@ -18,4 +18,4 @@ async function deployContract(name: string, proxy?: boolean, args?: Record validatorStore[key]) as Validator[] + const validators = Object.keys(validatorStore).map((key) => validatorStore[key as keyof typeof validatorStore]) as Validator[] for (const validator of validators) { const { depositDataRoot, @@ -106,48 +98,70 @@ void async function () { const stakedValidatorPublicKeys = await manager?.getStakedValidatorPublicKeys() if (stakedValidatorPublicKeys?.length) { - const rewardAmount = (rewardPerValidator * stakedValidatorPublicKeys.length).toString() - - // const nextActiveStakeAmount = ethers.utils.formatEther(await manager?.getActiveStake() as ) + parseFloat(rewardAmount) - // const nextSweptRewardsAmount = 0.2 - // const nextSweptExitsAmount = 0 + const rewardAmount = rewardPerValidator * stakedValidatorPublicKeys.length /** Perform upkeep */ - const ranUpkeepBefore = await runUpkeep(automation, chainlink) + const ranUpkeepBefore = await runUpkeep({ upkeep, chainlink }) /** Fulfill oracle answer */ if (ranUpkeepBefore) { - // await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) + const nextActiveStakeAmount = Math.round((parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) + rewardAmount) * 10) / 10 + const nextSweptRewardsAmount = 0 + const nextSweptExitsAmount = 0 + const nextDepositedCount = 0 + const nextExitedCount = 0 + await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } /** Sweep rewards before next upkeep (balance will increment silently) */ - // const sweep = await chainlink.sendTransaction({ to: manager?.address, value: ethers.utils.parseEther(nextSweptRewardsAmount.toString()) }) - // await sweep.wait() + const sweep = await chainlink.sendTransaction({ to: manager?.address, value: ethers.utils.parseEther(rewardAmount.toString()) }) + await sweep.wait() /** Perform upkeep */ - const ranUpkeepAfter = await runUpkeep(automation, chainlink) + const ranUpkeepAfter = await runUpkeep({ upkeep, chainlink }) /** Fulfill oracle answer */ if (ranUpkeepAfter) { - // await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) + const nextActiveStakeAmount = Math.round((parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) - rewardAmount) * 10) / 10 + const nextSweptRewardsAmount = rewardAmount + const nextSweptExitsAmount = 0 + const nextDepositedCount = 0 + const nextExitedCount = 0 + await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } } } }) - /** Perform upkeep and fulfill oracle answer after each pool is staked */ - manager?.on('PoolStaked(uint32)', async () => { + /** Perform upkeep and fulfill oracle answer after each pool is filled */ + const poolFilledFilter = { + address: manager.address, + topics: [ + ethers.utils.id('PoolFilled(address,uint32)'), + ] + } + manager.on(poolFilledFilter, async () => { /** Perform upkeep */ - const ranUpkeep = await runUpkeep(automation, chainlink) + const ranUpkeep = await runUpkeep({ upkeep, chainlink }) /** Fulfill oracle answer */ if (ranUpkeep) { - // const nextActiveStakeAmount = - // const nextSweptRewardsAmount = - // const nextSweptExitsAmount = - // await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) + const nextActiveStakeAmount = parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) + 32 + const nextSweptRewardsAmount = 0 + const nextSweptExitsAmount = 0 + const nextDepositedCount = 1 + const nextExitedCount = 0 + await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } }) + + /** Stake 32 from the fourth user */ + const fourthUserStakeAmount = 32 + const fourthUserFees = { ...await (manager as CasimirManager).getFees() } + const fourthUserFeePercent = fourthUserFees.LINK + fourthUserFees.SSV + const fourthUserDepositAmount = fourthUserStakeAmount * ((100 + fourthUserFeePercent) / 100) + const fourthUserStake = await manager?.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(fourthUserDepositAmount.toString()) }) + await fourthUserStake?.wait() }() \ No newline at end of file diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index 0ab486438..8f8ceff09 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.16; -import "./CasimirAutomation.sol"; +import "./CasimirUpkeep.sol"; import "./interfaces/ICasimirManager.sol"; import "./libraries/Types.sol"; import "./vendor/interfaces/IDepositContract.sol"; @@ -55,8 +55,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /* Contracts */ /*************/ - /** Automation contract */ - ICasimirAutomation private immutable automation; + /** Upkeep contract */ + ICasimirUpkeep private immutable upkeep; /** Beacon deposit contract */ IDepositContract private immutable beaconDeposit; /** LINK ERC-20 token contract */ @@ -85,7 +85,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /* Dynamic State */ /********************/ - /** Latest active (consensus) balance reported from automation */ + /** Latest active (consensus) balance reported from upkeep */ uint256 latestActiveStake; /** Last pool ID created */ uint256 lastPoolId; @@ -163,8 +163,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { swapRouter = ISwapRouter(swapRouterAddress); tokenAddresses[Token.WETH] = wethTokenAddress; - /** Deploy automation contract */ - automation = new CasimirAutomation( + /** Deploy upkeep contract */ + upkeep = new CasimirUpkeep( address(this), oracleAddress, oracleSubId @@ -202,8 +202,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function rebalanceStake(uint256 activeStake, uint256 sweptRewards) external { require( - msg.sender == address(automation), - "Only automation can distribute rewards" + msg.sender == address(upkeep), + "Only upkeep can distribute rewards" ); int256 change = int256(activeStake + sweptRewards) - @@ -292,8 +292,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function initiateRequestedWithdrawals(uint256 count) external { require( - msg.sender == address(automation), - "Only automation can initiate withdrawals" + msg.sender == address(upkeep), + "Only upkeep can initiate withdrawals" ); while (count > 0) { @@ -339,8 +339,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function completePendingWithdrawals(uint256 count) external { require( - msg.sender == address(automation), - "Only automation can complete withdrawals" + msg.sender == address(upkeep), + "Only upkeep can complete withdrawals" ); while (count > 0) { @@ -365,11 +365,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function initiateReadyPools(uint256 count) external { require( - msg.sender == address(automation), - "Only automation can stake pools" + msg.sender == address(upkeep), + "Only upkeep can stake pools" ); - // Todo move these checks to automation + // Todo move these checks to upkeep require(readyValidatorPublicKeys.length >= count, "Not enough ready validators"); require(readyPoolIds.length >= count, "Not enough ready pools"); @@ -425,8 +425,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function completePendingPools(uint256 count) external { require( - msg.sender == address(automation), - "Only automation can complete pending pools" + msg.sender == address(upkeep), + "Only upkeep can complete pending pools" ); require(pendingPoolIds.length >= count, "Not enough pending pools"); @@ -455,8 +455,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function requestPoolExits(uint256 count) external { require( - msg.sender == address(automation), - "Only automation can request pool exits" + msg.sender == address(upkeep), + "Only upkeep can request pool exits" ); uint256 index = 0; // Keeping the same staked pool array @@ -488,8 +488,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint256 validatorIndex ) external { require( - msg.sender == address(automation), - "Only automation can complete pool exits" + msg.sender == address(upkeep), + "Only upkeep can complete pool exits" ); require(exitingValidatorCount > 0, "No exiting validators"); @@ -631,7 +631,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ); // Todo use linkToken.increaseAllowance(swappedLINK) if available linkToken.approve( - address(automation), + address(upkeep), linkToken.balanceOf(address(this)) ); unswappedTokens[tokenAddresses[Token.LINK]] += unswappedLINK; @@ -643,7 +643,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ); // Todo use ssvToken.increaseAllowance(swappedSSV) if available ssvToken.approve( - address(automation), + address(upkeep), ssvToken.balanceOf(address(this)) ); unswappedTokens[tokenAddresses[Token.SSV]] += unswappedSSV; @@ -723,7 +723,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param oracle New oracle address */ function setOracleAddress(address oracle) external onlyOwner { - automation.setOracleAddress(oracle); + upkeep.setOracleAddress(oracle); } /** @@ -934,15 +934,15 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Get the automation address - * @return automationAddress The automation address + * @notice Get the upkeep address + * @return upkeepAddress The upkeep address */ - function getAutomationAddress() + function getUpkeepAddress() external view - returns (address automationAddress) + returns (address upkeepAddress) { - automationAddress = address(automation); + upkeepAddress = address(upkeep); } // Dev-only functions diff --git a/contracts/ethereum/src/CasimirAutomation.sol b/contracts/ethereum/src/CasimirUpkeep.sol similarity index 89% rename from contracts/ethereum/src/CasimirAutomation.sol rename to contracts/ethereum/src/CasimirUpkeep.sol index f70cbcc60..55e033c74 100644 --- a/contracts/ethereum/src/CasimirAutomation.sol +++ b/contracts/ethereum/src/CasimirUpkeep.sol @@ -1,10 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.7; -import "./interfaces/ICasimirAutomation.sol"; +import "./interfaces/ICasimirUpkeep.sol"; import "./interfaces/ICasimirManager.sol"; -import {Functions, FunctionsClient} from "./vendor/FunctionsClient.sol"; -// import "@chainlink/contracts/src/v0.8/dev/functions/FunctionsClient.sol"; // Once published +import {Functions, FunctionsClient} from "@chainlink/contracts/src/v0.8/dev/functions/FunctionsClient.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; // Dev-only imports @@ -30,7 +29,7 @@ import "hardhat/console.sol"; /** * @title Oracle contract that triggers and handles actions */ -contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { +contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /*************/ /* Libraries */ /*************/ @@ -194,12 +193,14 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { manager.initiateReadyPools(readyPoolIds.length); // Todo find good bounds for batching } + /** Placeholder request */ + Functions.Request memory req; + /** Request a report */ - bytes32 requestId = s_oracle.sendRequest(oracleSubId, requestCBOR, fulfillGasLimit); - s_pendingRequests[requestId] = s_oracle.getRegistry(); + bytes32 requestId = sendRequest(req, oracleSubId, fulfillGasLimit); latestRequestId = requestId; - emit RequestSent(requestId); + emit UpkeepPerformed(performData); } /** @@ -222,16 +223,17 @@ contract CasimirAutomation is ICasimirAutomation, FunctionsClient, Ownable { if (err.length == 0) { /** Decode report */ - ( - uint256 activeStake, - uint256 sweptStake, - uint256 sweptExits - ) = abi.decode(response, (uint256, uint256, uint256)); + uint256 report = abi.decode(response, (uint256)); + console.log('Report: %s', report); - // Todo apply sensible heuristics to bound changes in stake + /** Unpack values */ + uint256 activeStake = uint256(uint64(report)) * 1 gwei; + uint256 sweptRewards = uint256(uint64(report >> 64)) * 1 gwei; + // uint256 sweptExits = uint256(uint64(report >> 128)) * 1 gwei; + // uint32 depositCount = uint32(report >> 192); + // uint32 withdrawalCount = uint32(report >> 224); - // Todo check simulation test for mistyped input - manager.rebalanceStake(activeStake, sweptStake); + manager.rebalanceStake(activeStake, sweptRewards); /** Complete the bounded count of pending pools */ uint32[] memory pendingPoolIds = manager.getPendingPoolIds(); diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index 95b949dc6..575059748 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -55,18 +55,18 @@ interface ICasimirManager { /* Events */ /**********/ - event PoolFilled(address indexed sender, uint32 poolId); - event PoolInitiated(uint32 indexed poolId); - event PoolCompleted(uint32 indexed poolId); - event PoolExitRequested(uint32 indexed poolId); - event PoolExited(uint32 indexed poolId); - event StakeDistributed(address indexed sender, uint256 amount); - event StakeRebalanced(address indexed sender, uint256 amount); - event WithdrawalRequested(address indexed sender, uint256 amount); - event WithdrawalInitiated(address indexed sender, uint256 amount); - event WithdrawalCompleted(address indexed sender, uint256 amount); - event ValidatorRegistered(bytes indexed publicKey); - event ValidatorReshared(bytes indexed publicKey); + event PoolFilled(address sender, uint32 poolId); + event PoolInitiated(uint32 poolId); + event PoolCompleted(uint32 poolId); + event PoolExitRequested(uint32 poolId); + event PoolExited(uint32 poolId); + event StakeDistributed(address sender, uint256 amount); + event StakeRebalanced(address sender, uint256 amount); + event WithdrawalRequested(address sender, uint256 amount); + event WithdrawalInitiated(address sender, uint256 amount); + event WithdrawalCompleted(address sender, uint256 amount); + event ValidatorRegistered(bytes publicKey); + event ValidatorReshared(bytes publicKey); /*************/ /* Functions */ diff --git a/contracts/ethereum/src/interfaces/ICasimirAutomation.sol b/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol similarity index 90% rename from contracts/ethereum/src/interfaces/ICasimirAutomation.sol rename to contracts/ethereum/src/interfaces/ICasimirUpkeep.sol index 2c89e24fd..d6db3f958 100644 --- a/contracts/ethereum/src/interfaces/ICasimirAutomation.sol +++ b/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.7; import "@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol"; -interface ICasimirAutomation is AutomationCompatibleInterface { +interface ICasimirUpkeep is AutomationCompatibleInterface { /***********/ /* Structs */ /***********/ @@ -21,6 +21,7 @@ interface ICasimirAutomation is AutomationCompatibleInterface { /**********/ event OCRResponse(bytes32 indexed requestId, bytes result, bytes err); + event UpkeepPerformed(bytes performData); /*************/ /* Functions */ diff --git a/contracts/ethereum/src/mock/MockFunctionsOracle.sol b/contracts/ethereum/src/mock/MockFunctionsOracle.sol index 690e80a72..77f272f73 100644 --- a/contracts/ethereum/src/mock/MockFunctionsOracle.sol +++ b/contracts/ethereum/src/mock/MockFunctionsOracle.sol @@ -1,7 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import "../vendor/interfaces/FunctionsOracleInterface.sol"; // Todo implement this interface +import "@chainlink/contracts/src/v0.8/dev/interfaces/FunctionsOracleInterface.sol"; + import "hardhat/console.sol"; /** diff --git a/contracts/ethereum/src/mock/MockKeeperRegistry.sol b/contracts/ethereum/src/mock/MockKeeperRegistry.sol deleted file mode 100644 index 34e2179e9..000000000 --- a/contracts/ethereum/src/mock/MockKeeperRegistry.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import "../vendor/interfaces/IKeeperRegistry.sol"; // Todo implement this interface -import "hardhat/console.sol"; - -contract MockKeeperRegistry { - - function registerUpkeep( - address target, - uint32 gasLimit, - address admin, - bytes calldata checkData, - bytes calldata offchainConfig - ) external view returns (uint256 id) { - console.log(target, gasLimit, admin); - console.log(abi.decode(checkData, (string))); - console.log(offchainConfig.length); - return 0; - } - - function getState() - external - pure - returns ( - State memory state, - OnchainConfig memory config, - address[] memory signers, - address[] memory transmitters, - uint8 f - ) - {} -} diff --git a/contracts/ethereum/src/vendor/Functions.sol b/contracts/ethereum/src/vendor/Functions.sol deleted file mode 100644 index 1e258bd55..000000000 --- a/contracts/ethereum/src/vendor/Functions.sol +++ /dev/null @@ -1,145 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.6; - -import {CBOR, Buffer} from "./libraries/CBOR.sol"; - -/** - * @title Library for Chainlink Functions - */ -library Functions { - uint256 internal constant DEFAULT_BUFFER_SIZE = 256; - - using CBOR for Buffer.buffer; - - enum Location { - Inline, - Remote - } - - enum CodeLanguage { - JavaScript - // In future version we may add other languages - } - - struct Request { - Location codeLocation; - Location secretsLocation; - CodeLanguage language; - string source; // Source code for Location.Inline or url for Location.Remote - bytes secrets; // Encrypted secrets blob for Location.Inline or url for Location.Remote - string[] args; - } - - error EmptySource(); - error EmptyUrl(); - error EmptySecrets(); - error EmptyArgs(); - error NoInlineSecrets(); - - /** - * @notice Encodes a Request to CBOR encoded bytes - * @param self The request to encode - * @return CBOR encoded bytes - */ - function encodeCBOR( - Request memory self - ) internal pure returns (bytes memory) { - CBOR.CBORBuffer memory buffer; - Buffer.init(buffer.buf, DEFAULT_BUFFER_SIZE); - - CBOR.writeString(buffer, "codeLocation"); - CBOR.writeUInt256(buffer, uint256(self.codeLocation)); - - CBOR.writeString(buffer, "language"); - CBOR.writeUInt256(buffer, uint256(self.language)); - - CBOR.writeString(buffer, "source"); - CBOR.writeString(buffer, self.source); - - if (self.args.length > 0) { - CBOR.writeString(buffer, "args"); - CBOR.startArray(buffer); - for (uint256 i = 0; i < self.args.length; i++) { - CBOR.writeString(buffer, self.args[i]); - } - CBOR.endSequence(buffer); - } - - if (self.secrets.length > 0) { - if (self.secretsLocation == Location.Inline) { - revert NoInlineSecrets(); - } - CBOR.writeString(buffer, "secretsLocation"); - CBOR.writeUInt256(buffer, uint256(self.secretsLocation)); - CBOR.writeString(buffer, "secrets"); - CBOR.writeBytes(buffer, self.secrets); - } - - return buffer.buf.buf; - } - - /** - * @notice Initializes a Chainlink Functions Request - * @dev Sets the codeLocation and code on the request - * @param self The uninitialized request - * @param location The user provided source code location - * @param language The programming language of the user code - * @param source The user provided source code or a url - */ - function initializeRequest( - Request memory self, - Location location, - CodeLanguage language, - string memory source - ) internal pure { - if (bytes(source).length == 0) revert EmptySource(); - - self.codeLocation = location; - self.language = language; - self.source = source; - } - - /** - * @notice Initializes a Chainlink Functions Request - * @dev Simplified version of initializeRequest for PoC - * @param self The uninitialized request - * @param javaScriptSource The user provided JS code (must not be empty) - */ - function initializeRequestForInlineJavaScript( - Request memory self, - string memory javaScriptSource - ) internal pure { - initializeRequest( - self, - Location.Inline, - CodeLanguage.JavaScript, - javaScriptSource - ); - } - - /** - * @notice Adds Remote user encrypted secrets to a Request - * @param self The initialized request - * @param encryptedSecretsURLs Encrypted comma-separated string of URLs pointing to off-chain secrets - */ - function addRemoteSecrets( - Request memory self, - bytes memory encryptedSecretsURLs - ) internal pure { - if (encryptedSecretsURLs.length == 0) revert EmptySecrets(); - - self.secretsLocation = Location.Remote; - self.secrets = encryptedSecretsURLs; - } - - /** - * @notice Adds args for the user run function - * @param self The initialized request - * @param args The array of args (must not be empty) - */ - function addArgs(Request memory self, string[] memory args) internal pure { - if (args.length == 0) revert EmptyArgs(); - - self.args = args; - } -} diff --git a/contracts/ethereum/src/vendor/FunctionsClient.sol b/contracts/ethereum/src/vendor/FunctionsClient.sol deleted file mode 100644 index fd8b4a279..000000000 --- a/contracts/ethereum/src/vendor/FunctionsClient.sol +++ /dev/null @@ -1,155 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.6; - -import {Functions} from "./Functions.sol"; -import {FunctionsClientInterface} from "./interfaces/FunctionsClientInterface.sol"; -import {FunctionsOracleInterface} from "./interfaces/FunctionsOracleInterface.sol"; - -/** - * @title The Chainlink Functions client contract - * @notice Contract writers can inherit this contract in order to create Chainlink Functions requests - */ -abstract contract FunctionsClient is FunctionsClientInterface { - FunctionsOracleInterface internal s_oracle; - mapping(bytes32 => address) internal s_pendingRequests; - - event RequestSent(bytes32 indexed id); - event RequestFulfilled(bytes32 indexed id); - - error SenderIsNotRegistry(); - error RequestIsAlreadyPending(); - error RequestIsNotPending(); - - constructor(address oracle) { - setOracle(oracle); - } - - /** - * @inheritdoc FunctionsClientInterface - */ - function getDONPublicKey() external view override returns (bytes memory) { - return s_oracle.getDONPublicKey(); - } - - /** - * @notice Estimate the total cost that will be charged to a subscription to make a request: gas re-imbursement, plus DON fee, plus Registry fee - * @param req The initialized Functions.Request - * @param subscriptionId The subscription ID - * @param gasLimit gas limit for the fulfillment callback - * @return billedCost Cost in Juels (1e18) of LINK - */ - function estimateCost( - Functions.Request memory req, - uint64 subscriptionId, - uint32 gasLimit, - uint256 gasPrice - ) public view returns (uint96) { - return - s_oracle.estimateCost( - subscriptionId, - Functions.encodeCBOR(req), - gasLimit, - gasPrice - ); - } - - /** - * @notice Sends a Chainlink Functions request to the stored oracle address - * @param req The initialized Functions.Request - * @param subscriptionId The subscription ID - * @param gasLimit gas limit for the fulfillment callback - * @return requestId The generated request ID - */ - function sendRequest( - Functions.Request memory req, - uint64 subscriptionId, - uint32 gasLimit - ) internal returns (bytes32) { - bytes32 requestId = s_oracle.sendRequest( - subscriptionId, - Functions.encodeCBOR(req), - gasLimit - ); - s_pendingRequests[requestId] = s_oracle.getRegistry(); - emit RequestSent(requestId); - return requestId; - } - - /** - * @notice User defined function to handle a response - * @param requestId The request ID, returned by sendRequest() - * @param response Aggregated response from the user code - * @param err Aggregated error from the user code or from the execution pipeline - * Either response or error parameter will be set, but never both - */ - function fulfillRequest( - bytes32 requestId, - bytes memory response, - bytes memory err - ) internal virtual; - - /** - * @inheritdoc FunctionsClientInterface - */ - function handleOracleFulfillment( - bytes32 requestId, - bytes memory response, - bytes memory err - ) external override recordChainlinkFulfillment(requestId) { - fulfillRequest(requestId, response, err); - } - - /** - * @notice Sets the stored Oracle address - * @param oracle The address of Functions Oracle contract - */ - function setOracle(address oracle) internal { - s_oracle = FunctionsOracleInterface(oracle); - } - - /** - * @notice Gets the stored address of the oracle contract - * @return The address of the oracle contract - */ - function getChainlinkOracleAddress() internal view returns (address) { - return address(s_oracle); - } - - /** - * @notice Allows for a request which was created on another contract to be fulfilled - * on this contract - * @param oracleAddress The address of the oracle contract that will fulfill the request - * @param requestId The request ID used for the response - */ - function addExternalRequest( - address oracleAddress, - bytes32 requestId - ) internal notPendingRequest(requestId) { - s_pendingRequests[requestId] = oracleAddress; - } - - /** - * @dev Reverts if the sender is not the oracle that serviced the request. - * Emits RequestFulfilled event. - * @param requestId The request ID for fulfillment - */ - modifier recordChainlinkFulfillment(bytes32 requestId) { - if (msg.sender != s_pendingRequests[requestId]) { - revert SenderIsNotRegistry(); - } - delete s_pendingRequests[requestId]; - emit RequestFulfilled(requestId); - _; - } - - /** - * @dev Reverts if the request is already pending - * @param requestId The request ID for fulfillment - */ - modifier notPendingRequest(bytes32 requestId) { - if (s_pendingRequests[requestId] != address(0)) { - revert RequestIsAlreadyPending(); - } - _; - } -} diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/Functions.js b/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/Functions.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/Functions.js rename to contracts/ethereum/src/vendor/FunctionsSandboxLibrary/Functions.js diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/Log.js b/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/Log.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/Log.js rename to contracts/ethereum/src/vendor/FunctionsSandboxLibrary/Log.js diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/Sandbox.js b/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/Sandbox.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/Sandbox.js rename to contracts/ethereum/src/vendor/FunctionsSandboxLibrary/Sandbox.js diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/Validator.js b/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/Validator.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/Validator.js rename to contracts/ethereum/src/vendor/FunctionsSandboxLibrary/Validator.js diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/buildRequest.js b/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/buildRequest.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/buildRequest.js rename to contracts/ethereum/src/vendor/FunctionsSandboxLibrary/buildRequest.js diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/encryptSecrets.js b/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/encryptSecrets.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/encryptSecrets.js rename to contracts/ethereum/src/vendor/FunctionsSandboxLibrary/encryptSecrets.js diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/getRequestConfig.js b/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/getRequestConfig.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/getRequestConfig.js rename to contracts/ethereum/src/vendor/FunctionsSandboxLibrary/getRequestConfig.js diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/handler.js b/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/handler.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/handler.js rename to contracts/ethereum/src/vendor/FunctionsSandboxLibrary/handler.js diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/index.js b/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/index.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/index.js rename to contracts/ethereum/src/vendor/FunctionsSandboxLibrary/index.js diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/simulateRequest.js b/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/simulateRequest.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/simulateRequest.js rename to contracts/ethereum/src/vendor/FunctionsSandboxLibrary/simulateRequest.js diff --git a/contracts/ethereum/src/vendor/interfaces/FunctionsBillingRegistryInterface.sol b/contracts/ethereum/src/vendor/interfaces/FunctionsBillingRegistryInterface.sol deleted file mode 100644 index a09226f99..000000000 --- a/contracts/ethereum/src/vendor/interfaces/FunctionsBillingRegistryInterface.sol +++ /dev/null @@ -1,107 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.6; - -/** - * @title Chainlink Functions billing subscription registry interface. - */ -interface FunctionsBillingRegistryInterface { - struct RequestBilling { - // a unique subscription ID allocated by billing system, - uint64 subscriptionId; - // the client contract that initiated the request to the DON - // to use the subscription it must be added as a consumer on the subscription - address client; - // customer specified gas limit for the fulfillment callback - uint32 gasLimit; - // the expected gas price used to execute the transaction - uint256 gasPrice; - } - - enum FulfillResult { - USER_SUCCESS, - USER_ERROR, - INVALID_REQUEST_ID - } - - /** - * @notice Get configuration relevant for making requests - * @return uint32 global max for request gas limit - * @return address[] list of registered DONs - */ - function getRequestConfig() - external - view - returns (uint32, address[] memory); - - /** - * @notice Determine the charged fee that will be paid to the Registry owner - * @param data Encoded Chainlink Functions request data, use FunctionsClient API to encode a request - * @param billing The request's billing configuration - * @return fee Cost in Juels (1e18) of LINK - */ - function getRequiredFee( - bytes calldata data, - FunctionsBillingRegistryInterface.RequestBilling memory billing - ) external view returns (uint96); - - /** - * @notice Estimate the total cost to make a request: gas re-imbursement, plus DON fee, plus Registry fee - * @param gasLimit Encoded Chainlink Functions request data, use FunctionsClient API to encode a request - * @param gasPrice The request's billing configuration - * @param donFee Fee charged by the DON that is paid to Oracle Node - * @param registryFee Fee charged by the DON that is paid to Oracle Node - * @return costEstimate Cost in Juels (1e18) of LINK - */ - function estimateCost( - uint32 gasLimit, - uint256 gasPrice, - uint96 donFee, - uint96 registryFee - ) external view returns (uint96); - - /** - * @notice Initiate the billing process for an Functions request - * @param data Encoded Chainlink Functions request data, use FunctionsClient API to encode a request - * @param billing Billing configuration for the request - * @return requestId - A unique identifier of the request. Can be used to match a request to a response in fulfillRequest. - * @dev Only callable by a node that has been approved on the Registry - */ - function startBilling( - bytes calldata data, - RequestBilling calldata billing - ) external returns (bytes32); - - /** - * @notice Finalize billing process for an Functions request by sending a callback to the Client contract and then charging the subscription - * @param requestId identifier for the request that was generated by the Registry in the beginBilling commitment - * @param response response data from DON consensus - * @param err error from DON consensus - * @param transmitter the Oracle who sent the report - * @param signers the Oracles who had a part in generating the report - * @param signerCount the number of signers on the report - * @param reportValidationGas the amount of gas used for the report validation. Cost is split by all fulfillments on the report. - * @param initialGas the initial amount of gas that should be used as a baseline to charge the single fulfillment for execution cost - * @return result fulfillment result - * @dev Only callable by a node that has been approved on the Registry - * @dev simulated offchain to determine if sufficient balance is present to fulfill the request - */ - function fulfillAndBill( - bytes32 requestId, - bytes calldata response, - bytes calldata err, - address transmitter, - address[31] memory signers, // 31 comes from OCR2Abstract.sol's maxNumOracles constant - uint8 signerCount, - uint256 reportValidationGas, - uint256 initialGas - ) external returns (FulfillResult); - - /** - * @notice Gets subscription owner. - * @param subscriptionId - ID of the subscription - * @return owner - owner of the subscription. - */ - function getSubscriptionOwner( - uint64 subscriptionId - ) external view returns (address owner); -} diff --git a/contracts/ethereum/src/vendor/interfaces/FunctionsClientInterface.sol b/contracts/ethereum/src/vendor/interfaces/FunctionsClientInterface.sol deleted file mode 100644 index f70325d97..000000000 --- a/contracts/ethereum/src/vendor/interfaces/FunctionsClientInterface.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.6; - -/** - * @title Chainlink Functions client interface. - */ -interface FunctionsClientInterface { - /** - * @notice Returns the DON's secp256k1 public key used to encrypt secrets - * @dev All Oracles nodes have the corresponding private key - * needed to decrypt the secrets encrypted with the public key - * @return publicKey DON's public key - */ - function getDONPublicKey() external view returns (bytes memory); - - /** - * @notice Chainlink Functions response handler called by the designated transmitter node in an OCR round. - * @param requestId The requestId returned by FunctionsClient.sendRequest(). - * @param response Aggregated response from the user code. - * @param err Aggregated error either from the user code or from the execution pipeline. - * Either response or error parameter will be set, but never both. - */ - function handleOracleFulfillment( - bytes32 requestId, - bytes memory response, - bytes memory err - ) external; -} diff --git a/contracts/ethereum/src/vendor/interfaces/FunctionsOracleInterface.sol b/contracts/ethereum/src/vendor/interfaces/FunctionsOracleInterface.sol deleted file mode 100644 index d590a7c20..000000000 --- a/contracts/ethereum/src/vendor/interfaces/FunctionsOracleInterface.sol +++ /dev/null @@ -1,100 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.6; - -import "./FunctionsBillingRegistryInterface.sol"; - -/** - * @title Chainlink Functions oracle interface. - */ -interface FunctionsOracleInterface { - /** - * @notice Gets the stored billing registry address - * @return registryAddress The address of Chainlink Functions billing registry contract - */ - function getRegistry() external view returns (address); - - /** - * @notice Sets the stored billing registry address - * @param registryAddress The new address of Chainlink Functions billing registry contract - */ - function setRegistry(address registryAddress) external; - - /** - * @notice Returns the DON's secp256k1 public key that is used to encrypt secrets - * @dev All nodes on the DON have the corresponding private key - * needed to decrypt the secrets encrypted with the public key - * @return publicKey the DON's public key - */ - function getDONPublicKey() external view returns (bytes memory); - - /** - * @notice Sets DON's secp256k1 public key used to encrypt secrets - * @dev Used to rotate the key - * @param donPublicKey The new public key - */ - function setDONPublicKey(bytes calldata donPublicKey) external; - - /** - * @notice Sets a per-node secp256k1 public key used to encrypt secrets for that node - * @dev Callable only by contract owner and DON members - * @param node node's address - * @param publicKey node's public key - */ - function setNodePublicKey(address node, bytes calldata publicKey) external; - - /** - * @notice Deletes node's public key - * @dev Callable only by contract owner or the node itself - * @param node node's address - */ - function deleteNodePublicKey(address node) external; - - /** - * @notice Return two arrays of equal size containing DON members' addresses and their corresponding - * public keys (or empty byte arrays if per-node key is not defined) - */ - function getAllNodePublicKeys() - external - view - returns (address[] memory, bytes[] memory); - - /** - * @notice Determine the fee charged by the DON that will be split between signing Node Operators for servicing the request - * @param data Encoded Chainlink Functions request data, use FunctionsClient API to encode a request - * @param billing The request's billing configuration - * @return fee Cost in Juels (1e18) of LINK - */ - function getRequiredFee( - bytes calldata data, - FunctionsBillingRegistryInterface.RequestBilling calldata billing - ) external view returns (uint96); - - /** - * @notice Estimate the total cost that will be charged to a subscription to make a request: gas re-imbursement, plus DON fee, plus Registry fee - * @param subscriptionId A unique subscription ID allocated by billing system, - * a client can make requests from different contracts referencing the same subscription - * @param data Encoded Chainlink Functions request data, use FunctionsClient API to encode a request - * @param gasLimit Gas limit for the fulfillment callback - * @return billedCost Cost in Juels (1e18) of LINK - */ - function estimateCost( - uint64 subscriptionId, - bytes calldata data, - uint32 gasLimit, - uint256 gasPrice - ) external view returns (uint96); - - /** - * @notice Sends a request (encoded as data) using the provided subscriptionId - * @param subscriptionId A unique subscription ID allocated by billing system, - * a client can make requests from different contracts referencing the same subscription - * @param data Encoded Chainlink Functions request data, use FunctionsClient API to encode a request - * @param gasLimit Gas limit for the fulfillment callback - * @return requestId A unique request identifier (unique per DON) - */ - function sendRequest( - uint64 subscriptionId, - bytes calldata data, - uint32 gasLimit - ) external returns (bytes32); -} diff --git a/contracts/ethereum/src/vendor/interfaces/IKeeperRegistry.sol b/contracts/ethereum/src/vendor/interfaces/IKeeperRegistry.sol deleted file mode 100644 index ff62ebdfb..000000000 --- a/contracts/ethereum/src/vendor/interfaces/IKeeperRegistry.sol +++ /dev/null @@ -1,202 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -/** - * @notice OnchainConfig of the registry - * @dev only used in params and return values - * @member paymentPremiumPPB payment premium rate oracles receive on top of - * being reimbursed for gas, measured in parts per billion - * @member flatFeeMicroLink flat fee paid to oracles for performing upkeeps, - * priced in MicroLink; can be used in conjunction with or independently of - * paymentPremiumPPB - * @member checkGasLimit gas limit when checking for upkeep - * @member stalenessSeconds number of seconds that is allowed for feed data to - * be stale before switching to the fallback pricing - * @member gasCeilingMultiplier multiplier to apply to the fast gas feed price - * when calculating the payment ceiling for keepers - * @member minUpkeepSpend minimum LINK that an upkeep must spend before cancelling - * @member maxPerformGas max executeGas allowed for an upkeep on this registry - * @member fallbackGasPrice gas price used if the gas price feed is stale - * @member fallbackLinkPrice LINK price used if the LINK price feed is stale - * @member transcoder address of the transcoder contract - * @member registrar address of the registrar contract - */ -struct OnchainConfig { - uint32 paymentPremiumPPB; - uint32 flatFeeMicroLink; // min 0.000001 LINK, max 4294 LINK - uint32 checkGasLimit; - uint24 stalenessSeconds; - uint16 gasCeilingMultiplier; - uint96 minUpkeepSpend; - uint32 maxPerformGas; - uint32 maxCheckDataSize; - uint32 maxPerformDataSize; - uint256 fallbackGasPrice; - uint256 fallbackLinkPrice; - address transcoder; - address registrar; -} - -/** - * @notice state of the registry - * @dev only used in params and return values - * @member nonce used for ID generation - * @member ownerLinkBalance withdrawable balance of LINK by contract owner - * @member expectedLinkBalance the expected balance of LINK of the registry - * @member totalPremium the total premium collected on registry so far - * @member numUpkeeps total number of upkeeps on the registry - * @member configCount ordinal number of current config, out of all configs applied to this contract so far - * @member latestConfigBlockNumber last block at which this config was set - * @member latestConfigDigest domain-separation tag for current config - * @member latestEpoch for which a report was transmitted - * @member paused freeze on execution scoped to the entire registry - */ -struct State { - uint32 nonce; - uint96 ownerLinkBalance; - uint256 expectedLinkBalance; - uint96 totalPremium; - uint256 numUpkeeps; - uint32 configCount; - uint32 latestConfigBlockNumber; - bytes32 latestConfigDigest; - uint32 latestEpoch; - bool paused; -} - -/** - * @notice all information about an upkeep - * @dev only used in return values - * @member target the contract which needs to be serviced - * @member executeGas the gas limit of upkeep execution - * @member checkData the checkData bytes for this upkeep - * @member balance the balance of this upkeep - * @member admin for this upkeep - * @member maxValidBlocknumber until which block this upkeep is valid - * @member lastPerformBlockNumber the last block number when this upkeep was performed - * @member amountSpent the amount this upkeep has spent - * @member paused if this upkeep has been paused - * @member skipSigVerification skip signature verification in transmit for a low security low cost model - */ -struct UpkeepInfo { - address target; - uint32 executeGas; - bytes checkData; - uint96 balance; - address admin; - uint64 maxValidBlocknumber; - uint32 lastPerformBlockNumber; - uint96 amountSpent; - bool paused; - bytes offchainConfig; -} - -enum UpkeepFailureReason { - NONE, - UPKEEP_CANCELLED, - UPKEEP_PAUSED, - TARGET_CHECK_REVERTED, - UPKEEP_NOT_NEEDED, - PERFORM_DATA_EXCEEDS_LIMIT, - INSUFFICIENT_BALANCE -} - -interface KeeperRegistryBaseInterface { - function registerUpkeep( - address target, - uint32 gasLimit, - address admin, - bytes calldata checkData, - bytes calldata offchainConfig - ) external returns (uint256 id); - - function cancelUpkeep(uint256 id) external; - - function pauseUpkeep(uint256 id) external; - - function unpauseUpkeep(uint256 id) external; - - function transferUpkeepAdmin(uint256 id, address proposed) external; - - function acceptUpkeepAdmin(uint256 id) external; - - function updateCheckData(uint256 id, bytes calldata newCheckData) external; - - function addFunds(uint256 id, uint96 amount) external; - - function setUpkeepGasLimit(uint256 id, uint32 gasLimit) external; - - function setUpkeepOffchainConfig( - uint256 id, - bytes calldata config - ) external; - - function getUpkeep( - uint256 id - ) external view returns (UpkeepInfo memory upkeepInfo); - - function getActiveUpkeepIDs( - uint256 startIndex, - uint256 maxCount - ) external view returns (uint256[] memory); - - function getTransmitterInfo( - address query - ) - external - view - returns ( - bool active, - uint8 index, - uint96 balance, - uint96 lastCollected, - address payee - ); - - function getState() - external - view - returns ( - State memory state, - OnchainConfig memory config, - address[] memory signers, - address[] memory transmitters, - uint8 f - ); -} - -/** - * @dev The view methods are not actually marked as view in the implementation - * but we want them to be easily queried off-chain. Solidity will not compile - * if we actually inherit from this interface, so we document it here. - */ -interface IKeeperRegistry is KeeperRegistryBaseInterface { - function checkUpkeep( - uint256 upkeepId - ) - external - view - returns ( - bool upkeepNeeded, - bytes memory performData, - UpkeepFailureReason upkeepFailureReason, - uint256 gasUsed, - uint256 fastGasWei, - uint256 linkNative - ); -} - -interface KeeperRegistryExecutableInterface is KeeperRegistryBaseInterface { - function checkUpkeep( - uint256 upkeepId - ) - external - returns ( - bool upkeepNeeded, - bytes memory performData, - UpkeepFailureReason upkeepFailureReason, - uint256 gasUsed, - uint256 fastGasWei, - uint256 linkNative - ); -} diff --git a/contracts/ethereum/src/vendor/libraries/Buffer.sol b/contracts/ethereum/src/vendor/libraries/Buffer.sol deleted file mode 100644 index 34a72d629..000000000 --- a/contracts/ethereum/src/vendor/libraries/Buffer.sol +++ /dev/null @@ -1,287 +0,0 @@ -// SPDX-License-Identifier: BSD-2-Clause -pragma solidity ^0.8.4; - -/** - * @dev A library for working with mutable byte buffers in Solidity. - * - * Byte buffers are mutable and expandable, and provide a variety of primitives - * for appending to them. At any time you can fetch a bytes object containing the - * current contents of the buffer. The bytes object should not be stored between - * operations, as it may change due to resizing of the buffer. - */ -library Buffer { - /** - * @dev Represents a mutable buffer. Buffers have a current value (buf) and - * a capacity. The capacity may be longer than the current value, in - * which case it can be extended without the need to allocate more memory. - */ - struct buffer { - bytes buf; - uint capacity; - } - - /** - * @dev Initializes a buffer with an initial capacity. - * @param buf The buffer to initialize. - * @param capacity The number of bytes of space to allocate the buffer. - * @return The buffer, for chaining. - */ - function init( - buffer memory buf, - uint capacity - ) internal pure returns (buffer memory) { - if (capacity % 32 != 0) { - capacity += 32 - (capacity % 32); - } - // Allocate space for the buffer data - buf.capacity = capacity; - assembly { - let ptr := mload(0x40) - mstore(buf, ptr) - mstore(ptr, 0) - let fpm := add(32, add(ptr, capacity)) - if lt(fpm, ptr) { - revert(0, 0) - } - mstore(0x40, fpm) - } - return buf; - } - - /** - * @dev Initializes a new buffer from an existing bytes object. - * Changes to the buffer may mutate the original value. - * @param b The bytes object to initialize the buffer with. - * @return A new buffer. - */ - function fromBytes(bytes memory b) internal pure returns (buffer memory) { - buffer memory buf; - buf.buf = b; - buf.capacity = b.length; - return buf; - } - - function resize(buffer memory buf, uint capacity) private pure { - bytes memory oldbuf = buf.buf; - init(buf, capacity); - append(buf, oldbuf); - } - - /** - * @dev Sets buffer length to 0. - * @param buf The buffer to truncate. - * @return The original buffer, for chaining.. - */ - function truncate(buffer memory buf) internal pure returns (buffer memory) { - assembly { - let bufptr := mload(buf) - mstore(bufptr, 0) - } - return buf; - } - - /** - * @dev Appends len bytes of a byte string to a buffer. Resizes if doing so would exceed - * the capacity of the buffer. - * @param buf The buffer to append to. - * @param data The data to append. - * @param len The number of bytes to copy. - * @return The original buffer, for chaining. - */ - function append( - buffer memory buf, - bytes memory data, - uint len - ) internal pure returns (buffer memory) { - require(len <= data.length); - - uint off = buf.buf.length; - uint newCapacity = off + len; - if (newCapacity > buf.capacity) { - resize(buf, newCapacity * 2); - } - - uint dest; - uint src; - assembly { - // Memory address of the buffer data - let bufptr := mload(buf) - // Length of existing buffer data - let buflen := mload(bufptr) - // Start address = buffer address + offset + sizeof(buffer length) - dest := add(add(bufptr, 32), off) - // Update buffer length if we're extending it - if gt(newCapacity, buflen) { - mstore(bufptr, newCapacity) - } - src := add(data, 32) - } - - // Copy word-length chunks while possible - for (; len >= 32; len -= 32) { - assembly { - mstore(dest, mload(src)) - } - dest += 32; - src += 32; - } - - // Copy remaining bytes - unchecked { - uint mask = (256 ** (32 - len)) - 1; - assembly { - let srcpart := and(mload(src), not(mask)) - let destpart := and(mload(dest), mask) - mstore(dest, or(destpart, srcpart)) - } - } - - return buf; - } - - /** - * @dev Appends a byte string to a buffer. Resizes if doing so would exceed - * the capacity of the buffer. - * @param buf The buffer to append to. - * @param data The data to append. - * @return The original buffer, for chaining. - */ - function append( - buffer memory buf, - bytes memory data - ) internal pure returns (buffer memory) { - return append(buf, data, data.length); - } - - /** - * @dev Appends a byte to the buffer. Resizes if doing so would exceed the - * capacity of the buffer. - * @param buf The buffer to append to. - * @param data The data to append. - * @return The original buffer, for chaining. - */ - function appendUint8( - buffer memory buf, - uint8 data - ) internal pure returns (buffer memory) { - uint off = buf.buf.length; - uint offPlusOne = off + 1; - if (off >= buf.capacity) { - resize(buf, offPlusOne * 2); - } - - assembly { - // Memory address of the buffer data - let bufptr := mload(buf) - // Address = buffer address + sizeof(buffer length) + off - let dest := add(add(bufptr, off), 32) - mstore8(dest, data) - // Update buffer length if we extended it - if gt(offPlusOne, mload(bufptr)) { - mstore(bufptr, offPlusOne) - } - } - - return buf; - } - - /** - * @dev Appends len bytes of bytes32 to a buffer. Resizes if doing so would - * exceed the capacity of the buffer. - * @param buf The buffer to append to. - * @param data The data to append. - * @param len The number of bytes to write (left-aligned). - * @return The original buffer, for chaining. - */ - function append( - buffer memory buf, - bytes32 data, - uint len - ) private pure returns (buffer memory) { - uint off = buf.buf.length; - uint newCapacity = len + off; - if (newCapacity > buf.capacity) { - resize(buf, newCapacity * 2); - } - - unchecked { - uint mask = (256 ** len) - 1; - // Right-align data - data = data >> (8 * (32 - len)); - assembly { - // Memory address of the buffer data - let bufptr := mload(buf) - // Address = buffer address + sizeof(buffer length) + newCapacity - let dest := add(bufptr, newCapacity) - mstore(dest, or(and(mload(dest), not(mask)), data)) - // Update buffer length if we extended it - if gt(newCapacity, mload(bufptr)) { - mstore(bufptr, newCapacity) - } - } - } - return buf; - } - - /** - * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed - * the capacity of the buffer. - * @param buf The buffer to append to. - * @param data The data to append. - * @return The original buffer, for chhaining. - */ - function appendBytes20( - buffer memory buf, - bytes20 data - ) internal pure returns (buffer memory) { - return append(buf, bytes32(data), 20); - } - - /** - * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed - * the capacity of the buffer. - * @param buf The buffer to append to. - * @param data The data to append. - * @return The original buffer, for chaining. - */ - function appendBytes32( - buffer memory buf, - bytes32 data - ) internal pure returns (buffer memory) { - return append(buf, data, 32); - } - - /** - * @dev Appends a byte to the end of the buffer. Resizes if doing so would - * exceed the capacity of the buffer. - * @param buf The buffer to append to. - * @param data The data to append. - * @param len The number of bytes to write (right-aligned). - * @return The original buffer. - */ - function appendInt( - buffer memory buf, - uint data, - uint len - ) internal pure returns (buffer memory) { - uint off = buf.buf.length; - uint newCapacity = len + off; - if (newCapacity > buf.capacity) { - resize(buf, newCapacity * 2); - } - - uint mask = (256 ** len) - 1; - assembly { - // Memory address of the buffer data - let bufptr := mload(buf) - // Address = buffer address + sizeof(buffer length) + newCapacity - let dest := add(bufptr, newCapacity) - mstore(dest, or(and(mload(dest), not(mask)), data)) - // Update buffer length if we extended it - if gt(newCapacity, mload(bufptr)) { - mstore(bufptr, newCapacity) - } - } - return buf; - } -} diff --git a/contracts/ethereum/src/vendor/libraries/CBOR.sol b/contracts/ethereum/src/vendor/libraries/CBOR.sol deleted file mode 100644 index 559264282..000000000 --- a/contracts/ethereum/src/vendor/libraries/CBOR.sol +++ /dev/null @@ -1,274 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.4; - -import "./Buffer.sol"; - -/** - * @dev A library for populating CBOR encoded payload in Solidity. - * - * https://datatracker.ietf.org/doc/html/rfc7049 - * - * The library offers various write* and start* methods to encode values of different types. - * The resulted buffer can be obtained with data() method. - * Encoding of primitive types is staightforward, whereas encoding of sequences can result - * in an invalid CBOR if start/write/end flow is violated. - * For the purpose of gas saving, the library does not verify start/write/end flow internally, - * except for nested start/end pairs. - */ - -library CBOR { - using Buffer for Buffer.buffer; - - struct CBORBuffer { - Buffer.buffer buf; - uint256 depth; - } - - uint8 private constant MAJOR_TYPE_INT = 0; - uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1; - uint8 private constant MAJOR_TYPE_BYTES = 2; - uint8 private constant MAJOR_TYPE_STRING = 3; - uint8 private constant MAJOR_TYPE_ARRAY = 4; - uint8 private constant MAJOR_TYPE_MAP = 5; - uint8 private constant MAJOR_TYPE_TAG = 6; - uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7; - - uint8 private constant TAG_TYPE_BIGNUM = 2; - uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3; - - uint8 private constant CBOR_FALSE = 20; - uint8 private constant CBOR_TRUE = 21; - uint8 private constant CBOR_NULL = 22; - uint8 private constant CBOR_UNDEFINED = 23; - - function create( - uint256 capacity - ) internal pure returns (CBORBuffer memory cbor) { - Buffer.init(cbor.buf, capacity); - cbor.depth = 0; - return cbor; - } - - function data(CBORBuffer memory buf) internal pure returns (bytes memory) { - require(buf.depth == 0, "Invalid CBOR"); - return buf.buf.buf; - } - - function writeUInt256(CBORBuffer memory buf, uint256 value) internal pure { - buf.buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM)); - writeBytes(buf, abi.encode(value)); - } - - function writeInt256(CBORBuffer memory buf, int256 value) internal pure { - if (value < 0) { - buf.buf.appendUint8( - uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM) - ); - writeBytes(buf, abi.encode(uint256(-1 - value))); - } else { - writeUInt256(buf, uint256(value)); - } - } - - function writeUInt64(CBORBuffer memory buf, uint64 value) internal pure { - writeFixedNumeric(buf, MAJOR_TYPE_INT, value); - } - - function writeInt64(CBORBuffer memory buf, int64 value) internal pure { - if (value >= 0) { - writeFixedNumeric(buf, MAJOR_TYPE_INT, uint64(value)); - } else { - writeFixedNumeric(buf, MAJOR_TYPE_NEGATIVE_INT, uint64(-1 - value)); - } - } - - function writeBytes( - CBORBuffer memory buf, - bytes memory value - ) internal pure { - writeFixedNumeric(buf, MAJOR_TYPE_BYTES, uint64(value.length)); - buf.buf.append(value); - } - - function writeString( - CBORBuffer memory buf, - string memory value - ) internal pure { - writeFixedNumeric(buf, MAJOR_TYPE_STRING, uint64(bytes(value).length)); - buf.buf.append(bytes(value)); - } - - function writeBool(CBORBuffer memory buf, bool value) internal pure { - writeContentFree(buf, value ? CBOR_TRUE : CBOR_FALSE); - } - - function writeNull(CBORBuffer memory buf) internal pure { - writeContentFree(buf, CBOR_NULL); - } - - function writeUndefined(CBORBuffer memory buf) internal pure { - writeContentFree(buf, CBOR_UNDEFINED); - } - - function startArray(CBORBuffer memory buf) internal pure { - writeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY); - buf.depth += 1; - } - - function startFixedArray( - CBORBuffer memory buf, - uint64 length - ) internal pure { - writeDefiniteLengthType(buf, MAJOR_TYPE_ARRAY, length); - } - - function startMap(CBORBuffer memory buf) internal pure { - writeIndefiniteLengthType(buf, MAJOR_TYPE_MAP); - buf.depth += 1; - } - - function startFixedMap(CBORBuffer memory buf, uint64 length) internal pure { - writeDefiniteLengthType(buf, MAJOR_TYPE_MAP, length); - } - - function endSequence(CBORBuffer memory buf) internal pure { - writeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE); - buf.depth -= 1; - } - - function writeKVString( - CBORBuffer memory buf, - string memory key, - string memory value - ) internal pure { - writeString(buf, key); - writeString(buf, value); - } - - function writeKVBytes( - CBORBuffer memory buf, - string memory key, - bytes memory value - ) internal pure { - writeString(buf, key); - writeBytes(buf, value); - } - - function writeKVUInt256( - CBORBuffer memory buf, - string memory key, - uint256 value - ) internal pure { - writeString(buf, key); - writeUInt256(buf, value); - } - - function writeKVInt256( - CBORBuffer memory buf, - string memory key, - int256 value - ) internal pure { - writeString(buf, key); - writeInt256(buf, value); - } - - function writeKVUInt64( - CBORBuffer memory buf, - string memory key, - uint64 value - ) internal pure { - writeString(buf, key); - writeUInt64(buf, value); - } - - function writeKVInt64( - CBORBuffer memory buf, - string memory key, - int64 value - ) internal pure { - writeString(buf, key); - writeInt64(buf, value); - } - - function writeKVBool( - CBORBuffer memory buf, - string memory key, - bool value - ) internal pure { - writeString(buf, key); - writeBool(buf, value); - } - - function writeKVNull( - CBORBuffer memory buf, - string memory key - ) internal pure { - writeString(buf, key); - writeNull(buf); - } - - function writeKVUndefined( - CBORBuffer memory buf, - string memory key - ) internal pure { - writeString(buf, key); - writeUndefined(buf); - } - - function writeKVMap( - CBORBuffer memory buf, - string memory key - ) internal pure { - writeString(buf, key); - startMap(buf); - } - - function writeKVArray( - CBORBuffer memory buf, - string memory key - ) internal pure { - writeString(buf, key); - startArray(buf); - } - - function writeFixedNumeric( - CBORBuffer memory buf, - uint8 major, - uint64 value - ) private pure { - if (value <= 23) { - buf.buf.appendUint8(uint8((major << 5) | value)); - } else if (value <= 0xFF) { - buf.buf.appendUint8(uint8((major << 5) | 24)); - buf.buf.appendInt(value, 1); - } else if (value <= 0xFFFF) { - buf.buf.appendUint8(uint8((major << 5) | 25)); - buf.buf.appendInt(value, 2); - } else if (value <= 0xFFFFFFFF) { - buf.buf.appendUint8(uint8((major << 5) | 26)); - buf.buf.appendInt(value, 4); - } else { - buf.buf.appendUint8(uint8((major << 5) | 27)); - buf.buf.appendInt(value, 8); - } - } - - function writeIndefiniteLengthType( - CBORBuffer memory buf, - uint8 major - ) private pure { - buf.buf.appendUint8(uint8((major << 5) | 31)); - } - - function writeDefiniteLengthType( - CBORBuffer memory buf, - uint8 major, - uint64 length - ) private pure { - writeFixedNumeric(buf, major, length); - } - - function writeContentFree(CBORBuffer memory buf, uint8 value) private pure { - buf.buf.appendUint8(uint8((MAJOR_TYPE_CONTENT_FREE << 5) | value)); - } -} diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 928381d10..9a9d76258 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -1,8 +1,8 @@ import { ethers } from 'hardhat' import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' -import { deployContract } from '@casimir/hardhat' -import { CasimirManager, CasimirAutomation, MockFunctionsOracle } from '../../build/artifacts/types' -import { fulfillOracleAnswer, runUpkeep } from '../helpers/automation' +import { deployContract } from '@casimir/ethereum/helpers/deploy' +import { CasimirManager, CasimirUpkeep, MockFunctionsOracle } from '@casimir/ethereum/build/artifacts/types' +import { fulfillOracleAnswer, runUpkeep } from '@casimir/ethereum/helpers/upkeep' import { ContractConfig, DeploymentConfig, Validator } from '@casimir/types' import { validatorStore } from '@casimir/data' @@ -72,17 +72,17 @@ export async function deploymentFixture() { if (name === 'MockFunctionsOracle') mockFunctionsOracle = contract as MockFunctionsOracle } - const automationAddress = await manager?.getAutomationAddress() as string - const automation = await ethers.getContractAt('CasimirAutomation', automationAddress) as CasimirAutomation + const upkeepAddress = await manager?.getUpkeepAddress() as string + const upkeep = await ethers.getContractAt('CasimirUpkeep', upkeepAddress) as CasimirUpkeep - return { manager: manager as CasimirManager, automation: automation as CasimirAutomation, mockFunctionsOracle, owner, chainlink } + return { manager: manager as CasimirManager, upkeep: upkeep as CasimirUpkeep, mockFunctionsOracle, owner, chainlink } } /** Fixture to add validators */ export async function registerValidatorsFixture() { - const { manager, automation, mockFunctionsOracle, owner, chainlink } = await loadFixture(deploymentFixture) + const { manager, upkeep, mockFunctionsOracle, owner, chainlink } = await loadFixture(deploymentFixture) - const validators = Object.keys(validatorStore).map((key) => validatorStore[key]) as Validator[] + const validators = Object.keys(validatorStore).map((key) => validatorStore[key as keyof typeof validatorStore]) as Validator[] for (const validator of validators) { const { depositDataRoot, @@ -104,12 +104,12 @@ export async function registerValidatorsFixture() { ) await registerValidator.wait() } - return { manager, automation, mockFunctionsOracle, owner, chainlink, validators } + return { manager, upkeep, mockFunctionsOracle, owner, chainlink, validators } } /** Fixture to stake 16 ETH for the first user */ export async function firstUserDepositFixture() { - const { manager, automation, mockFunctionsOracle, owner, chainlink } = await loadFixture(registerValidatorsFixture) + const { manager, upkeep, mockFunctionsOracle, owner, chainlink } = await loadFixture(registerValidatorsFixture) const [, firstUser] = await ethers.getSigners() const stakeAmount = 16 @@ -122,20 +122,22 @@ export async function firstUserDepositFixture() { await deposit.wait() /** Run upkeep */ - await runUpkeep(automation, chainlink) + await runUpkeep({ upkeep, chainlink }) - return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser } + return { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser } } /** Fixture to stake 24 ETH for the second user */ export async function secondUserDepositFixture() { - const { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser } = await loadFixture(firstUserDepositFixture) + const { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser } = await loadFixture(firstUserDepositFixture) const [, , secondUser] = await ethers.getSigners() const stakeAmount = 24 const nextActiveStakeAmount = 32 const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 + const nextDepositedCount = 1 + const nextExitedCount = 0 const fees = { ...await manager.getFees() } const feePercent = fees.LINK + fees.SSV @@ -145,67 +147,74 @@ export async function secondUserDepositFixture() { await deposit.wait() /** Run upkeep */ - const ranUpkeep = await runUpkeep(automation, chainlink) + const ranUpkeep = await runUpkeep({ upkeep, chainlink }) /** Fulfill oracle answer */ if (ranUpkeep) { - await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) + await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } + return { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } } /** Fixture to reward 0.1 ETH in total to the first and second user */ export async function rewardPostSecondUserDepositFixture() { - const { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } = await loadFixture(secondUserDepositFixture) + const { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } = await loadFixture(secondUserDepositFixture) const rewardAmount = 0.1 const nextActiveStakeAmount = 32 + rewardAmount const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 + const nextDepositedCount = 0 + const nextExitedCount = 0 /** Run upkeep */ - const ranUpkeep = await runUpkeep(automation, chainlink) + const ranUpkeep = await runUpkeep({ upkeep, chainlink }) /** Fulfill oracle answer */ if (ranUpkeep) { - await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) + await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } + return { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } } /** Fixture to sweep 0.1 ETH to the manager */ export async function sweepPostSecondUserDepositFixture() { - const { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } = await loadFixture(secondUserDepositFixture) + const { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } = await loadFixture(secondUserDepositFixture) + + const sweptRewards = 0.1 + const sweep = await chainlink.sendTransaction({ to: manager?.address, value: ethers.utils.parseEther(sweptRewards.toString()) }) + await sweep.wait() const nextActiveStakeAmount = 32 - const nextSweptRewardsAmount = 0.1 + const nextSweptRewardsAmount = sweptRewards const nextSweptExitsAmount = 0 - - const sweep = await chainlink.sendTransaction({ to: manager?.address, value: ethers.utils.parseEther('0.1') }) - await sweep.wait() + const nextDepositedCount = 0 + const nextExitedCount = 0 /** Run upkeep */ - const ranUpkeep = await runUpkeep(automation, chainlink) + const ranUpkeep = await runUpkeep({ upkeep, chainlink }) /** Fulfill oracle answer */ if (ranUpkeep) { - await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) + await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } + return { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } } /** Fixture to stake 24 ETH for the third user */ export async function thirdUserDepositFixture() { - const { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } = await loadFixture(sweepPostSecondUserDepositFixture) + const { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } = await loadFixture(sweepPostSecondUserDepositFixture) const [, , , thirdUser] = await ethers.getSigners() const stakeAmount = 24 const nextActiveStakeAmount = 64 const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 + const nextDepositedCount = 1 + const nextExitedCount = 0 const fees = { ...await manager.getFees() } const feePercent = fees.LINK + fees.SSV @@ -215,81 +224,87 @@ export async function thirdUserDepositFixture() { await deposit.wait() /** Run upkeep */ - const ranUpkeep = await runUpkeep(automation, chainlink) + const ranUpkeep = await runUpkeep({ upkeep, chainlink }) /** Fulfill oracle answer */ if (ranUpkeep) { - await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) + await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } + return { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } } /** Fixture to reward 0.2 ETH in total to the first, second, and third user */ export async function rewardPostThirdUserDepositFixture() { - const { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(thirdUserDepositFixture) + const { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(thirdUserDepositFixture) const rewardAmount = 0.2 const nextActiveStakeAmount = 64 + rewardAmount const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 + const nextDepositedCount = 0 + const nextExitedCount = 0 /** Run upkeep */ - const ranUpkeep = await runUpkeep(automation, chainlink) + const ranUpkeep = await runUpkeep({ upkeep, chainlink }) /** Fulfill oracle answer */ if (ranUpkeep) { - await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) + await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } + return { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } } /** Fixture to sweep 0.2 ETH to the manager */ export async function sweepPostThirdUserDepositFixture() { - const { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(rewardPostThirdUserDepositFixture) + const { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(rewardPostThirdUserDepositFixture) + + const sweptRewards = 0.2 + const sweep = await chainlink.sendTransaction({ to: manager?.address, value: ethers.utils.parseEther(sweptRewards.toString()) }) + await sweep.wait() const nextActiveStakeAmount = 64 - const nextSweptRewardsAmount = 0.2 + const nextSweptRewardsAmount = sweptRewards const nextSweptExitsAmount = 0 - - /** Sweep rewards before upkeep (balance will increment silently) */ - const sweep = await chainlink.sendTransaction({ to: manager?.address, value: ethers.utils.parseEther(nextSweptRewardsAmount.toString()) }) - await sweep.wait() + const nextDepositedCount = 0 + const nextExitedCount = 0 /** Run upkeep */ - const ranUpkeep = await runUpkeep(automation, chainlink) + const ranUpkeep = await runUpkeep({ upkeep, chainlink }) /** Fulfill oracle answer */ if (ranUpkeep) { - await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) + await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, automation, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } + return { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } } /** Fixture to withdraw 0.3 to the first user */ export async function firstUserPartialWithdrawalFixture() { - const { manager, automation, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(sweepPostThirdUserDepositFixture) + const { manager, upkeep, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(sweepPostThirdUserDepositFixture) const openDeposits = await manager?.getOpenDeposits() const withdraw = await manager.connect(firstUser).requestWithdrawal(openDeposits) await withdraw.wait() /** Run upkeep */ - await runUpkeep(automation, chainlink) + await runUpkeep({ upkeep, chainlink }) - return { manager, automation, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser } + return { manager, upkeep, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser } } /** Fixture to stake 72 for the fourth user */ export async function fourthUserDepositFixture() { - const { manager, automation, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(firstUserPartialWithdrawalFixture) + const { manager, upkeep, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(firstUserPartialWithdrawalFixture) const [, , , , fourthUser] = await ethers.getSigners() const stakeAmount = 72 const nextActiveStakeAmount = 128 const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 + const nextDepositedCount = 2 + const nextExitedCount = 0 const fees = { ...await manager.getFees() } const feePercent = fees.LINK + fees.SSV @@ -299,19 +314,19 @@ export async function fourthUserDepositFixture() { await deposit.wait() /** Run upkeep */ - const ranUpkeep = await runUpkeep(automation, chainlink) + const ranUpkeep = await runUpkeep({ upkeep, chainlink }) /** Fulfill oracle answer */ if (ranUpkeep) { - await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) + await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, automation, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser, fourthUser } + return { manager, upkeep, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser, fourthUser } } /** Fixture to simulate stakes and rewards */ export async function simulationFixture() { - const { manager, automation, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser, fourthUser } = await loadFixture(fourthUserDepositFixture) + const { manager, upkeep, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser, fourthUser } = await loadFixture(fourthUserDepositFixture) let nextActiveStakeAmount = 128 @@ -322,15 +337,17 @@ export async function simulationFixture() { nextActiveStakeAmount = Math.round((nextActiveStakeAmount + rewardAmount) * 10) / 10 // Fixes weird rounding error const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 + const nextDepositedCount = 0 + const nextExitedCount = 0 /** Run upkeep */ - const ranUpkeep = await runUpkeep(automation, chainlink) + const ranUpkeep = await runUpkeep({ upkeep, chainlink }) /** Fulfill oracle answer */ if (ranUpkeep) { - await fulfillOracleAnswer(automation, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount) + await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } } } - return { manager, automation, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser, fourthUser } + return { manager, upkeep, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser, fourthUser } } \ No newline at end of file diff --git a/contracts/ethereum/test/helpers/automation.ts b/contracts/ethereum/test/helpers/automation.ts deleted file mode 100644 index d04f80b46..000000000 --- a/contracts/ethereum/test/helpers/automation.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ethers } from 'hardhat' -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import { CasimirManager, CasimirAutomation, MockFunctionsOracle } from '../../build/artifacts/types' - -export async function runUpkeep(automation: CasimirAutomation, chainlink: SignerWithAddress) { - let ranUpkeep = false - const checkData = ethers.utils.toUtf8Bytes('') - const { ...check } = await automation.connect(chainlink).checkUpkeep(checkData) - const { upkeepNeeded, performData } = check - if (upkeepNeeded) { - const performUpkeep = await automation.connect(chainlink).performUpkeep(performData) - await performUpkeep.wait() - ranUpkeep = true - } - return ranUpkeep -} - -export async function fulfillOracleAnswer(automation: CasimirAutomation, chainlink: SignerWithAddress, nextActiveStakeAmount: number, nextSweptRewardsAmount: number, nextSweptExitsAmount: number) { - const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) - const responseBytes = ethers.utils.defaultAbiCoder.encode( - ['uint256', 'uint256', 'uint256'], - [ - ethers.utils.parseEther(nextActiveStakeAmount.toString()), - ethers.utils.parseEther(nextSweptRewardsAmount.toString()), - ethers.utils.parseEther(nextSweptExitsAmount.toString()) - ] - ) - const errorBytes = ethers.utils.toUtf8Bytes('') - const mockFulfillRequest = await automation.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) - await mockFulfillRequest.wait() -} \ No newline at end of file diff --git a/contracts/ethereum/tsconfig.json b/contracts/ethereum/tsconfig.json index 8c0758972..7756b12a0 100644 --- a/contracts/ethereum/tsconfig.json +++ b/contracts/ethereum/tsconfig.json @@ -10,13 +10,14 @@ "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, - "isolatedModules": true + "isolatedModules": true, + "resolveJsonModule": true }, "include": [ "scripts/*.ts", "./test/*.ts", "src/index.ts" -, "test/e2e/simulation.ts" ], +, "test/e2e/simulation.ts", "helpers/deploy.ts" ], "typeRoots": [ "node_modules/@types" ], diff --git a/package-lock.json b/package-lock.json index e57683f73..130feb1ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -90,6 +90,13 @@ "vue-tsc": "^0.34.7" } }, + "common/core": { + "name": "@casimir/core", + "extraneous": true, + "dependencies": { + "ethers": "^5.7.2" + } + }, "common/data": { "name": "@casimir/data", "dependencies": { @@ -123,6 +130,7 @@ }, "common/hardhat": { "name": "@casimir/hardhat", + "extraneous": true, "devDependencies": { "@nomiclabs/hardhat-ethers": "^2.0.6", "@typechain/ethers-v5": "^10.1.0", @@ -133,43 +141,6 @@ "typechain": "^8.1.0" } }, - "common/hardhat/node_modules/esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" - } - }, "common/helpers": { "name": "@casimir/helpers", "dependencies": { @@ -242,7 +213,7 @@ "contracts/ethereum": { "name": "@casimir/ethereum", "dependencies": { - "@chainlink/contracts": "^0.5.1", + "@chainlink/contracts": "^0.6.1", "@openzeppelin/contracts": "^4.8.0", "@openzeppelin/contracts-upgradeable": "^4.8.0", "@uniswap/v3-core": "1.0.1", @@ -2022,10 +1993,6 @@ "resolved": "contracts/ethereum", "link": true }, - "node_modules/@casimir/hardhat": { - "resolved": "common/hardhat", - "link": true - }, "node_modules/@casimir/helpers": { "resolved": "common/helpers", "link": true @@ -2059,15 +2026,21 @@ "link": true }, "node_modules/@chainlink/contracts": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@chainlink/contracts/-/contracts-0.5.1.tgz", - "integrity": "sha512-3PDBJ38Sd6Ml9h7FNK/tZQti+kTCdXUq1qzE6E59CnlzycsV9ElPvf2hTvs9Mi9C6pEx2Mmw9yhZMfBktYUInQ==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@chainlink/contracts/-/contracts-0.6.1.tgz", + "integrity": "sha512-EuwijGexttw0UjfrW+HygwhQIrGAbqpf1ue28R55HhWMHBzphEH0PhWm8DQmFfj5OZNy8Io66N4L0nStkZ3QKQ==", "dependencies": { "@eth-optimism/contracts": "^0.5.21", - "@openzeppelin/contracts": "^4.3.3", + "@openzeppelin/contracts": "~4.3.3", + "@openzeppelin/contracts-upgradeable": "^4.7.3", "@openzeppelin/contracts-v0.7": "npm:@openzeppelin/contracts@v3.4.2" } }, + "node_modules/@chainlink/contracts/node_modules/@openzeppelin/contracts": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.3.3.tgz", + "integrity": "sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g==" + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -27399,8 +27372,7 @@ "services/keys": { "name": "@casimir/keys", "dependencies": { - "ethers": "^5.7.2", - "minimist": "^1.2.7" + "ethers": "^5.7.2" }, "devDependencies": { "@types/cors": "^2.8.12", diff --git a/scripts/ethereum/dev.ts b/scripts/ethereum/dev.ts index c8b50a896..ccfe8c001 100644 --- a/scripts/ethereum/dev.ts +++ b/scripts/ethereum/dev.ts @@ -15,6 +15,21 @@ import minimist from 'minimist' * - https://hardhat.org/hardhat-network/docs/overview */ void async function () { + /** Chain forks */ + const forks = { + ethereum: { + mainnet: 'mainnet', + testnet: 'goerli' + } + } + + /** Casimir addresses */ + const addresses = { + mainnet: '', + testnet: '0xaaf5751d370d2fD5F1D5642C2f88bbFa67a29301', + local: '0x07E05700CB4E946BA50244e27f01805354cD8eF0' + } + /** Load AWS credentials for configuration */ await loadCredentials() @@ -46,6 +61,14 @@ void async function () { echo(chalk.bgBlackBright('Using ') + chalk.bgBlue(fork) + chalk.bgBlackBright(' ethereum fork at ') + chalk.bgBlue(url)) } + if (mock) { + /** Use local manager address */ + process.env.PUBLIC_MANAGER_ADDRESS = addresses['local'] + } else { + /** Use ${fork} manager address */ + process.env.PUBLIC_MANAGER_ADDRESS = addresses[fork] + } + if (clean) { await $`npm run clean --workspace @casimir/ethereum` } diff --git a/scripts/local/dev.ts b/scripts/local/dev.ts index 40c09cea4..d861323bb 100644 --- a/scripts/local/dev.ts +++ b/scripts/local/dev.ts @@ -100,7 +100,7 @@ void async function () { if (network) { /** Use ${network} manager address */ - process.env.CASIMIR_MANAGER_ADDRESS = addresses[network] + process.env.PUBLIC_MANAGER_ADDRESS = addresses[network] const key = await getSecret(`consensus-networks-${chain}-${network}`) const currency = chain.slice(0, 3) @@ -111,10 +111,10 @@ void async function () { if (mock) { /** Use local manager address */ - process.env.CASIMIR_MANAGER_ADDRESS = addresses['local'] + process.env.PUBLIC_MANAGER_ADDRESS = addresses['local'] } else { /** Use ${fork} manager address */ - process.env.CASIMIR_MANAGER_ADDRESS = addresses[fork] + process.env.PUBLIC_MANAGER_ADDRESS = addresses[fork] } const chainFork = forks[chain][fork] diff --git a/services/keys/package.json b/services/keys/package.json index 4d25367ba..a39a6224f 100644 --- a/services/keys/package.json +++ b/services/keys/package.json @@ -4,12 +4,11 @@ "main": "src/index.ts", "scripts": { "build": "node build.js", - "dev": "npx esno -r dotenv/config scripts/dev.ts", + "dev": "npx esno -r dotenv/config src/index.ts", "test": "jest --config jest.config.js" }, "dependencies": { - "ethers": "^5.7.2", - "minimist": "^1.2.7" + "ethers": "^5.7.2" }, "devDependencies": { "@types/cors": "^2.8.12", diff --git a/services/keys/scripts/dev.ts b/services/keys/scripts/dev.ts index 69a9ebb87..33079fe30 100644 --- a/services/keys/scripts/dev.ts +++ b/services/keys/scripts/dev.ts @@ -1,6 +1,10 @@ import { retryFetch } from '@casimir/helpers' import { $ } from 'zx' +// Todo just start services and import/run the desired command (dev CLI, no prod CLI) + +process.env.PUBLIC_MANAGER_ADDRESS = '0xaaf5751d370d2fD5F1D5642C2f88bbFa67a29301' + void async function () { await $`npx esno -r dotenv/config src/index.ts help` From 4a48022fd32e323549ca5783d8cc04ceb58d2a05 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Sat, 6 May 2023 19:00:13 -0400 Subject: [PATCH 21/78] Move pool validator pairing to JIT --- apps/web/src/composables/ssv.ts | 8 +- common/helpers/src/index.ts | 18 +- contracts/ethereum/hardhat.config.ts | 2 +- contracts/ethereum/helpers/oracle.ts | 28 +++ contracts/ethereum/helpers/upkeep.ts | 18 +- contracts/ethereum/scripts/dev.ts | 92 +++---- contracts/ethereum/src/CasimirManager.sol | 233 +++++++----------- contracts/ethereum/src/CasimirUpkeep.sol | 18 +- .../src/interfaces/ICasimirManager.sol | 55 ++--- contracts/ethereum/test/fixtures/shared.ts | 149 +++++------ contracts/ethereum/test/integration.ts | 26 +- package-lock.json | 36 +++ scripts/ethereum/dev.ts | 40 ++- scripts/local/dev.ts | 43 ++-- services/keys/README.md | 20 +- services/oracle/README.md | 28 +++ services/oracle/package.json | 21 ++ services/oracle/src/index.ts | 26 ++ services/oracle/tsconfig.json | 28 +++ 19 files changed, 455 insertions(+), 434 deletions(-) create mode 100644 contracts/ethereum/helpers/oracle.ts create mode 100644 services/oracle/README.md create mode 100644 services/oracle/package.json create mode 100644 services/oracle/src/index.ts create mode 100644 services/oracle/tsconfig.json diff --git a/apps/web/src/composables/ssv.ts b/apps/web/src/composables/ssv.ts index 358c20ae9..e866b28da 100644 --- a/apps/web/src/composables/ssv.ts +++ b/apps/web/src/composables/ssv.ts @@ -76,7 +76,7 @@ export default function useSSV() { console.log('poolIds :>> ', poolIds) return await Promise.all(poolIds.map(async (poolId: number) => { - const { deposits, operatorIds, validatorPublicKey } = await manager.connect(provider).getPoolDetails(poolId) + const { deposits, publicKey, operatorIds } = await manager.connect(provider).getPool(poolId) // TODO: Decide when/how to get rewards/userRewards let pool: Pool = { @@ -87,17 +87,17 @@ export default function useSSV() { userStake: ethers.utils.formatEther(userStake) } - if (validatorPublicKey) { + if (publicKey) { // Validator data from beaconcha.in hardcoded for now // const response = await fetch(`https://prater.beaconcha.in/api/v1/validator/${validatorPublicKey}`) // const { data } = await response.json() // const { status } = data const validator = { - publicKey: validatorPublicKey, + publicKey, status: 'Active', effectiveness: '0%', apr: '0%', // See issue #205 https://github.com/consensusnetworks/casimir/issues/205#issuecomment-1338142532 - url: `https://prater.beaconcha.in/validator/${validatorPublicKey}` + url: `https://prater.beaconcha.in/validator/${publicKey}` } diff --git a/common/helpers/src/index.ts b/common/helpers/src/index.ts index 08e2b86c8..2df307661 100644 --- a/common/helpers/src/index.ts +++ b/common/helpers/src/index.ts @@ -119,7 +119,7 @@ export async function run(fullCommand: string) { * @param retriesLeft - Number of retries left (default: 5) * @returns A promise that resolves when the command exits */ -export async function retryRun(fullCommand: string, retriesLeft: number | undefined = 25) { +export async function retryRun(fullCommand: string, retriesLeft: number | undefined = 25): Promise { if (retriesLeft === 0) { throw new Error('Command failed after maximum retries') } @@ -188,7 +188,7 @@ export async function getWalletKeystore(mnemonic?: string) { * @param mnemonic - The wallet mnemonic (optional) * @returns The wallet */ -export function getWallet(mnemonic?: string) { +export function getWallet(mnemonic?: string): ethers.Wallet { if (mnemonic) { return ethers.Wallet.fromMnemonic(mnemonic) } @@ -202,4 +202,18 @@ export function getWallet(mnemonic?: string) { */ export function getWithdrawalCredentials(withdrawalAddress: string): string { return '01' + '0'.repeat(22) + withdrawalAddress.split('0x')[1] +} + +export async function getFutureContractAddress({ wallet, nonce, index }: { + wallet: ethers.Wallet, + nonce: number, + index?: number +}): Promise { + + console.log(`Wallet Address: ${wallet.address}`) + console.log(`Current Nonce: ${nonce}`) + + const futureAddress = ethers.utils.getContractAddress({ from: wallet.address, nonce: nonce + (index || 0) }) + console.log(`Predicted Contract Address: ${futureAddress}`) + return futureAddress } \ No newline at end of file diff --git a/contracts/ethereum/hardhat.config.ts b/contracts/ethereum/hardhat.config.ts index e71a63d12..2c9156671 100644 --- a/contracts/ethereum/hardhat.config.ts +++ b/contracts/ethereum/hardhat.config.ts @@ -82,7 +82,7 @@ const config: HardhatUserConfig = { }, networks: { hardhat: { - accounts: mnemonic ? { ...hid, accountsBalance: '96000000000000000000' } : undefined, + accounts: mnemonic ? { ...hid, accountsBalance: '10000000000000000000000' } : undefined, chainId: forkingChainId || 1337, forking: forkingUrl ? { url: forkingUrl } : undefined, mining: miningInterval ? mining : { auto: true }, diff --git a/contracts/ethereum/helpers/oracle.ts b/contracts/ethereum/helpers/oracle.ts new file mode 100644 index 000000000..e6e028acd --- /dev/null +++ b/contracts/ethereum/helpers/oracle.ts @@ -0,0 +1,28 @@ +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' +import { CasimirManager } from '../build/artifacts/types' +import { validatorStore } from '@casimir/data' +import { Validator } from '@casimir/types' + +const mockValidators: Validator[] = Object.values(validatorStore) + +export async function initiatePool({ manager, oracle, index }: { manager: CasimirManager, oracle: SignerWithAddress, index: number }) { + const { + depositDataRoot, + publicKey, + operatorIds, + sharesEncrypted, + sharesPublicKeys, + signature, + withdrawalCredentials + } = mockValidators[index] + const initiatePool = await manager.connect(oracle).initiateNextReadyPool( + depositDataRoot, + publicKey, + operatorIds, + sharesEncrypted, + sharesPublicKeys, + signature, + withdrawalCredentials + ) + await initiatePool.wait() +} \ No newline at end of file diff --git a/contracts/ethereum/helpers/upkeep.ts b/contracts/ethereum/helpers/upkeep.ts index 359180778..7ed872fde 100644 --- a/contracts/ethereum/helpers/upkeep.ts +++ b/contracts/ethereum/helpers/upkeep.ts @@ -1,18 +1,18 @@ import { ethers } from 'hardhat' import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import { CasimirManager, CasimirUpkeep, MockFunctionsOracle } from '../build/artifacts/types' +import { CasimirUpkeep } from '../build/artifacts/types' export async function runUpkeep({ - upkeep, chainlink + upkeep, keeper }: { - upkeep: CasimirUpkeep, chainlink: SignerWithAddress + upkeep: CasimirUpkeep, keeper: SignerWithAddress }) { let ranUpkeep = false const checkData = ethers.utils.toUtf8Bytes('') - const { ...check } = await upkeep.connect(chainlink).checkUpkeep(checkData) + const { ...check } = await upkeep.connect(keeper).checkUpkeep(checkData) const { upkeepNeeded, performData } = check if (upkeepNeeded) { - const performUpkeep = await upkeep.connect(chainlink).performUpkeep(performData) + const performUpkeep = await upkeep.connect(keeper).performUpkeep(performData) await performUpkeep.wait() ranUpkeep = true } @@ -20,10 +20,10 @@ export async function runUpkeep({ } export async function fulfillOracleAnswer({ - upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount + upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }: { upkeep: CasimirUpkeep, - chainlink: SignerWithAddress, + keeper: SignerWithAddress, nextActiveStakeAmount: number, nextSweptRewardsAmount: number, nextSweptExitsAmount: number, @@ -45,7 +45,7 @@ export async function fulfillOracleAnswer({ ) const responseBytes = ethers.utils.defaultAbiCoder.encode(['uint256'], [packedResponse.toString()]) const errorBytes = ethers.utils.toUtf8Bytes('') - const mockFulfillRequest = await upkeep.connect(chainlink).mockFulfillRequest(requestId, responseBytes, errorBytes) + const mockFulfillRequest = await upkeep.connect(keeper).mockFulfillRequest(requestId, responseBytes, errorBytes) await mockFulfillRequest.wait() } @@ -56,4 +56,4 @@ function packResponse(activeStakeAmount: string, sweptRewardsAmount: string, swe packed = packed.or(ethers.BigNumber.from(depositedCount).shl(192)) packed = packed.or(ethers.BigNumber.from(exitedCount).shl(224)) return packed - } \ No newline at end of file +} \ No newline at end of file diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index a97ddcae1..3bd934fc1 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -1,12 +1,13 @@ import { deployContract } from '@casimir/ethereum/helpers/deploy' -import { ContractConfig, DeploymentConfig, Validator } from '@casimir/types' -import { validatorStore } from '@casimir/data' -import { CasimirUpkeep, CasimirManager, MockFunctionsOracle } from '@casimir/ethereum/build/artifacts/types' +import { ContractConfig, DeploymentConfig } from '@casimir/types' +import { CasimirUpkeep, CasimirManager } from '@casimir/ethereum/build/artifacts/types' import { ethers } from 'hardhat' import { fulfillOracleAnswer, runUpkeep } from '@casimir/ethereum/helpers/upkeep' +import { initiatePool } from '@casimir/ethereum/helpers/oracle' +import EventEmitter, { on } from 'events' void async function () { - const [, , , , fourthUser, chainlink] = await ethers.getSigners() + const [, , , , fourthUser, keeper, oracle] = await ethers.getSigners() let config: DeploymentConfig = { CasimirManager: { address: '', @@ -61,47 +62,21 @@ void async function () { const manager = await ethers.getContractAt('CasimirManager', config.CasimirManager.address as string) as CasimirManager const upkeep = await ethers.getContractAt('CasimirUpkeep', await manager.getUpkeepAddress() as string) as CasimirUpkeep - - const validators = Object.keys(validatorStore).map((key) => validatorStore[key as keyof typeof validatorStore]) as Validator[] - for (const validator of validators) { - const { - depositDataRoot, - publicKey, - operatorIds, - sharesEncrypted, - sharesPublicKeys, - signature, - withdrawalCredentials - } = validator - const registration = await manager?.registerValidator( - depositDataRoot, - publicKey, - operatorIds, - sharesEncrypted, - sharesPublicKeys, - signature, - withdrawalCredentials - ) - await registration?.wait() - } - - /** Distribute rewards every ${blocksPerReward} blocks */ - const blocksPerReward = 10 - - /** Simulation amount of reward to distribute per staked validator */ + + /** Simulate rewards per staked validator */ + const blocksPerReward = 50 const rewardPerValidator = 0.1 - let lastRewardBlock = await ethers.provider.getBlockNumber() ethers.provider.on('block', async (block) => { if (block - blocksPerReward === lastRewardBlock) { lastRewardBlock = block - const stakedValidatorPublicKeys = await manager?.getStakedValidatorPublicKeys() + const stakedValidatorPublicKeys = await manager.getStakedValidatorPublicKeys() if (stakedValidatorPublicKeys?.length) { - + console.log(`Rewarding ${stakedValidatorPublicKeys.length} validators ${rewardPerValidator} each`) const rewardAmount = rewardPerValidator * stakedValidatorPublicKeys.length /** Perform upkeep */ - const ranUpkeepBefore = await runUpkeep({ upkeep, chainlink }) + const ranUpkeepBefore = await runUpkeep({ upkeep, keeper }) /** Fulfill oracle answer */ if (ranUpkeepBefore) { @@ -110,15 +85,15 @@ void async function () { const nextSweptExitsAmount = 0 const nextDepositedCount = 0 const nextExitedCount = 0 - await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } /** Sweep rewards before next upkeep (balance will increment silently) */ - const sweep = await chainlink.sendTransaction({ to: manager?.address, value: ethers.utils.parseEther(rewardAmount.toString()) }) + const sweep = await keeper.sendTransaction({ to: manager.address, value: ethers.utils.parseEther(rewardAmount.toString()) }) await sweep.wait() /** Perform upkeep */ - const ranUpkeepAfter = await runUpkeep({ upkeep, chainlink }) + const ranUpkeepAfter = await runUpkeep({ upkeep, keeper }) /** Fulfill oracle answer */ if (ranUpkeepAfter) { @@ -127,24 +102,33 @@ void async function () { const nextSweptExitsAmount = 0 const nextDepositedCount = 0 const nextExitedCount = 0 - await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } } } }) + /** Stake 64 from the fourth user */ + setTimeout(async () => { + const fourthUserStakeAmount = 64 + const fourthUserFees = { ...await (manager as CasimirManager).getFees() } + const fourthUserFeePercent = fourthUserFees.LINK + fourthUserFees.SSV + const fourthUserDepositAmount = fourthUserStakeAmount * ((100 + fourthUserFeePercent) / 100) + const fourthUserStake = await manager?.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(fourthUserDepositAmount.toString()) }) + await fourthUserStake?.wait() + }, 1000) + /** Perform upkeep and fulfill oracle answer after each pool is filled */ - const poolFilledFilter = { - address: manager.address, - topics: [ - ethers.utils.id('PoolFilled(address,uint32)'), - ] - } - manager.on(poolFilledFilter, async () => { + for await (const event of on(manager as unknown as EventEmitter, 'PoolFilled')) { + const [ id, details ] = event + console.log(`Pool ${id} filled at block number ${details.blockNumber}`) + + const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length + await initiatePool({ manager, oracle, index: nextValidatorIndex }) /** Perform upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, chainlink }) + const ranUpkeep = await runUpkeep({ upkeep, keeper }) /** Fulfill oracle answer */ if (ranUpkeep) { @@ -153,15 +137,7 @@ void async function () { const nextSweptExitsAmount = 0 const nextDepositedCount = 1 const nextExitedCount = 0 - await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - }) - - /** Stake 32 from the fourth user */ - const fourthUserStakeAmount = 32 - const fourthUserFees = { ...await (manager as CasimirManager).getFees() } - const fourthUserFeePercent = fourthUserFees.LINK + fourthUserFees.SSV - const fourthUserDepositAmount = fourthUserStakeAmount * ((100 + fourthUserFeePercent) / 100) - const fourthUserStake = await manager?.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(fourthUserDepositAmount.toString()) }) - await fourthUserStake?.wait() + } }() \ No newline at end of file diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index 8f8ceff09..c175c6f6f 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -105,12 +105,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint32[] private pendingPoolIds; /** IDs of pools staked */ uint32[] private stakedPoolIds; - /** All validators (ready or staked) */ - mapping(bytes => Validator) private validators; - /** Public keys of ready validators */ - bytes[] private readyValidatorPublicKeys; - /** Public keys of pending validators */ - bytes[] private pendingValidatorPublicKeys; /** Public keys of staked validators */ bytes[] private stakedValidatorPublicKeys; /** Exiting validator count */ @@ -256,7 +250,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { pool.deposits = poolCapacity; readyPoolIds.push(poolId); - emit PoolFilled(msg.sender, poolId); + emit PoolFilled(poolId); } } } @@ -360,63 +354,66 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Initiate a given count of next ready pools - * @param count The number of pools to stake + * @notice Initiate the next ready pool + * @param depositDataRoot The deposit data root + * @param publicKey The validator public key + * @param operatorIds The operator IDs + * @param sharesEncrypted The encrypted shares + * @param sharesPublicKeys The public keys of the shares + * @param signature The signature + * @param withdrawalCredentials The withdrawal credentials */ - function initiateReadyPools(uint256 count) external { - require( - msg.sender == address(upkeep), - "Only upkeep can stake pools" - ); - - // Todo move these checks to upkeep - require(readyValidatorPublicKeys.length >= count, "Not enough ready validators"); - require(readyPoolIds.length >= count, "Not enough ready pools"); - - while (count > 0) { - count--; + function initiateNextReadyPool( + bytes32 depositDataRoot, + bytes calldata publicKey, + uint32[] memory operatorIds, + bytes[] memory sharesEncrypted, + bytes[] memory sharesPublicKeys, + bytes calldata signature, + bytes calldata withdrawalCredentials + ) external { + // Todo restrict to oracle - /** Get next ready pool ID */ - uint32 poolId = readyPoolIds[0]; + require(readyPoolIds.length > 0, "No ready pools"); - /** Get next ready validator */ - bytes memory validatorPublicKey = readyValidatorPublicKeys[0]; - Validator memory validator = validators[validatorPublicKey]; + /** Get next filled pool ID */ + uint32 poolId = readyPoolIds[0]; - /** Get the pool */ - Pool storage pool = pools[poolId]; - pool.validatorPublicKey = validatorPublicKey; - - /** Move pool from ready to pending state */ - readyPoolIds.remove(0); - pendingPoolIds.push(poolId); - - /** Move validator from ready to pending state and add to pool */ - readyValidatorPublicKeys.remove(0); - pendingValidatorPublicKeys.push(validatorPublicKey); - - /** Deposit validator */ - beaconDeposit.deposit{value: pool.deposits}( - validatorPublicKey, // bytes - validator.withdrawalCredentials, // bytes - validator.signature, // bytes - validator.depositDataRoot // bytes32 - ); + /** Get the pool and update it */ + Pool storage pool = pools[poolId]; + pool.depositDataRoot = depositDataRoot; + pool.publicKey = publicKey; + pool.operatorIds = operatorIds; + pool.sharesEncrypted = sharesEncrypted; + pool.sharesPublicKeys = sharesPublicKeys; + pool.signature = signature; + pool.withdrawalCredentials = withdrawalCredentials; + + /** Move pool from ready to pending state */ + readyPoolIds.remove(0); + pendingPoolIds.push(poolId); + + /** Deposit validator */ + beaconDeposit.deposit{value: pool.deposits}( + pool.publicKey, // bytes + pool.withdrawalCredentials, // bytes + pool.signature, // bytes + pool.depositDataRoot // bytes32 + ); - /** Pay SSV fees and register validator */ - /** Todo update for v3 SSV contracts and dynamic fees */ - uint256 mockSSVFee = 5 ether; - ssvToken.approve(address(ssvNetwork), mockSSVFee); - ssvNetwork.registerValidator( - validatorPublicKey, // bytes - validator.operatorIds, // uint32[] - validator.sharesPublicKeys, // bytes[] - validator.sharesEncrypted, // bytes[], - mockSSVFee // uint256 (fees handled on user deposits) - ); + /** Pay SSV fees and register validator */ + /** Todo update for v3 SSV contracts and dynamic fees */ + uint256 mockSSVFee = 5 ether; + ssvToken.approve(address(ssvNetwork), mockSSVFee); + ssvNetwork.registerValidator( + pool.publicKey, // bytes + pool.operatorIds, // uint32[] + pool.sharesPublicKeys, // bytes[] + pool.sharesEncrypted, // bytes[], + mockSSVFee // uint256 (fees handled on user deposits) + ); - emit PoolInitiated(poolId); - } + emit PoolInitiated(poolId); } /** @@ -441,9 +438,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { pendingPoolIds.remove(0); stakedPoolIds.push(poolId); - /** Move validator from pending to staked state */ - pendingValidatorPublicKeys.remove(0); - stakedValidatorPublicKeys.push(pool.validatorPublicKey); + /** Add validator to staked state */ + stakedValidatorPublicKeys.push(pool.publicKey); emit PoolCompleted(poolId); } @@ -498,7 +494,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { require(pool.exiting, "Pool is not exiting"); - bytes memory validatorPublicKey = pool.validatorPublicKey; + bytes memory validatorPublicKey = pool.publicKey; bytes memory stakedValidatorPublicKey = stakedValidatorPublicKeys[ validatorIndex ]; @@ -515,7 +511,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Remove validator from staked and exiting states and delete */ stakedValidatorPublicKeys.remove(validatorIndex); - delete validators[validatorPublicKey]; /** Decrease exiting validators */ exitingValidatorCount--; @@ -538,67 +533,31 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Register a validator with the pool manager - * @param depositDataRoot The deposit data root - * @param publicKey The validator public key - * @param operatorIds The operator IDs - * @param sharesEncrypted The encrypted shares - * @param sharesPublicKeys The public keys of the shares - * @param signature The signature - * @param withdrawalCredentials The withdrawal credentials - */ - function registerValidator( - bytes32 depositDataRoot, - bytes calldata publicKey, - uint32[] memory operatorIds, - bytes[] memory sharesEncrypted, - bytes[] memory sharesPublicKeys, - bytes calldata signature, - bytes calldata withdrawalCredentials - ) external onlyOwner { - /** Create validator and add to ready state */ - validators[publicKey] = Validator( - depositDataRoot, - operatorIds, - sharesEncrypted, - sharesPublicKeys, - signature, - withdrawalCredentials, - 0 - ); - readyValidatorPublicKeys.push(publicKey); - - emit ValidatorRegistered(publicKey); - } - - /** - * @notice Reshare a registered validator - * @param publicKey The validator public key + * @notice Reshare a given pool's validator + * @param poolId The pool ID * @param operatorIds The operator IDs * @param sharesEncrypted The encrypted shares * @param sharesPublicKeys The public keys of the shares */ - function reshareValidator( - bytes calldata publicKey, + function resharePool( + uint32 poolId, uint32[] memory operatorIds, bytes[] memory sharesEncrypted, bytes[] memory sharesPublicKeys - ) external onlyOwner { - /** Get validator */ - Validator storage validator = validators[publicKey]; - + ) external { + Pool memory pool = pools[poolId]; require( - validator.reshareCount < 3, - "Validator has been reshared twice" + pool.reshareCount < 3, + "Pool has been reshared twice" ); - /** Update validator */ - validator.operatorIds = operatorIds; - validator.sharesEncrypted = sharesEncrypted; - validator.sharesPublicKeys = sharesPublicKeys; - validator.reshareCount++; + /** Update pool */ + pool.operatorIds = operatorIds; + pool.sharesEncrypted = sharesEncrypted; + pool.sharesPublicKeys = sharesPublicKeys; + pool.reshareCount++; - emit ValidatorReshared(publicKey); + emit PoolReshared(poolId); } /** @@ -825,18 +784,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { return pendingWithdrawalQueue; } - /** - * @notice Get ready validator public keys - * @return A list of inactive validator public keys - */ - function getReadyValidatorPublicKeys() - external - view - returns (bytes[] memory) - { - return readyValidatorPublicKeys; - } - /** * @notice Get staked validator public keys * @return A list of active validator public keys @@ -857,6 +804,14 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { return exitingValidatorCount; } + /** + * @notice Get a list of all filled pool IDs + * @return A list of all filled pool IDs + */ + function getFilledPoolIds() external view returns (uint32[] memory) { + return readyPoolIds; + } + /** * @notice Get a list of all ready pool IDs * @return A list of all ready pool IDs @@ -890,31 +845,15 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Get the pool details for a given pool ID + * @notice Get a pool by ID * @param poolId The pool ID - * @return poolDetails The pool details + * @return pool The pool details */ - function getPoolDetails( + function getPool( uint32 poolId - ) external view returns (PoolDetails memory poolDetails) { - /** Pool in open or ready state will not have validator or operators */ - Pool memory pool = pools[poolId]; - if (pool.validatorPublicKey.length == 0) { - poolDetails = PoolDetails( - pool.deposits, - pool.validatorPublicKey, - new uint32[](0), - pool.exiting - ); - } else { - Validator memory validator = validators[pool.validatorPublicKey]; - poolDetails = PoolDetails( - pool.deposits, - pool.validatorPublicKey, - validator.operatorIds, - pool.exiting - ); - } + ) external view returns (Pool memory pool) { + /** Pool in ready state will not have validator or operators */ + pool = pools[poolId]; } /** diff --git a/contracts/ethereum/src/CasimirUpkeep.sol b/contracts/ethereum/src/CasimirUpkeep.sol index 55e033c74..098b1800e 100644 --- a/contracts/ethereum/src/CasimirUpkeep.sol +++ b/contracts/ethereum/src/CasimirUpkeep.sol @@ -41,7 +41,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /*************/ /** Oracle heartbeat */ - uint256 public constant oracleHeartbeat = 0; // Will use ~half a day in production + uint256 public constant oracleHeartbeat = 0; // Will use a ~quarter of a day in production /*************/ /* Contracts */ @@ -158,18 +158,12 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { } // Todo provide required withdrawals as performData (or some optimial input, maybe validator count) - /** Check if any pools are ready */ - uint32[] memory readyPoolIds = manager.getReadyPoolIds(); - if (readyPoolIds.length > 0) { - upkeepNeeded = true; - } - // /** Check if last request has been fulfilled */ // if (latestRequestId != latestFulfilledRequestId) { // upkeepNeeded = false; // } - performData = abi.encode(requiredWithdrawals, readyPoolIds); + performData = abi.encode(requiredWithdrawals); } /** @@ -179,7 +173,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { (bool upkeepNeeded, bytes memory performData) = checkUpkeep(""); require(upkeepNeeded, "Upkeep not needed"); - (int256 requiredWithdrawals, uint32[] memory readyPoolIds) = abi.decode(performData, (int256, uint32[])); + int256 requiredWithdrawals = abi.decode(performData, (int256)); /** Initiate withdrawals and request exits */ if (requiredWithdrawals > 0) { @@ -188,11 +182,6 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { manager.completePendingWithdrawals(manager.getPendingWithdrawalQueue().length); } - /** Initiate a bounded count of ready pools */ - if (readyPoolIds.length > 0) { - manager.initiateReadyPools(readyPoolIds.length); // Todo find good bounds for batching - } - /** Placeholder request */ Functions.Request memory req; @@ -224,7 +213,6 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { if (err.length == 0) { /** Decode report */ uint256 report = abi.decode(response, (uint256)); - console.log('Report: %s', report); /** Unpack values */ uint256 activeStake = uint256(uint64(report)) * 1 gwei; diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index 575059748..bc8bb4e98 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -20,15 +20,15 @@ interface ICasimirManager { /** Pool used for running a validator */ struct Pool { uint256 deposits; - bytes validatorPublicKey; bool exiting; - } - /** Pool with details */ - struct PoolDetails { - uint256 deposits; - bytes validatorPublicKey; + uint256 reshareCount; + bytes32 depositDataRoot; + bytes publicKey; uint32[] operatorIds; - bool exiting; + bytes[] sharesEncrypted; + bytes[] sharesPublicKeys; + bytes signature; + bytes withdrawalCredentials; } /** User staking account */ struct User { @@ -40,24 +40,16 @@ interface ICasimirManager { address user; uint256 amount; } - /** Validator deposit data and shares */ - struct Validator { - bytes32 depositDataRoot; - uint32[] operatorIds; - bytes[] sharesEncrypted; - bytes[] sharesPublicKeys; - bytes signature; - bytes withdrawalCredentials; - uint256 reshareCount; - } /**********/ /* Events */ /**********/ - event PoolFilled(address sender, uint32 poolId); + event PoolFilled(uint32 poolId); event PoolInitiated(uint32 poolId); event PoolCompleted(uint32 poolId); + event PoolReshareRequested(uint32 poolId); + event PoolReshared(uint32 poolId); event PoolExitRequested(uint32 poolId); event PoolExited(uint32 poolId); event StakeDistributed(address sender, uint256 amount); @@ -65,8 +57,6 @@ interface ICasimirManager { event WithdrawalRequested(address sender, uint256 amount); event WithdrawalInitiated(address sender, uint256 amount); event WithdrawalCompleted(address sender, uint256 amount); - event ValidatorRegistered(bytes publicKey); - event ValidatorReshared(bytes publicKey); /*************/ /* Functions */ @@ -82,7 +72,15 @@ interface ICasimirManager { function completePendingWithdrawals(uint256 count) external; - function initiateReadyPools(uint256 count) external; + function initiateNextReadyPool( + bytes32 depositDataRoot, + bytes calldata publicKey, + uint32[] memory operatorIds, + bytes[] memory sharesEncrypted, + bytes[] memory sharesPublicKeys, + bytes calldata signature, + bytes calldata withdrawalCredentials + ) external; function completePendingPools(uint256 count) external; @@ -93,16 +91,6 @@ interface ICasimirManager { uint256 validatorIndex ) external; - function registerValidator( - bytes32 depositDataRoot, - bytes calldata publicKey, - uint32[] memory operatorIds, - bytes[] memory sharesEncrypted, - bytes[] memory sharesPublicKeys, - bytes calldata signature, - bytes calldata withdrawalCredentials - ) external; - function setLINKFee(uint32 fee) external; function setSSVFee(uint32 fee) external; @@ -115,11 +103,6 @@ interface ICasimirManager { function getSSVFee() external view returns (uint32); - function getReadyValidatorPublicKeys() - external - view - returns (bytes[] memory); - function getStakedValidatorPublicKeys() external view diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 9a9d76258..9216e7c18 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -1,19 +1,17 @@ import { ethers } from 'hardhat' import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' import { deployContract } from '@casimir/ethereum/helpers/deploy' -import { CasimirManager, CasimirUpkeep, MockFunctionsOracle } from '@casimir/ethereum/build/artifacts/types' +import { CasimirManager, CasimirUpkeep } from '@casimir/ethereum/build/artifacts/types' import { fulfillOracleAnswer, runUpkeep } from '@casimir/ethereum/helpers/upkeep' -import { ContractConfig, DeploymentConfig, Validator } from '@casimir/types' -import { validatorStore } from '@casimir/data' +import { initiatePool } from '@casimir/ethereum/helpers/oracle' +import { ContractConfig, DeploymentConfig } from '@casimir/types' /** Simulation amount of reward to distribute per staked validator */ const rewardPerValidator = 0.1 /** Fixture to deploy SSV manager contract */ export async function deploymentFixture() { - let manager: CasimirManager | undefined - let mockFunctionsOracle: MockFunctionsOracle | undefined - const [owner, , , , , chainlink] = await ethers.getSigners() + const [owner, , , , , keeper, oracle] = await ethers.getSigners() let config: DeploymentConfig = { CasimirManager: { address: '', @@ -64,52 +62,17 @@ export async function deploymentFixture() { // Save contract address for next loop (config[name as keyof DeploymentConfig] as ContractConfig).address = address - - // Save SSV manager for export - if (name === 'CasimirManager') manager = contract as CasimirManager - - // Save mock Functions oracle for export - if (name === 'MockFunctionsOracle') mockFunctionsOracle = contract as MockFunctionsOracle } - const upkeepAddress = await manager?.getUpkeepAddress() as string - const upkeep = await ethers.getContractAt('CasimirUpkeep', upkeepAddress) as CasimirUpkeep + const manager = await ethers.getContractAt('CasimirManager', config.CasimirManager.address as string) as CasimirManager + const upkeep = await ethers.getContractAt('CasimirUpkeep', await manager.getUpkeepAddress()) as CasimirUpkeep - return { manager: manager as CasimirManager, upkeep: upkeep as CasimirUpkeep, mockFunctionsOracle, owner, chainlink } -} - -/** Fixture to add validators */ -export async function registerValidatorsFixture() { - const { manager, upkeep, mockFunctionsOracle, owner, chainlink } = await loadFixture(deploymentFixture) - - const validators = Object.keys(validatorStore).map((key) => validatorStore[key as keyof typeof validatorStore]) as Validator[] - for (const validator of validators) { - const { - depositDataRoot, - publicKey, - operatorIds, - sharesEncrypted, - sharesPublicKeys, - signature, - withdrawalCredentials - } = validator - const registerValidator = await manager.registerValidator( - depositDataRoot, - publicKey, - operatorIds, - sharesEncrypted, - sharesPublicKeys, - signature, - withdrawalCredentials - ) - await registerValidator.wait() - } - return { manager, upkeep, mockFunctionsOracle, owner, chainlink, validators } + return { manager: manager as CasimirManager, upkeep: upkeep as CasimirUpkeep, owner, keeper, oracle } } /** Fixture to stake 16 ETH for the first user */ export async function firstUserDepositFixture() { - const { manager, upkeep, mockFunctionsOracle, owner, chainlink } = await loadFixture(registerValidatorsFixture) + const { manager, upkeep, owner, keeper, oracle } = await loadFixture(deploymentFixture) const [, firstUser] = await ethers.getSigners() const stakeAmount = 16 @@ -122,14 +85,14 @@ export async function firstUserDepositFixture() { await deposit.wait() /** Run upkeep */ - await runUpkeep({ upkeep, chainlink }) + await runUpkeep({ upkeep, keeper }) - return { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser } + return { manager, upkeep, owner, firstUser, keeper, oracle } } /** Fixture to stake 24 ETH for the second user */ export async function secondUserDepositFixture() { - const { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser } = await loadFixture(firstUserDepositFixture) + const { manager, upkeep, owner, firstUser, keeper, oracle } = await loadFixture(firstUserDepositFixture) const [, , secondUser] = await ethers.getSigners() const stakeAmount = 24 @@ -146,20 +109,24 @@ export async function secondUserDepositFixture() { const deposit = await manager.connect(secondUser).depositStake({ value }) await deposit.wait() + /** Initiate next ready pool */ + const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length + await initiatePool({ manager, oracle, index: nextValidatorIndex }) + /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, chainlink }) + const ranUpkeep = await runUpkeep({ upkeep, keeper }) /** Fulfill oracle answer */ if (ranUpkeep) { - await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } + return { manager, upkeep, owner, firstUser, secondUser, keeper, oracle } } /** Fixture to reward 0.1 ETH in total to the first and second user */ export async function rewardPostSecondUserDepositFixture() { - const { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } = await loadFixture(secondUserDepositFixture) + const { manager, upkeep, owner, firstUser, secondUser, keeper, oracle } = await loadFixture(secondUserDepositFixture) const rewardAmount = 0.1 const nextActiveStakeAmount = 32 + rewardAmount @@ -169,22 +136,22 @@ export async function rewardPostSecondUserDepositFixture() { const nextExitedCount = 0 /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, chainlink }) + const ranUpkeep = await runUpkeep({ upkeep, keeper }) /** Fulfill oracle answer */ if (ranUpkeep) { - await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } + return { manager, upkeep, owner, firstUser, secondUser, keeper, oracle } } /** Fixture to sweep 0.1 ETH to the manager */ export async function sweepPostSecondUserDepositFixture() { - const { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } = await loadFixture(secondUserDepositFixture) + const { manager, upkeep, owner, firstUser, secondUser, keeper, oracle } = await loadFixture(secondUserDepositFixture) const sweptRewards = 0.1 - const sweep = await chainlink.sendTransaction({ to: manager?.address, value: ethers.utils.parseEther(sweptRewards.toString()) }) + const sweep = await keeper.sendTransaction({ to: manager.address, value: ethers.utils.parseEther(sweptRewards.toString()) }) await sweep.wait() const nextActiveStakeAmount = 32 @@ -194,19 +161,19 @@ export async function sweepPostSecondUserDepositFixture() { const nextExitedCount = 0 /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, chainlink }) + const ranUpkeep = await runUpkeep({ upkeep, keeper }) /** Fulfill oracle answer */ if (ranUpkeep) { - await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } + return { manager, upkeep, owner, firstUser, secondUser, keeper, oracle } } /** Fixture to stake 24 ETH for the third user */ export async function thirdUserDepositFixture() { - const { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser } = await loadFixture(sweepPostSecondUserDepositFixture) + const { manager, upkeep, owner, firstUser, secondUser, keeper, oracle } = await loadFixture(sweepPostSecondUserDepositFixture) const [, , , thirdUser] = await ethers.getSigners() const stakeAmount = 24 @@ -223,20 +190,24 @@ export async function thirdUserDepositFixture() { const deposit = await manager.connect(thirdUser).depositStake({ value }) await deposit.wait() + /** Initiate next ready pool */ + const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length + await initiatePool({ manager, oracle, index: nextValidatorIndex }) + /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, chainlink }) + const ranUpkeep = await runUpkeep({ upkeep, keeper }) /** Fulfill oracle answer */ if (ranUpkeep) { - await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } + return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle } } /** Fixture to reward 0.2 ETH in total to the first, second, and third user */ export async function rewardPostThirdUserDepositFixture() { - const { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(thirdUserDepositFixture) + const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle } = await loadFixture(thirdUserDepositFixture) const rewardAmount = 0.2 const nextActiveStakeAmount = 64 + rewardAmount @@ -246,22 +217,22 @@ export async function rewardPostThirdUserDepositFixture() { const nextExitedCount = 0 /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, chainlink }) + const ranUpkeep = await runUpkeep({ upkeep, keeper }) /** Fulfill oracle answer */ if (ranUpkeep) { - await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } + return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle } } /** Fixture to sweep 0.2 ETH to the manager */ export async function sweepPostThirdUserDepositFixture() { - const { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(rewardPostThirdUserDepositFixture) + const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle } = await loadFixture(rewardPostThirdUserDepositFixture) const sweptRewards = 0.2 - const sweep = await chainlink.sendTransaction({ to: manager?.address, value: ethers.utils.parseEther(sweptRewards.toString()) }) + const sweep = await keeper.sendTransaction({ to: manager.address, value: ethers.utils.parseEther(sweptRewards.toString()) }) await sweep.wait() const nextActiveStakeAmount = 64 @@ -271,32 +242,32 @@ export async function sweepPostThirdUserDepositFixture() { const nextExitedCount = 0 /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, chainlink }) + const ranUpkeep = await runUpkeep({ upkeep, keeper }) /** Fulfill oracle answer */ if (ranUpkeep) { - await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, upkeep, mockFunctionsOracle, owner, chainlink, firstUser, secondUser, thirdUser } + return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle } } /** Fixture to withdraw 0.3 to the first user */ export async function firstUserPartialWithdrawalFixture() { - const { manager, upkeep, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(sweepPostThirdUserDepositFixture) - const openDeposits = await manager?.getOpenDeposits() + const { manager, upkeep, firstUser, secondUser, thirdUser, keeper, oracle } = await loadFixture(sweepPostThirdUserDepositFixture) + const openDeposits = await manager.getOpenDeposits() const withdraw = await manager.connect(firstUser).requestWithdrawal(openDeposits) await withdraw.wait() /** Run upkeep */ - await runUpkeep({ upkeep, chainlink }) + await runUpkeep({ upkeep, keeper }) - return { manager, upkeep, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser } + return { manager, upkeep, firstUser, secondUser, thirdUser, keeper, oracle } } /** Fixture to stake 72 for the fourth user */ export async function fourthUserDepositFixture() { - const { manager, upkeep, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser } = await loadFixture(firstUserPartialWithdrawalFixture) + const { manager, upkeep, firstUser, secondUser, thirdUser, keeper, oracle } = await loadFixture(firstUserPartialWithdrawalFixture) const [, , , , fourthUser] = await ethers.getSigners() const stakeAmount = 72 @@ -313,25 +284,31 @@ export async function fourthUserDepositFixture() { const deposit = await manager.connect(fourthUser).depositStake({ value }) await deposit.wait() + /** Initiate next ready pools (2) */ + for (let i = 0; i < 2; i++) { + const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length + await initiatePool({ manager, oracle, index: nextValidatorIndex }) + } + /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, chainlink }) + const ranUpkeep = await runUpkeep({ upkeep, keeper }) /** Fulfill oracle answer */ if (ranUpkeep) { - await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, upkeep, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser, fourthUser } + return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle } } /** Fixture to simulate stakes and rewards */ export async function simulationFixture() { - const { manager, upkeep, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser, fourthUser } = await loadFixture(fourthUserDepositFixture) + const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle } = await loadFixture(fourthUserDepositFixture) let nextActiveStakeAmount = 128 for (let i = 0; i < 5; i++) { - const stakedValidatorCount = (await manager?.getStakedValidatorPublicKeys())?.length + const stakedValidatorCount = (await manager.getStakedValidatorPublicKeys())?.length if (stakedValidatorCount) { const rewardAmount = rewardPerValidator * stakedValidatorCount nextActiveStakeAmount = Math.round((nextActiveStakeAmount + rewardAmount) * 10) / 10 // Fixes weird rounding error @@ -341,13 +318,13 @@ export async function simulationFixture() { const nextExitedCount = 0 /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, chainlink }) + const ranUpkeep = await runUpkeep({ upkeep, keeper }) /** Fulfill oracle answer */ if (ranUpkeep) { - await fulfillOracleAnswer({ upkeep, chainlink, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } } } - return { manager, upkeep, mockFunctionsOracle, chainlink, firstUser, secondUser, thirdUser, fourthUser } + return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle } } \ No newline at end of file diff --git a/contracts/ethereum/test/integration.ts b/contracts/ethereum/test/integration.ts index 893247237..c35568ab4 100644 --- a/contracts/ethereum/test/integration.ts +++ b/contracts/ethereum/test/integration.ts @@ -1,18 +1,10 @@ import { ethers } from 'hardhat' import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' import { expect } from 'chai' -import { registerValidatorsFixture, firstUserDepositFixture, rewardPostSecondUserDepositFixture, secondUserDepositFixture, thirdUserDepositFixture, rewardPostThirdUserDepositFixture, simulationFixture, firstUserPartialWithdrawalFixture, fourthUserDepositFixture, sweepPostSecondUserDepositFixture, sweepPostThirdUserDepositFixture } from './fixtures/shared' +import { firstUserDepositFixture, rewardPostSecondUserDepositFixture, secondUserDepositFixture, thirdUserDepositFixture, rewardPostThirdUserDepositFixture, simulationFixture, firstUserPartialWithdrawalFixture, fourthUserDepositFixture, sweepPostSecondUserDepositFixture, sweepPostThirdUserDepositFixture } from './fixtures/shared' describe('Casimir manager', async function () { - it('Registration adds 5 validators with 4 operators each', async function () { - const { validators } = await loadFixture(registerValidatorsFixture) - expect(validators.length).equal(5) - - const operators = validators.map((v) => v.operatorIds).flat() - expect(operators.length).equal(4 * validators.length) - }) - it('First user\'s 16.0 stake increases the total stake to 16.0', async function () { const { manager } = await loadFixture(firstUserDepositFixture) const stake = await manager.getStake() @@ -31,9 +23,9 @@ describe('Casimir manager', async function () { expect(stakedPoolIds.length).equal(1) const firstPoolId = stakedPoolIds[0] - const pool = await manager.getPoolDetails(firstPoolId) + const pool = await manager.getPool(firstPoolId) expect(ethers.utils.formatEther(pool.deposits)).equal('32.0') - expect(pool.validatorPublicKey).not.equal('0x') + expect(pool.publicKey).not.equal('0x') expect(pool.operatorIds.length).equal(4) }) @@ -75,9 +67,9 @@ describe('Casimir manager', async function () { expect(stakedPools.length).equal(2) const secondPoolId = stakedPools[1] - const pool = await manager.getPoolDetails(secondPoolId) + const pool = await manager.getPool(secondPoolId) expect(ethers.utils.formatEther(pool.deposits)).equal('32.0') - expect(pool.validatorPublicKey).not.equal('0x') + expect(pool.publicKey).not.equal('0x') expect(pool.operatorIds.length).equal(4) }) @@ -133,15 +125,15 @@ describe('Casimir manager', async function () { expect(stakedPools.length).equal(4) const thirdPoolId = stakedPools[2] - const thirdPool = await manager.getPoolDetails(thirdPoolId) + const thirdPool = await manager.getPool(thirdPoolId) expect(ethers.utils.formatEther(thirdPool.deposits)).equal('32.0') - expect(thirdPool.validatorPublicKey).not.equal('0x') + expect(thirdPool.publicKey).not.equal('0x') expect(thirdPool.operatorIds.length).equal(4) const fourthPoolId = stakedPools[3] - const fourthPool = await manager.getPoolDetails(fourthPoolId) + const fourthPool = await manager.getPool(fourthPoolId) expect(ethers.utils.formatEther(fourthPool.deposits)).equal('32.0') - expect(fourthPool.validatorPublicKey).not.equal('0x') + expect(fourthPool.publicKey).not.equal('0x') expect(fourthPool.operatorIds.length).equal(4) }) diff --git a/package-lock.json b/package-lock.json index 130feb1ca..82c0b8708 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2005,6 +2005,10 @@ "resolved": "apps/landing", "link": true }, + "node_modules/@casimir/oracle": { + "resolved": "services/oracle", + "link": true + }, "node_modules/@casimir/speculos": { "resolved": "common/speculos", "link": true @@ -27423,6 +27427,38 @@ "esbuild-windows-arm64": "0.15.18" } }, + "services/oracle": { + "name": "@casimir/oracle", + "version": "0.0.1", + "dependencies": { + "ethers": "^5.7.2" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "dotenv": "^16.0.3", + "esno": "^0.16.3", + "typescript": "^5.0.4" + } + }, + "services/oracle/node_modules/@types/node": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.0.0.tgz", + "integrity": "sha512-cD2uPTDnQQCVpmRefonO98/PPijuOnnEy5oytWJFPY1N9aJCz2wJ5kSGWO+zJoed2cY2JxQh6yBuUq4vIn61hw==", + "dev": true + }, + "services/oracle/node_modules/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, "services/users": { "name": "@casimir/users", "version": "0.0.1", diff --git a/scripts/ethereum/dev.ts b/scripts/ethereum/dev.ts index ccfe8c001..efb6e30c6 100644 --- a/scripts/ethereum/dev.ts +++ b/scripts/ethereum/dev.ts @@ -1,5 +1,5 @@ import { $, echo, chalk } from 'zx' -import { loadCredentials, getSecret } from '@casimir/helpers' +import { loadCredentials, getSecret, getFutureContractAddress, getWallet } from '@casimir/helpers' import minimist from 'minimist' /** @@ -15,19 +15,11 @@ import minimist from 'minimist' * - https://hardhat.org/hardhat-network/docs/overview */ void async function () { - /** Chain forks */ - const forks = { - ethereum: { - mainnet: 'mainnet', - testnet: 'goerli' - } - } - /** Casimir addresses */ - const addresses = { - mainnet: '', - testnet: '0xaaf5751d370d2fD5F1D5642C2f88bbFa67a29301', - local: '0x07E05700CB4E946BA50244e27f01805354cD8eF0' + /** Chain fork nonces */ + const nonces = { + mainnet: 0, + goerli: 12 } /** Load AWS credentials for configuration */ @@ -48,10 +40,17 @@ void async function () { /** Default to mock external contracts */ const mock = argv.mock !== 'false' && argv.mock !== false - /** Get shared seed */ + /** Get manager address based on shared seed nonce */ const seed = await getSecret('consensus-networks-bip39-seed') - + if (!process.env.PUBLIC_MANAGER_ADDRESS) { + const wallet = getWallet(seed) + const nonce = nonces[fork] + const managerIndex = 1 // We deploy a mock oracle before the manager + const managerAddress = await getFutureContractAddress({ wallet, nonce, index: managerIndex }) + process.env.PUBLIC_MANAGER_ADDRESS = `${managerAddress}` + } process.env.BIP39_SEED = seed + echo(chalk.bgBlackBright('Your mnemonic seed is ') + chalk.bgBlue(seed)) if (fork) { @@ -61,14 +60,6 @@ void async function () { echo(chalk.bgBlackBright('Using ') + chalk.bgBlue(fork) + chalk.bgBlackBright(' ethereum fork at ') + chalk.bgBlue(url)) } - if (mock) { - /** Use local manager address */ - process.env.PUBLIC_MANAGER_ADDRESS = addresses['local'] - } else { - /** Use ${fork} manager address */ - process.env.PUBLIC_MANAGER_ADDRESS = addresses[fork] - } - if (clean) { await $`npm run clean --workspace @casimir/ethereum` } @@ -93,4 +84,7 @@ void async function () { $`npm run dev --workspace @casimir/ethereum -- --network localhost` } + /** Start local oracle */ + process.env.ETHEREUM_RPC_URL = 'http://localhost:8545' + $`npm run dev --workspace @casimir/oracle` }() \ No newline at end of file diff --git a/scripts/local/dev.ts b/scripts/local/dev.ts index d861323bb..6d09ca8b4 100644 --- a/scripts/local/dev.ts +++ b/scripts/local/dev.ts @@ -1,5 +1,6 @@ import { $, argv, chalk, echo } from 'zx' -import { loadCredentials, getSecret, run } from '@casimir/helpers' +import { loadCredentials, getSecret, run, getFutureContractAddress, getWallet } from '@casimir/helpers' +import { ethers } from 'ethers' /** * Run a Casimir dev server. @@ -31,13 +32,6 @@ void async function () { } } - /** Casimir addresses */ - const addresses = { - mainnet: '', - testnet: '0xaaf5751d370d2fD5F1D5642C2f88bbFa67a29301', - local: '0x07E05700CB4E946BA50244e27f01805354cD8eF0' - } - /** Load AWS credentials for configuration */ await loadCredentials() @@ -97,26 +91,39 @@ void async function () { } for (const chain of chains) { - if (network) { - - /** Use ${network} manager address */ - process.env.PUBLIC_MANAGER_ADDRESS = addresses[network] + if (network) { const key = await getSecret(`consensus-networks-${chain}-${network}`) const currency = chain.slice(0, 3) const url = `https://${currency}-${network}.g.alchemy.com/v2/${key}` process.env.ETHEREUM_RPC_URL = url echo(chalk.bgBlackBright('Using ') + chalk.bgBlue(network) + chalk.bgBlackBright(` ${chain} network at ${url}`)) + + // Todo - add deployed addresses + // process.env.BIP39_SEED = seed + // process.env.PUBLIC_MANAGER_ADDRESS = `${managerAddress}` + } else if (fork) { - if (mock) { - /** Use local manager address */ - process.env.PUBLIC_MANAGER_ADDRESS = addresses['local'] - } else { - /** Use ${fork} manager address */ - process.env.PUBLIC_MANAGER_ADDRESS = addresses[fork] + process.env.ETHEREUM_RPC_URL = 'http://localhost:8545' + + const nonces = { + ethereum: { + mainnet: 0, + testnet: 12 + } } + /** Get manager addresses based on shared seed nonce */ + const seed = await getSecret('consensus-networks-bip39-seed') + const wallet = getWallet(seed) + const nonce = nonces[chain][fork] + const managerIndex = 1 // We deploy a mock oracle before the manager + const managerAddress = await getFutureContractAddress({ wallet, nonce, index: managerIndex }) + + process.env.PUBLIC_MANAGER_ADDRESS = `${managerAddress}` + process.env.BIP39_SEED = seed + const chainFork = forks[chain][fork] $`npm run dev:${chain} --clean=${clean} --mock=${mock} --fork=${chainFork}` } diff --git a/services/keys/README.md b/services/keys/README.md index 90379e1fb..cf70ad945 100644 --- a/services/keys/README.md +++ b/services/keys/README.md @@ -1,6 +1,6 @@ # @casimir/keys -Casimir key generation service and CLI +Service to run secure key operations with a RockX DKG messenger ## Usage @@ -14,7 +14,7 @@ npm install @casimir/keys @casimir/types # (Alternatively install as devDependen ### Package -Use the package in your Node.js or browser project. +Use the package in your Node.js project. ```ts import { Validator } from '@casimir/types' @@ -30,22 +30,6 @@ const options: CreateValidatorOptions = { const validators: Validator[] = await ssv.createValidator(options) ``` -### CLI - -Use the CLI to output to a file or stdout. - -```zsh -npx @casimir/keys create-validator -``` - -Options: - -- `--dkgServiceUrl` - URL of the DKG service to use for key generation (default: 'http://0.0.0.0:8000') -- `--operatorIds` - Four operator registry IDs to use for the key generation (default: [1, 2, 3, 4]) -- `--withdrawalAddress` - Validator withdrawal address (default: '0x07e05700cb4e946ba50244e27f01805354cd8ef0') - -> 🚩 If you'd like to save validator output, add ./data/validator_store.json to the current package directory. - ### Environment Variables - `DKG_SERVICE_URL` - URL of the DKG service to use for key generation (default: 'http://0.0.0.0:8000') diff --git a/services/oracle/README.md b/services/oracle/README.md new file mode 100644 index 000000000..8dc0a6bcd --- /dev/null +++ b/services/oracle/README.md @@ -0,0 +1,28 @@ +# @casimir/oracle + +DAO oracle service equipped with [@casimir/keys](../keys/README.md) + +## About + +The DAO oracle service is a [NodeJS](https://nodejs.org) application that runs a tamper-resistant oracle capable of running a [RockX distributed key generation (DKG) CLI and messenger server](https://github.com/rockx/rockx-dkg-cli) to trigger distributed key operations for Casimir validators in a trustless fashion. The oracle service code is designed to be deployed to an AMD TrustZone secure enclave (using an [AMD EPYC 7002](https://www.amd.com/en/products/epyc-7002-series-processors)) to protect the integrity and security of computation and memory (Google Cloud uses this technology to provide its flagship confidential compute product). The oracle service also watches, and is watched by, the other DAO member oracle service instances. One leader oracle service is elected to trigger key operations as needed, and the other oracle services provide tamper detection, security monitoring, and vulernability reports. The oracles report logs to IPFS to provide system transparency. + +### Colluding Operator Defense + +Within the trusted execution environment, we create shared secrets of the DKG-enabled presigned exit messages. The encrypted shares are distributed to the other DAO members, and any oracle can propose to exit a validator, and the shares are used to reconstruct and use the presigned validator exit message on-demand. + +### Malicious Leader Defense + +A theshold signature of the DAO oracles can elect a new leader as needed, by emitting a contract event detected by the node operators, so the leader can be swiftly replaced if it is at risk of compromise, or simply fails. + +### Future + +In the future, some aspects of this DAO oracle network may be improved, or become obsolete, as the underlying decentralized protocols evolve: + +- SSV contract-native, zero-coordination key operation triggers (with SSV DKG support) may augment or replace the DKG messenger server and the need for a leader oracle service +- Contract-native validator exit triggers may remove the need for presigned validator exit messages + +Eventually, the DAO responsibility may be reduceable to an entity providing voting-mechanisms for owners (stakers, operators, and DAO members) to vote on contract changes alongside underlying protocol updates. + +## Development + +Todo. diff --git a/services/oracle/package.json b/services/oracle/package.json new file mode 100644 index 000000000..bfbc1d742 --- /dev/null +++ b/services/oracle/package.json @@ -0,0 +1,21 @@ +{ + "name": "@casimir/oracle", + "version": "0.0.1", + "description": "DAO oracle service", + "main": "dist/index.js", + "scripts": { + "build": "tsc", + "start": "node dist/index.js", + "dev": "npx esno -r dotenv/config src/index.ts", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "ethers": "^5.7.2" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "dotenv": "^16.0.3", + "esno": "^0.16.3", + "typescript": "^5.0.4" + } +} \ No newline at end of file diff --git a/services/oracle/src/index.ts b/services/oracle/src/index.ts new file mode 100644 index 000000000..2d7aa19bf --- /dev/null +++ b/services/oracle/src/index.ts @@ -0,0 +1,26 @@ +import { ethers } from 'ethers' +import CasimirManagerJson from '@casimir/ethereum/build/artifacts/src/CasimirManager.sol/CasimirManager.json' +import EventEmitter, { on } from 'events' + +void async function () { + + const url = process.env.ETHEREUM_RPC_URL + if (!url) throw new Error('No rpc url provided') + const provider = new ethers.providers.JsonRpcProvider(url) + + const mnemonic = process.env.BIP39_SEED + if (!mnemonic) throw new Error('No mnemonic provided') + const wallet = ethers.Wallet.fromMnemonic(mnemonic) + + const managerAddress = process.env.PUBLIC_MANAGER_ADDRESS + if (!managerAddress) throw new Error('No manager address provided') + const manager = new ethers.Contract(managerAddress, CasimirManagerJson.abi, wallet).connect(provider) + + for await (const event of on(manager as unknown as EventEmitter, 'PoolFilled')) { + const [ id, details ] = event + console.log(`Pool ${id} filled at block number ${details.blockNumber}`) + + const pool = await manager.getPool(id) + console.log('Pool details:', pool) + } +}() diff --git a/services/oracle/tsconfig.json b/services/oracle/tsconfig.json new file mode 100644 index 000000000..5b187af65 --- /dev/null +++ b/services/oracle/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "CommonJS", + "lib": [ + "ESNext", + "DOM" + ], + "declaration": true, + "strict": true, + "noEmit": true, + "noImplicitAny": true, + "strictNullChecks": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": false, + "inlineSourceMap": true, + "inlineSources": true, + "experimentalDecorators": true, + "strictPropertyInitialization": false, + "types": ["node", "jest"], + "esModuleInterop": true, + "resolveJsonModule": true + } + } \ No newline at end of file From f7d1250630234eb38f653532d8b804434545d644 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Mon, 8 May 2023 10:59:26 -0400 Subject: [PATCH 22/78] Add dkg oracle address to contract params --- contracts/ethereum/README.md | 8 + contracts/ethereum/docs/index.md | 1958 +++-------------- contracts/ethereum/hardhat.config.ts | 10 +- .../ethereum/helpers/{oracle.ts => dkg.ts} | 4 +- contracts/ethereum/helpers/upkeep.ts | 2 +- contracts/ethereum/scripts/dev.ts | 31 +- contracts/ethereum/src/CasimirManager.sol | 185 +- contracts/ethereum/src/CasimirUpkeep.sol | 76 +- .../src/interfaces/ICasimirManager.sol | 15 +- .../ethereum/src/mock/MockFunctionsOracle.sol | 2 - contracts/ethereum/test/fixtures/shared.ts | 93 +- services/oracle/README.md | 21 +- services/oracle/src/index.ts | 2 +- 13 files changed, 514 insertions(+), 1893 deletions(-) rename contracts/ethereum/helpers/{oracle.ts => dkg.ts} (76%) diff --git a/contracts/ethereum/README.md b/contracts/ethereum/README.md index 0e9ae78c8..a97b7741d 100644 --- a/contracts/ethereum/README.md +++ b/contracts/ethereum/README.md @@ -191,3 +191,11 @@ Todo add notes. ### Operator Config Operators will need to follow the [node onboarding process from RockX](https://github.com/RockX-SG/rockx-dkg-cli/blob/main/docs/dkg_node_installation_instructions.md) to participate in DKG make their node available to new validator selections. Todo add details. + +## Todo + +- [ ] Add notes on operator selection and performance monitoring thresholds +- [ ] Add notes on operator collateral +- [ ] Add notes on relationship between operator selection, performance, and collateral +- [ ] Add notes on operator config +- [ ] Add notes on distributed key generation and oracle integration diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 17de85412..50d5ad8a0 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -1,156 +1,5 @@ # Solidity API -## CasimirUpkeep - -### oracleHeartbeat - -```solidity -uint256 oracleHeartbeat -``` - -Oracle heartbeat - -### requestCBOR - -```solidity -bytes requestCBOR -``` - -Serialized oracle source code - -### latestRequestId - -```solidity -bytes32 latestRequestId -``` - -Latest oracle request ID - -### fulfillGasLimit - -```solidity -uint32 fulfillGasLimit -``` - -Oracle fulfillment gas limit - -### constructor - -```solidity -constructor(address managerAddress, address oracleAddress, uint64 _oracleSubId) public -``` - -Constructor - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| managerAddress | address | The manager contract address | -| oracleAddress | address | The oracle contract address | -| _oracleSubId | uint64 | The oracle subscription ID | - -### generateRequest - -```solidity -function generateRequest(string source, bytes secrets, string[] args) public pure returns (bytes) -``` - -Generate a new Functions.Request(off-chain, saving gas) - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| source | string | JavaScript source code | -| secrets | bytes | Encrypted secrets payload | -| args | string[] | List of arguments accessible from within the source code | - -### setRequest - -```solidity -function setRequest(uint32 _fulfillGasLimit, uint64 _oracleSubId, bytes _requestCBOR) external -``` - -Set the bytes representing the CBOR-encoded Functions.Request - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | -| _oracleSubId | uint64 | The oracle billing subscription ID used to pay for Functions requests | -| _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | - -### checkUpkeep - -```solidity -function checkUpkeep(bytes) public view returns (bool upkeepNeeded, bytes performData) -``` - -Check if the upkeep is needed - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| upkeepNeeded | bool | True if the upkeep is needed | -| performData | bytes | | - -### performUpkeep - -```solidity -function performUpkeep(bytes) external -``` - -Perform the upkeep - -### fulfillRequest - -```solidity -function fulfillRequest(bytes32 requestId, bytes response, bytes err) internal -``` - -Callback that is invoked once the DON has resolved the request or hit an error - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The request ID, returned by sendRequest() | -| response | bytes | Aggregated response from the user code | -| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | - -### setOracleAddress - -```solidity -function setOracleAddress(address newOracleAddress) external -``` - -Update the functions oracle address - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| newOracleAddress | address | New oracle address | - -### mockFulfillRequest - -```solidity -function mockFulfillRequest(bytes32 requestId, bytes response, bytes err) external -``` - -Fulfill the request for testing - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The request ID, returned by sendRequest() | -| response | bytes | Aggregated response from the user code | -| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | - ## CasimirManager ### Token @@ -169,7 +18,7 @@ enum Token { uint256 latestActiveStake ``` -Latest active (consensus) balance reported from automation +Latest active (consensus) balance reported from upkeep ### lastPoolId @@ -290,24 +139,30 @@ Complete a given count of pending withdrawals | ---- | ---- | ----------- | | count | uint256 | The number of withdrawals to complete | -### initiateReadyPools +### initiatePoolDeposit ```solidity -function initiateReadyPools(uint256 count) external +function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external ``` -Initiate a given count of next ready pools +Initiate the next ready pool #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| count | uint256 | The number of pools to stake | +| depositDataRoot | bytes32 | The deposit data root | +| publicKey | bytes | The validator public key | +| operatorIds | uint32[] | The operator IDs | +| sharesEncrypted | bytes[] | The encrypted shares | +| sharesPublicKeys | bytes[] | The public keys of the shares | +| signature | bytes | The signature | +| withdrawalCredentials | bytes | The withdrawal credentials | -### completePendingPools +### completePoolDeposits ```solidity -function completePendingPools(uint256 count) external +function completePoolDeposits(uint256 count) external ``` Complete a given count of the next pending pools @@ -361,39 +216,19 @@ Register an operator with the pool manager | ---- | ---- | ----------- | | operatorId | uint32 | The operator ID | -### registerValidator - -```solidity -function registerValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external -``` - -Register a validator with the pool manager - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositDataRoot | bytes32 | The deposit data root | -| publicKey | bytes | The validator public key | -| operatorIds | uint32[] | The operator IDs | -| sharesEncrypted | bytes[] | The encrypted shares | -| sharesPublicKeys | bytes[] | The public keys of the shares | -| signature | bytes | The signature | -| withdrawalCredentials | bytes | The withdrawal credentials | - -### reshareValidator +### resharePool ```solidity -function reshareValidator(bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys) external +function resharePool(uint32 poolId, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys) external ``` -Reshare a registered validator +Reshare a given pool's validator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| publicKey | bytes | The validator public key | +| poolId | uint32 | The pool ID | | operatorIds | uint32[] | The operator IDs | | sharesEncrypted | bytes[] | The encrypted shares | | sharesPublicKeys | bytes[] | The public keys of the shares | @@ -586,47 +421,47 @@ Get the pending withdrawal queue | ---- | ---- | ----------- | | [0] | struct ICasimirManager.Withdrawal[] | pendingWithdrawalQueue The pending withdrawal queue | -### getReadyValidatorPublicKeys +### getStakedValidatorPublicKeys ```solidity -function getReadyValidatorPublicKeys() external view returns (bytes[]) +function getStakedValidatorPublicKeys() external view returns (bytes[]) ``` -Get ready validator public keys +Get staked validator public keys #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes[] | A list of inactive validator public keys | +| [0] | bytes[] | A list of active validator public keys | -### getStakedValidatorPublicKeys +### getExitingValidatorCount ```solidity -function getStakedValidatorPublicKeys() external view returns (bytes[]) +function getExitingValidatorCount() external view returns (uint256) ``` -Get staked validator public keys +Get the count of exiting validators #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes[] | A list of active validator public keys | +| [0] | uint256 | The count of exiting validators | -### getExitingValidatorCount +### getFilledPoolIds ```solidity -function getExitingValidatorCount() external view returns (uint256) +function getFilledPoolIds() external view returns (uint32[]) ``` -Get the count of exiting validators +Get a list of all filled pool IDs #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | The count of exiting validators | +| [0] | uint32[] | A list of all filled pool IDs | ### getReadyPoolIds @@ -684,13 +519,13 @@ Get the total manager open deposits | ---- | ---- | ----------- | | [0] | uint256 | The total manager open deposits | -### getPoolDetails +### getPool ```solidity -function getPoolDetails(uint32 poolId) external view returns (struct ICasimirManager.PoolDetails poolDetails) +function getPool(uint32 poolId) external view returns (struct ICasimirManager.Pool pool) ``` -Get the pool details for a given pool ID +Get a pool by ID #### Parameters @@ -702,7 +537,7 @@ Get the pool details for a given pool ID | Name | Type | Description | | ---- | ---- | ----------- | -| poolDetails | struct ICasimirManager.PoolDetails | The pool details | +| pool | struct ICasimirManager.Pool | The pool details | ### getLINKFee @@ -732,19 +567,19 @@ Get the SSV fee percentage to charge on each deposit | ---- | ---- | ----------- | | [0] | uint32 | The SSV fee percentage to charge on each deposit | -### getAutomationAddress +### getUpkeepAddress ```solidity -function getAutomationAddress() external view returns (address automationAddress) +function getUpkeepAddress() external view returns (address upkeepAddress) ``` -Get the automation address +Get the upkeep address #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| automationAddress | address | The automation address | +| upkeepAddress | address | The upkeep address | ### receive @@ -755,87 +590,165 @@ receive() external payable _Will be removed in production Used for mocking sweeps from Beacon to the manager_ -## ICasimirUpkeep +## CasimirUpkeep -### OracleReport +### oracleHeartbeat ```solidity -struct OracleReport { - uint256 activeStake; - uint256 sweptRewards; - uint256 sweptExits; -} +uint256 oracleHeartbeat ``` -### OCRResponse +Oracle heartbeat + +### requestCBOR ```solidity -event OCRResponse(bytes32 requestId, bytes result, bytes err) +bytes requestCBOR ``` -### checkUpkeep +Serialized oracle source code + +### latestRequestId ```solidity -function checkUpkeep(bytes checkData) external returns (bool upkeepNeeded, bytes performData) +bytes32 latestRequestId ``` -method that is simulated by the keepers to see if any work actually -needs to be performed. This method does does not actually need to be -executable, and since it is only ever simulated it can consume lots of gas. +Latest oracle request ID -_To ensure that it is never called, you may want to add the -cannotExecute modifier from KeeperBase to your implementation of this -method._ +### latestFulfilledRequestId -#### Parameters +```solidity +bytes32 latestFulfilledRequestId +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| checkData | bytes | specified in the upkeep registration so it is always the same for a registered upkeep. This can easily be broken down into specific arguments using `abi.decode`, so multiple upkeeps can be registered on the same contract and easily differentiated by the contract. | +Latest fulfilled oracle request ID -#### Return Values +### fulfillGasLimit -| Name | Type | Description | -| ---- | ---- | ----------- | -| upkeepNeeded | bool | boolean to indicate whether the keeper should call performUpkeep or not. | -| performData | bytes | bytes that the keeper should call performUpkeep with, if upkeep is needed. If you would like to encode data to decode later, try `abi.encode`. | +```solidity +uint32 fulfillGasLimit +``` -### performUpkeep +Oracle fulfillment gas limit + +### constructor ```solidity -function performUpkeep(bytes performData) external +constructor(address managerAddress, address oracleAddress, uint64 _oracleSubId) public ``` -method that is actually executed by the keepers, via the registry. -The data returned by the checkUpkeep simulation will be passed into -this method to actually be executed. - -_The input to this method should not be trusted, and the caller of the -method should not even be restricted to any single registry. Anyone should -be able call it, and the input should be validated, there is no guarantee -that the data passed in is the performData returned from checkUpkeep. This -could happen due to malicious keepers, racing keepers, or simply a state -change while the performUpkeep transaction is waiting for confirmation. -Always validate the data passed in._ +Constructor #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| performData | bytes | is the data which was passed back from the checkData simulation. If it is encoded, it can easily be decoded into other types by calling `abi.decode`. This data should not be trusted, and should be validated against the contract's current state. | +| managerAddress | address | The manager contract address | +| oracleAddress | address | The oracle contract address | +| _oracleSubId | uint64 | The oracle subscription ID | + +### generateRequest + +```solidity +function generateRequest(string source, bytes secrets, string[] args) public pure returns (bytes) +``` + +Generate a new Functions.Request(off-chain, saving gas) + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| source | string | JavaScript source code | +| secrets | bytes | Encrypted secrets payload | +| args | string[] | List of arguments accessible from within the source code | + +### setRequest + +```solidity +function setRequest(uint32 _fulfillGasLimit, uint64 _oracleSubId, bytes _requestCBOR) external +``` + +Set the bytes representing the CBOR-encoded Functions.Request + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | +| _oracleSubId | uint64 | The oracle billing subscription ID used to pay for Functions requests | +| _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | + +### checkUpkeep + +```solidity +function checkUpkeep(bytes) public view returns (bool upkeepNeeded, bytes performData) +``` + +Check if the upkeep is needed + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| upkeepNeeded | bool | True if the upkeep is needed | +| performData | bytes | | + +### performUpkeep + +```solidity +function performUpkeep(bytes) external +``` + +Perform the upkeep + +### fulfillRequest + +```solidity +function fulfillRequest(bytes32 requestId, bytes response, bytes err) internal +``` + +Callback that is invoked once the DON has resolved the request or hit an error + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | ### setOracleAddress ```solidity -function setOracleAddress(address oracleAddress) external +function setOracleAddress(address newOracleAddress) external ``` +Update the functions oracle address + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| newOracleAddress | address | New oracle address | + ### mockFulfillRequest ```solidity -function mockFulfillRequest(bytes32 requestId, bytes result, bytes err) external +function mockFulfillRequest(bytes32 requestId, bytes response, bytes err) external ``` +Fulfill the request for testing + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | + ## ICasimirManager ### ProcessedDeposit @@ -862,19 +775,15 @@ struct Fees { ```solidity struct Pool { uint256 deposits; - bytes validatorPublicKey; bool exiting; -} -``` - -### PoolDetails - -```solidity -struct PoolDetails { - uint256 deposits; - bytes validatorPublicKey; + uint256 reshareCount; + bytes32 depositDataRoot; + bytes publicKey; uint32[] operatorIds; - bool exiting; + bytes[] sharesEncrypted; + bytes[] sharesPublicKeys; + bytes signature; + bytes withdrawalCredentials; } ``` @@ -896,24 +805,10 @@ struct Withdrawal { } ``` -### Validator - -```solidity -struct Validator { - bytes32 depositDataRoot; - uint32[] operatorIds; - bytes[] sharesEncrypted; - bytes[] sharesPublicKeys; - bytes signature; - bytes withdrawalCredentials; - uint256 reshareCount; -} -``` - -### PoolFilled +### PoolReady ```solidity -event PoolFilled(address sender, uint32 poolId) +event PoolReady(uint32 poolId) ``` ### PoolInitiated @@ -928,6 +823,18 @@ event PoolInitiated(uint32 poolId) event PoolCompleted(uint32 poolId) ``` +### PoolReshareRequested + +```solidity +event PoolReshareRequested(uint32 poolId) +``` + +### PoolReshared + +```solidity +event PoolReshared(uint32 poolId) +``` + ### PoolExitRequested ```solidity @@ -970,18 +877,6 @@ event WithdrawalInitiated(address sender, uint256 amount) event WithdrawalCompleted(address sender, uint256 amount) ``` -### ValidatorRegistered - -```solidity -event ValidatorRegistered(bytes publicKey) -``` - -### ValidatorReshared - -```solidity -event ValidatorReshared(bytes publicKey) -``` - ### depositStake ```solidity @@ -1012,16 +907,16 @@ function initiateRequestedWithdrawals(uint256 count) external function completePendingWithdrawals(uint256 count) external ``` -### initiateReadyPools +### initiatePoolDeposit ```solidity -function initiateReadyPools(uint256 count) external +function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external ``` -### completePendingPools +### completePoolDeposits ```solidity -function completePendingPools(uint256 count) external +function completePoolDeposits(uint256 count) external ``` ### requestPoolExits @@ -1036,12 +931,6 @@ function requestPoolExits(uint256 count) external function completePoolExit(uint256 poolIndex, uint256 validatorIndex) external ``` -### registerValidator - -```solidity -function registerValidator(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external -``` - ### setLINKFee ```solidity @@ -1078,12 +967,6 @@ function getLINKFee() external view returns (uint32) function getSSVFee() external view returns (uint32) ``` -### getReadyValidatorPublicKeys - -```solidity -function getReadyValidatorPublicKeys() external view returns (bytes[]) -``` - ### getStakedValidatorPublicKeys ```solidity @@ -1174,6 +1057,93 @@ function getRequestedWithdrawalQueue() external view returns (struct ICasimirMan function getPendingWithdrawalQueue() external view returns (struct ICasimirManager.Withdrawal[]) ``` +## ICasimirUpkeep + +### OracleReport + +```solidity +struct OracleReport { + uint256 activeStake; + uint256 sweptRewards; + uint256 sweptExits; +} +``` + +### OCRResponse + +```solidity +event OCRResponse(bytes32 requestId, bytes result, bytes err) +``` + +### UpkeepPerformed + +```solidity +event UpkeepPerformed(bytes performData) +``` + +### checkUpkeep + +```solidity +function checkUpkeep(bytes checkData) external returns (bool upkeepNeeded, bytes performData) +``` + +method that is simulated by the keepers to see if any work actually +needs to be performed. This method does does not actually need to be +executable, and since it is only ever simulated it can consume lots of gas. + +_To ensure that it is never called, you may want to add the +cannotExecute modifier from KeeperBase to your implementation of this +method._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| checkData | bytes | specified in the upkeep registration so it is always the same for a registered upkeep. This can easily be broken down into specific arguments using `abi.decode`, so multiple upkeeps can be registered on the same contract and easily differentiated by the contract. | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| upkeepNeeded | bool | boolean to indicate whether the keeper should call performUpkeep or not. | +| performData | bytes | bytes that the keeper should call performUpkeep with, if upkeep is needed. If you would like to encode data to decode later, try `abi.encode`. | + +### performUpkeep + +```solidity +function performUpkeep(bytes performData) external +``` + +method that is actually executed by the keepers, via the registry. +The data returned by the checkUpkeep simulation will be passed into +this method to actually be executed. + +_The input to this method should not be trusted, and the caller of the +method should not even be restricted to any single registry. Anyone should +be able call it, and the input should be validated, there is no guarantee +that the data passed in is the performData returned from checkUpkeep. This +could happen due to malicious keepers, racing keepers, or simply a state +change while the performUpkeep transaction is waiting for confirmation. +Always validate the data passed in._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| performData | bytes | is the data which was passed back from the checkData simulation. If it is encoded, it can easily be decoded into other types by calling `abi.decode`. This data should not be trusted, and should be validated against the contract's current state. | + +### setOracleAddress + +```solidity +function setOracleAddress(address oracleAddress) external +``` + +### mockFulfillRequest + +```solidity +function mockFulfillRequest(bytes32 requestId, bytes result, bytes err) external +``` + ## Types32Array ### remove @@ -1242,1234 +1212,116 @@ _Send ETH to a user_ | user | address | The user address | | amount | uint256 | The amount of stake to send | -## Functions +## IDepositContract -### DEFAULT_BUFFER_SIZE +### DepositEvent ```solidity -uint256 DEFAULT_BUFFER_SIZE +event DepositEvent(bytes pubkey, bytes withdrawal_credentials, bytes amount, bytes signature, bytes index) ``` -### Location - -```solidity -enum Location { - Inline, - Remote -} -``` +A processed deposit event. -### CodeLanguage +### deposit ```solidity -enum CodeLanguage { - JavaScript -} +function deposit(bytes pubkey, bytes withdrawal_credentials, bytes signature, bytes32 deposit_data_root) external payable ``` -### Request +Submit a Phase 0 DepositData object. -```solidity -struct Request { - enum Functions.Location codeLocation; - enum Functions.Location secretsLocation; - enum Functions.CodeLanguage language; - string source; - bytes secrets; - string[] args; -} -``` +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| pubkey | bytes | A BLS12-381 public key. | +| withdrawal_credentials | bytes | Commitment to a public key for withdrawals. | +| signature | bytes | A BLS12-381 signature. | +| deposit_data_root | bytes32 | The SHA-256 hash of the SSZ-encoded DepositData object. Used as a protection against malformed input. | -### EmptySource +### get_deposit_root ```solidity -error EmptySource() +function get_deposit_root() external view returns (bytes32) ``` -### EmptyUrl - -```solidity -error EmptyUrl() -``` - -### EmptySecrets - -```solidity -error EmptySecrets() -``` - -### EmptyArgs - -```solidity -error EmptyArgs() -``` - -### NoInlineSecrets - -```solidity -error NoInlineSecrets() -``` - -### encodeCBOR - -```solidity -function encodeCBOR(struct Functions.Request self) internal pure returns (bytes) -``` - -Encodes a Request to CBOR encoded bytes - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct Functions.Request | The request to encode | +Query the current deposit root hash. #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes | CBOR encoded bytes | - -### initializeRequest - -```solidity -function initializeRequest(struct Functions.Request self, enum Functions.Location location, enum Functions.CodeLanguage language, string source) internal pure -``` - -Initializes a Chainlink Functions Request - -_Sets the codeLocation and code on the request_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct Functions.Request | The uninitialized request | -| location | enum Functions.Location | The user provided source code location | -| language | enum Functions.CodeLanguage | The programming language of the user code | -| source | string | The user provided source code or a url | - -### initializeRequestForInlineJavaScript - -```solidity -function initializeRequestForInlineJavaScript(struct Functions.Request self, string javaScriptSource) internal pure -``` - -Initializes a Chainlink Functions Request - -_Simplified version of initializeRequest for PoC_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct Functions.Request | The uninitialized request | -| javaScriptSource | string | The user provided JS code (must not be empty) | - -### addRemoteSecrets - -```solidity -function addRemoteSecrets(struct Functions.Request self, bytes encryptedSecretsURLs) internal pure -``` - -Adds Remote user encrypted secrets to a Request - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| self | struct Functions.Request | The initialized request | -| encryptedSecretsURLs | bytes | Encrypted comma-separated string of URLs pointing to off-chain secrets | +| [0] | bytes32 | The deposit root hash. | -### addArgs +### get_deposit_count ```solidity -function addArgs(struct Functions.Request self, string[] args) internal pure +function get_deposit_count() external view returns (bytes) ``` -Adds args for the user run function +Query the current deposit count. -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| self | struct Functions.Request | The initialized request | -| args | string[] | The array of args (must not be empty) | - -## FunctionsClient - -Contract writers can inherit this contract in order to create Chainlink Functions requests - -### s_oracle - -```solidity -contract FunctionsOracleInterface s_oracle -``` - -### s_pendingRequests - -```solidity -mapping(bytes32 => address) s_pendingRequests -``` - -### RequestSent +| [0] | bytes | The deposit count encoded as a little endian 64-bit number. | -```solidity -event RequestSent(bytes32 id) -``` +## IWETH9 -### RequestFulfilled +### deposit ```solidity -event RequestFulfilled(bytes32 id) +function deposit() external payable ``` -### SenderIsNotRegistry - -```solidity -error SenderIsNotRegistry() -``` +Deposit ether to get wrapped ether -### RequestIsAlreadyPending +### withdraw ```solidity -error RequestIsAlreadyPending() +function withdraw(uint256) external ``` -### RequestIsNotPending +Withdraw wrapped ether to get ether -```solidity -error RequestIsNotPending() -``` +## MockFunctionsOracle ### constructor ```solidity -constructor(address oracle) internal -``` - -### getDONPublicKey - -```solidity -function getDONPublicKey() external view returns (bytes) +constructor() public ``` -Returns the DON's secp256k1 public key used to encrypt secrets - -_All Oracles nodes have the corresponding private key -needed to decrypt the secrets encrypted with the public key_ - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes | publicKey DON's public key | - -### estimateCost +### getRegistry ```solidity -function estimateCost(struct Functions.Request req, uint64 subscriptionId, uint32 gasLimit, uint256 gasPrice) public view returns (uint96) +function getRegistry() external view returns (address) ``` -Estimate the total cost that will be charged to a subscription to make a request: gas re-imbursement, plus DON fee, plus Registry fee - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| req | struct Functions.Request | The initialized Functions.Request | -| subscriptionId | uint64 | The subscription ID | -| gasLimit | uint32 | gas limit for the fulfillment callback | -| gasPrice | uint256 | | +Returns the address of the registry contract #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint96 | billedCost Cost in Juels (1e18) of LINK | +| [0] | address | address The address of the registry contract | ### sendRequest ```solidity -function sendRequest(struct Functions.Request req, uint64 subscriptionId, uint32 gasLimit) internal returns (bytes32) -``` - -Sends a Chainlink Functions request to the stored oracle address - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| req | struct Functions.Request | The initialized Functions.Request | -| subscriptionId | uint64 | The subscription ID | -| gasLimit | uint32 | gas limit for the fulfillment callback | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes32 | requestId The generated request ID | - -### fulfillRequest - -```solidity -function fulfillRequest(bytes32 requestId, bytes response, bytes err) internal virtual -``` - -User defined function to handle a response - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The request ID, returned by sendRequest() | -| response | bytes | Aggregated response from the user code | -| err | bytes | Aggregated error from the user code or from the execution pipeline Either response or error parameter will be set, but never both | - -### handleOracleFulfillment - -```solidity -function handleOracleFulfillment(bytes32 requestId, bytes response, bytes err) external -``` - -Chainlink Functions response handler called by the designated transmitter node in an OCR round. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The requestId returned by FunctionsClient.sendRequest(). | -| response | bytes | Aggregated response from the user code. | -| err | bytes | Aggregated error either from the user code or from the execution pipeline. Either response or error parameter will be set, but never both. | - -### setOracle - -```solidity -function setOracle(address oracle) internal -``` - -Sets the stored Oracle address - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| oracle | address | The address of Functions Oracle contract | - -### getChainlinkOracleAddress - -```solidity -function getChainlinkOracleAddress() internal view returns (address) -``` - -Gets the stored address of the oracle contract - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | address | The address of the oracle contract | - -### addExternalRequest - -```solidity -function addExternalRequest(address oracleAddress, bytes32 requestId) internal -``` - -Allows for a request which was created on another contract to be fulfilled -on this contract - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| oracleAddress | address | The address of the oracle contract that will fulfill the request | -| requestId | bytes32 | The request ID used for the response | - -### recordChainlinkFulfillment - -```solidity -modifier recordChainlinkFulfillment(bytes32 requestId) -``` - -_Reverts if the sender is not the oracle that serviced the request. -Emits RequestFulfilled event._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The request ID for fulfillment | - -### notPendingRequest - -```solidity -modifier notPendingRequest(bytes32 requestId) -``` - -_Reverts if the request is already pending_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The request ID for fulfillment | - -## FunctionsBillingRegistryInterface - -### RequestBilling - -```solidity -struct RequestBilling { - uint64 subscriptionId; - address client; - uint32 gasLimit; - uint256 gasPrice; -} -``` - -### FulfillResult - -```solidity -enum FulfillResult { - USER_SUCCESS, - USER_ERROR, - INVALID_REQUEST_ID -} -``` - -### getRequestConfig - -```solidity -function getRequestConfig() external view returns (uint32, address[]) -``` - -Get configuration relevant for making requests - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32 | uint32 global max for request gas limit | -| [1] | address[] | address[] list of registered DONs | - -### getRequiredFee - -```solidity -function getRequiredFee(bytes data, struct FunctionsBillingRegistryInterface.RequestBilling billing) external view returns (uint96) -``` - -Determine the charged fee that will be paid to the Registry owner - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| billing | struct FunctionsBillingRegistryInterface.RequestBilling | The request's billing configuration | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint96 | fee Cost in Juels (1e18) of LINK | - -### estimateCost - -```solidity -function estimateCost(uint32 gasLimit, uint256 gasPrice, uint96 donFee, uint96 registryFee) external view returns (uint96) -``` - -Estimate the total cost to make a request: gas re-imbursement, plus DON fee, plus Registry fee - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| gasLimit | uint32 | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| gasPrice | uint256 | The request's billing configuration | -| donFee | uint96 | Fee charged by the DON that is paid to Oracle Node | -| registryFee | uint96 | Fee charged by the DON that is paid to Oracle Node | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint96 | costEstimate Cost in Juels (1e18) of LINK | - -### startBilling - -```solidity -function startBilling(bytes data, struct FunctionsBillingRegistryInterface.RequestBilling billing) external returns (bytes32) +function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) ``` -Initiate the billing process for an Functions request - -_Only callable by a node that has been approved on the Registry_ +Sends a request (encoded as data) using the provided subscriptionId #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| billing | struct FunctionsBillingRegistryInterface.RequestBilling | Billing configuration for the request | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes32 | requestId - A unique identifier of the request. Can be used to match a request to a response in fulfillRequest. | - -### fulfillAndBill - -```solidity -function fulfillAndBill(bytes32 requestId, bytes response, bytes err, address transmitter, address[31] signers, uint8 signerCount, uint256 reportValidationGas, uint256 initialGas) external returns (enum FunctionsBillingRegistryInterface.FulfillResult) -``` - -Finalize billing process for an Functions request by sending a callback to the Client contract and then charging the subscription - -_Only callable by a node that has been approved on the Registry -simulated offchain to determine if sufficient balance is present to fulfill the request_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | identifier for the request that was generated by the Registry in the beginBilling commitment | -| response | bytes | response data from DON consensus | -| err | bytes | error from DON consensus | -| transmitter | address | the Oracle who sent the report | -| signers | address[31] | the Oracles who had a part in generating the report | -| signerCount | uint8 | the number of signers on the report | -| reportValidationGas | uint256 | the amount of gas used for the report validation. Cost is split by all fulfillments on the report. | -| initialGas | uint256 | the initial amount of gas that should be used as a baseline to charge the single fulfillment for execution cost | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | enum FunctionsBillingRegistryInterface.FulfillResult | result fulfillment result | - -### getSubscriptionOwner - -```solidity -function getSubscriptionOwner(uint64 subscriptionId) external view returns (address owner) -``` - -Gets subscription owner. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| subscriptionId | uint64 | - ID of the subscription | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| owner | address | - owner of the subscription. | - -## FunctionsClientInterface - -### getDONPublicKey - -```solidity -function getDONPublicKey() external view returns (bytes) -``` - -Returns the DON's secp256k1 public key used to encrypt secrets - -_All Oracles nodes have the corresponding private key -needed to decrypt the secrets encrypted with the public key_ - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes | publicKey DON's public key | - -### handleOracleFulfillment - -```solidity -function handleOracleFulfillment(bytes32 requestId, bytes response, bytes err) external -``` - -Chainlink Functions response handler called by the designated transmitter node in an OCR round. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The requestId returned by FunctionsClient.sendRequest(). | -| response | bytes | Aggregated response from the user code. | -| err | bytes | Aggregated error either from the user code or from the execution pipeline. Either response or error parameter will be set, but never both. | - -## FunctionsOracleInterface - -### getRegistry - -```solidity -function getRegistry() external view returns (address) -``` - -Gets the stored billing registry address - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | address | registryAddress The address of Chainlink Functions billing registry contract | - -### setRegistry - -```solidity -function setRegistry(address registryAddress) external -``` - -Sets the stored billing registry address - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| registryAddress | address | The new address of Chainlink Functions billing registry contract | - -### getDONPublicKey - -```solidity -function getDONPublicKey() external view returns (bytes) -``` - -Returns the DON's secp256k1 public key that is used to encrypt secrets - -_All nodes on the DON have the corresponding private key -needed to decrypt the secrets encrypted with the public key_ - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes | publicKey the DON's public key | - -### setDONPublicKey - -```solidity -function setDONPublicKey(bytes donPublicKey) external -``` - -Sets DON's secp256k1 public key used to encrypt secrets - -_Used to rotate the key_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| donPublicKey | bytes | The new public key | - -### setNodePublicKey - -```solidity -function setNodePublicKey(address node, bytes publicKey) external -``` - -Sets a per-node secp256k1 public key used to encrypt secrets for that node - -_Callable only by contract owner and DON members_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| node | address | node's address | -| publicKey | bytes | node's public key | - -### deleteNodePublicKey - -```solidity -function deleteNodePublicKey(address node) external -``` - -Deletes node's public key - -_Callable only by contract owner or the node itself_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| node | address | node's address | - -### getAllNodePublicKeys - -```solidity -function getAllNodePublicKeys() external view returns (address[], bytes[]) -``` - -Return two arrays of equal size containing DON members' addresses and their corresponding -public keys (or empty byte arrays if per-node key is not defined) - -### getRequiredFee - -```solidity -function getRequiredFee(bytes data, struct FunctionsBillingRegistryInterface.RequestBilling billing) external view returns (uint96) -``` - -Determine the fee charged by the DON that will be split between signing Node Operators for servicing the request - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| billing | struct FunctionsBillingRegistryInterface.RequestBilling | The request's billing configuration | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint96 | fee Cost in Juels (1e18) of LINK | - -### estimateCost - -```solidity -function estimateCost(uint64 subscriptionId, bytes data, uint32 gasLimit, uint256 gasPrice) external view returns (uint96) -``` - -Estimate the total cost that will be charged to a subscription to make a request: gas re-imbursement, plus DON fee, plus Registry fee - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| gasLimit | uint32 | Gas limit for the fulfillment callback | -| gasPrice | uint256 | | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint96 | billedCost Cost in Juels (1e18) of LINK | - -### sendRequest - -```solidity -function sendRequest(uint64 subscriptionId, bytes data, uint32 gasLimit) external returns (bytes32) -``` - -Sends a request (encoded as data) using the provided subscriptionId - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| gasLimit | uint32 | Gas limit for the fulfillment callback | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes32 | requestId A unique request identifier (unique per DON) | - -## IDepositContract - -### DepositEvent - -```solidity -event DepositEvent(bytes pubkey, bytes withdrawal_credentials, bytes amount, bytes signature, bytes index) -``` - -A processed deposit event. - -### deposit - -```solidity -function deposit(bytes pubkey, bytes withdrawal_credentials, bytes signature, bytes32 deposit_data_root) external payable -``` - -Submit a Phase 0 DepositData object. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| pubkey | bytes | A BLS12-381 public key. | -| withdrawal_credentials | bytes | Commitment to a public key for withdrawals. | -| signature | bytes | A BLS12-381 signature. | -| deposit_data_root | bytes32 | The SHA-256 hash of the SSZ-encoded DepositData object. Used as a protection against malformed input. | - -### get_deposit_root - -```solidity -function get_deposit_root() external view returns (bytes32) -``` - -Query the current deposit root hash. - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes32 | The deposit root hash. | - -### get_deposit_count - -```solidity -function get_deposit_count() external view returns (bytes) -``` - -Query the current deposit count. - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes | The deposit count encoded as a little endian 64-bit number. | - -## IWETH9 - -### deposit - -```solidity -function deposit() external payable -``` - -Deposit ether to get wrapped ether - -### withdraw - -```solidity -function withdraw(uint256) external -``` - -Withdraw wrapped ether to get ether - -## Buffer - -_A library for working with mutable byte buffers in Solidity. - -Byte buffers are mutable and expandable, and provide a variety of primitives -for appending to them. At any time you can fetch a bytes object containing the -current contents of the buffer. The bytes object should not be stored between -operations, as it may change due to resizing of the buffer._ - -### buffer - -```solidity -struct buffer { - bytes buf; - uint256 capacity; -} -``` - -### init - -```solidity -function init(struct Buffer.buffer buf, uint256 capacity) internal pure returns (struct Buffer.buffer) -``` - -_Initializes a buffer with an initial capacity._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| buf | struct Buffer.buffer | The buffer to initialize. | -| capacity | uint256 | The number of bytes of space to allocate the buffer. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | struct Buffer.buffer | The buffer, for chaining. | - -### fromBytes - -```solidity -function fromBytes(bytes b) internal pure returns (struct Buffer.buffer) -``` - -_Initializes a new buffer from an existing bytes object. - Changes to the buffer may mutate the original value._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| b | bytes | The bytes object to initialize the buffer with. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | struct Buffer.buffer | A new buffer. | - -### truncate - -```solidity -function truncate(struct Buffer.buffer buf) internal pure returns (struct Buffer.buffer) -``` - -_Sets buffer length to 0._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| buf | struct Buffer.buffer | The buffer to truncate. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | struct Buffer.buffer | The original buffer, for chaining.. | - -### append - -```solidity -function append(struct Buffer.buffer buf, bytes data, uint256 len) internal pure returns (struct Buffer.buffer) -``` - -_Appends len bytes of a byte string to a buffer. Resizes if doing so would exceed - the capacity of the buffer._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| buf | struct Buffer.buffer | The buffer to append to. | -| data | bytes | The data to append. | -| len | uint256 | The number of bytes to copy. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | struct Buffer.buffer | The original buffer, for chaining. | - -### append - -```solidity -function append(struct Buffer.buffer buf, bytes data) internal pure returns (struct Buffer.buffer) -``` - -_Appends a byte string to a buffer. Resizes if doing so would exceed - the capacity of the buffer._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| buf | struct Buffer.buffer | The buffer to append to. | -| data | bytes | The data to append. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | struct Buffer.buffer | The original buffer, for chaining. | - -### appendUint8 - -```solidity -function appendUint8(struct Buffer.buffer buf, uint8 data) internal pure returns (struct Buffer.buffer) -``` - -_Appends a byte to the buffer. Resizes if doing so would exceed the - capacity of the buffer._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| buf | struct Buffer.buffer | The buffer to append to. | -| data | uint8 | The data to append. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | struct Buffer.buffer | The original buffer, for chaining. | - -### appendBytes20 - -```solidity -function appendBytes20(struct Buffer.buffer buf, bytes20 data) internal pure returns (struct Buffer.buffer) -``` - -_Appends a bytes20 to the buffer. Resizes if doing so would exceed - the capacity of the buffer._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| buf | struct Buffer.buffer | The buffer to append to. | -| data | bytes20 | The data to append. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | struct Buffer.buffer | The original buffer, for chhaining. | - -### appendBytes32 - -```solidity -function appendBytes32(struct Buffer.buffer buf, bytes32 data) internal pure returns (struct Buffer.buffer) -``` - -_Appends a bytes32 to the buffer. Resizes if doing so would exceed - the capacity of the buffer._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| buf | struct Buffer.buffer | The buffer to append to. | -| data | bytes32 | The data to append. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | struct Buffer.buffer | The original buffer, for chaining. | - -### appendInt - -```solidity -function appendInt(struct Buffer.buffer buf, uint256 data, uint256 len) internal pure returns (struct Buffer.buffer) -``` - -_Appends a byte to the end of the buffer. Resizes if doing so would - exceed the capacity of the buffer._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| buf | struct Buffer.buffer | The buffer to append to. | -| data | uint256 | The data to append. | -| len | uint256 | The number of bytes to write (right-aligned). | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | struct Buffer.buffer | The original buffer. | - -## CBOR - -_A library for populating CBOR encoded payload in Solidity. - -https://datatracker.ietf.org/doc/html/rfc7049 - -The library offers various write* and start* methods to encode values of different types. -The resulted buffer can be obtained with data() method. -Encoding of primitive types is staightforward, whereas encoding of sequences can result -in an invalid CBOR if start/write/end flow is violated. -For the purpose of gas saving, the library does not verify start/write/end flow internally, -except for nested start/end pairs._ - -### CBORBuffer - -```solidity -struct CBORBuffer { - struct Buffer.buffer buf; - uint256 depth; -} -``` - -### create - -```solidity -function create(uint256 capacity) internal pure returns (struct CBOR.CBORBuffer cbor) -``` - -### data - -```solidity -function data(struct CBOR.CBORBuffer buf) internal pure returns (bytes) -``` - -### writeUInt256 - -```solidity -function writeUInt256(struct CBOR.CBORBuffer buf, uint256 value) internal pure -``` - -### writeInt256 - -```solidity -function writeInt256(struct CBOR.CBORBuffer buf, int256 value) internal pure -``` - -### writeUInt64 - -```solidity -function writeUInt64(struct CBOR.CBORBuffer buf, uint64 value) internal pure -``` - -### writeInt64 - -```solidity -function writeInt64(struct CBOR.CBORBuffer buf, int64 value) internal pure -``` - -### writeBytes - -```solidity -function writeBytes(struct CBOR.CBORBuffer buf, bytes value) internal pure -``` - -### writeString - -```solidity -function writeString(struct CBOR.CBORBuffer buf, string value) internal pure -``` - -### writeBool - -```solidity -function writeBool(struct CBOR.CBORBuffer buf, bool value) internal pure -``` - -### writeNull - -```solidity -function writeNull(struct CBOR.CBORBuffer buf) internal pure -``` - -### writeUndefined - -```solidity -function writeUndefined(struct CBOR.CBORBuffer buf) internal pure -``` - -### startArray - -```solidity -function startArray(struct CBOR.CBORBuffer buf) internal pure -``` - -### startFixedArray - -```solidity -function startFixedArray(struct CBOR.CBORBuffer buf, uint64 length) internal pure -``` - -### startMap - -```solidity -function startMap(struct CBOR.CBORBuffer buf) internal pure -``` - -### startFixedMap - -```solidity -function startFixedMap(struct CBOR.CBORBuffer buf, uint64 length) internal pure -``` - -### endSequence - -```solidity -function endSequence(struct CBOR.CBORBuffer buf) internal pure -``` - -### writeKVString - -```solidity -function writeKVString(struct CBOR.CBORBuffer buf, string key, string value) internal pure -``` - -### writeKVBytes - -```solidity -function writeKVBytes(struct CBOR.CBORBuffer buf, string key, bytes value) internal pure -``` - -### writeKVUInt256 - -```solidity -function writeKVUInt256(struct CBOR.CBORBuffer buf, string key, uint256 value) internal pure -``` - -### writeKVInt256 - -```solidity -function writeKVInt256(struct CBOR.CBORBuffer buf, string key, int256 value) internal pure -``` - -### writeKVUInt64 - -```solidity -function writeKVUInt64(struct CBOR.CBORBuffer buf, string key, uint64 value) internal pure -``` - -### writeKVInt64 - -```solidity -function writeKVInt64(struct CBOR.CBORBuffer buf, string key, int64 value) internal pure -``` - -### writeKVBool - -```solidity -function writeKVBool(struct CBOR.CBORBuffer buf, string key, bool value) internal pure -``` - -### writeKVNull - -```solidity -function writeKVNull(struct CBOR.CBORBuffer buf, string key) internal pure -``` - -### writeKVUndefined - -```solidity -function writeKVUndefined(struct CBOR.CBORBuffer buf, string key) internal pure -``` - -### writeKVMap - -```solidity -function writeKVMap(struct CBOR.CBORBuffer buf, string key) internal pure -``` - -### writeKVArray - -```solidity -function writeKVArray(struct CBOR.CBORBuffer buf, string key) internal pure -``` - -## MockFunctionsOracle - -### constructor - -```solidity -constructor() public -``` - -### sendRequest - -```solidity -function sendRequest(uint64 subscriptionId, bytes data, uint32 gasLimit) external returns (bytes32 requestId) -``` - -Sends a request (encoded as data) using the provided subscriptionId - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| gasLimit | uint32 | Gas limit for the fulfillment callback | +| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | +| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| _gasLimit | uint32 | Gas limit for the fulfillment callback | #### Return Values @@ -2477,191 +1329,3 @@ Sends a request (encoded as data) using the provided subscriptionId | ---- | ---- | ----------- | | requestId | bytes32 | A unique request identifier (unique per DON) | -## MockKeeperRegistry - -### registerUpkeep - -```solidity -function registerUpkeep(address target, uint32 gasLimit, address admin, bytes checkData, bytes offchainConfig) external view returns (uint256 id) -``` - -### getState - -```solidity -function getState() external pure returns (struct State state, struct OnchainConfig config, address[] signers, address[] transmitters, uint8 f) -``` - -## OnchainConfig - -```solidity -struct OnchainConfig { - uint32 paymentPremiumPPB; - uint32 flatFeeMicroLink; - uint32 checkGasLimit; - uint24 stalenessSeconds; - uint16 gasCeilingMultiplier; - uint96 minUpkeepSpend; - uint32 maxPerformGas; - uint32 maxCheckDataSize; - uint32 maxPerformDataSize; - uint256 fallbackGasPrice; - uint256 fallbackLinkPrice; - address transcoder; - address registrar; -} -``` - -## State - -```solidity -struct State { - uint32 nonce; - uint96 ownerLinkBalance; - uint256 expectedLinkBalance; - uint96 totalPremium; - uint256 numUpkeeps; - uint32 configCount; - uint32 latestConfigBlockNumber; - bytes32 latestConfigDigest; - uint32 latestEpoch; - bool paused; -} -``` - -## UpkeepInfo - -```solidity -struct UpkeepInfo { - address target; - uint32 executeGas; - bytes checkData; - uint96 balance; - address admin; - uint64 maxValidBlocknumber; - uint32 lastPerformBlockNumber; - uint96 amountSpent; - bool paused; - bytes offchainConfig; -} -``` - -## UpkeepFailureReason - -```solidity -enum UpkeepFailureReason { - NONE, - UPKEEP_CANCELLED, - UPKEEP_PAUSED, - TARGET_CHECK_REVERTED, - UPKEEP_NOT_NEEDED, - PERFORM_DATA_EXCEEDS_LIMIT, - INSUFFICIENT_BALANCE -} -``` - -## KeeperRegistryBaseInterface - -### registerUpkeep - -```solidity -function registerUpkeep(address target, uint32 gasLimit, address admin, bytes checkData, bytes offchainConfig) external returns (uint256 id) -``` - -### cancelUpkeep - -```solidity -function cancelUpkeep(uint256 id) external -``` - -### pauseUpkeep - -```solidity -function pauseUpkeep(uint256 id) external -``` - -### unpauseUpkeep - -```solidity -function unpauseUpkeep(uint256 id) external -``` - -### transferUpkeepAdmin - -```solidity -function transferUpkeepAdmin(uint256 id, address proposed) external -``` - -### acceptUpkeepAdmin - -```solidity -function acceptUpkeepAdmin(uint256 id) external -``` - -### updateCheckData - -```solidity -function updateCheckData(uint256 id, bytes newCheckData) external -``` - -### addFunds - -```solidity -function addFunds(uint256 id, uint96 amount) external -``` - -### setUpkeepGasLimit - -```solidity -function setUpkeepGasLimit(uint256 id, uint32 gasLimit) external -``` - -### setUpkeepOffchainConfig - -```solidity -function setUpkeepOffchainConfig(uint256 id, bytes config) external -``` - -### getUpkeep - -```solidity -function getUpkeep(uint256 id) external view returns (struct UpkeepInfo upkeepInfo) -``` - -### getActiveUpkeepIDs - -```solidity -function getActiveUpkeepIDs(uint256 startIndex, uint256 maxCount) external view returns (uint256[]) -``` - -### getTransmitterInfo - -```solidity -function getTransmitterInfo(address query) external view returns (bool active, uint8 index, uint96 balance, uint96 lastCollected, address payee) -``` - -### getState - -```solidity -function getState() external view returns (struct State state, struct OnchainConfig config, address[] signers, address[] transmitters, uint8 f) -``` - -## IKeeperRegistry - -_The view methods are not actually marked as view in the implementation -but we want them to be easily queried off-chain. Solidity will not compile -if we actually inherit from this interface, so we document it here._ - -### checkUpkeep - -```solidity -function checkUpkeep(uint256 upkeepId) external view returns (bool upkeepNeeded, bytes performData, enum UpkeepFailureReason upkeepFailureReason, uint256 gasUsed, uint256 fastGasWei, uint256 linkNative) -``` - -## KeeperRegistryExecutableInterface - -### checkUpkeep - -```solidity -function checkUpkeep(uint256 upkeepId) external returns (bool upkeepNeeded, bytes performData, enum UpkeepFailureReason upkeepFailureReason, uint256 gasUsed, uint256 fastGasWei, uint256 linkNative) -``` - diff --git a/contracts/ethereum/hardhat.config.ts b/contracts/ethereum/hardhat.config.ts index 2c9156671..51941fc00 100644 --- a/contracts/ethereum/hardhat.config.ts +++ b/contracts/ethereum/hardhat.config.ts @@ -26,9 +26,10 @@ const forkingChainId = { mainnet: 1, goerli: 5 }[forkingNetwork] const externalEnv = { mainnet: { BEACON_DEPOSIT_ADDRESS: '0x00000000219ab540356cBB839Cbe05303d7705Fa', + DKG_ORACLE_ADDRESS: '0x0000000000000000000000000000000000000000', + FUNCTIONS_ORACLE_ADDRESS: '0x0000000000000000000000000000000000000000', + FUNCTIONS_SUBSCRIPTION_ID: '1', LINK_TOKEN_ADDRESS: '0x514910771AF9Ca656af840dff83E8264EcF986CA', - ORACLE_ADDRESS: '0x0000000000000000000000000000000000000000', - ORACLE_SUB_ID: '1', SSV_NETWORK_ADDRESS: '0x0000000000000000000000000000000000000000', SSV_TOKEN_ADDRESS: '0x9D65fF81a3c488d585bBfb0Bfe3c7707c7917f54', SWAP_FACTORY_ADDRESS: '0x1F98431c8aD98523631AE4a59f267346ea31F984', @@ -37,9 +38,10 @@ const externalEnv = { }, goerli: { BEACON_DEPOSIT_ADDRESS: '0x07b39F4fDE4A38bACe212b546dAc87C58DfE3fDC', + DKG_ORACLE_ADDRESS: '0x0000000000000000000000000000000000000000', + FUNCTIONS_ORACLE_ADDRESS: '0x3de1bE9407645533CD0CbeCf88dFE5297E7125e6', + FUNCTIONS_SUBSCRIPTION_ID: '1', LINK_TOKEN_ADDRESS: '0x326C977E6efc84E512bB9C30f76E30c160eD06FB', - ORACLE_ADDRESS: '0x3de1bE9407645533CD0CbeCf88dFE5297E7125e6', - ORACLE_SUB_ID: '1', SSV_NETWORK_ADDRESS: '0xb9e155e65B5c4D66df28Da8E9a0957f06F11Bc04', SSV_TOKEN_ADDRESS: '0x3a9f01091C446bdE031E39ea8354647AFef091E7', SWAP_FACTORY_ADDRESS: '0x1F98431c8aD98523631AE4a59f267346ea31F984', diff --git a/contracts/ethereum/helpers/oracle.ts b/contracts/ethereum/helpers/dkg.ts similarity index 76% rename from contracts/ethereum/helpers/oracle.ts rename to contracts/ethereum/helpers/dkg.ts index e6e028acd..55dfbd5a4 100644 --- a/contracts/ethereum/helpers/oracle.ts +++ b/contracts/ethereum/helpers/dkg.ts @@ -5,7 +5,7 @@ import { Validator } from '@casimir/types' const mockValidators: Validator[] = Object.values(validatorStore) -export async function initiatePool({ manager, oracle, index }: { manager: CasimirManager, oracle: SignerWithAddress, index: number }) { +export async function initiatePoolDeposit({ manager, dkg, index }: { manager: CasimirManager, dkg: SignerWithAddress, index: number }) { const { depositDataRoot, publicKey, @@ -15,7 +15,7 @@ export async function initiatePool({ manager, oracle, index }: { manager: Casimi signature, withdrawalCredentials } = mockValidators[index] - const initiatePool = await manager.connect(oracle).initiateNextReadyPool( + const initiatePool = await manager.connect(dkg).initiatePoolDeposit( depositDataRoot, publicKey, operatorIds, diff --git a/contracts/ethereum/helpers/upkeep.ts b/contracts/ethereum/helpers/upkeep.ts index 7ed872fde..78707ba73 100644 --- a/contracts/ethereum/helpers/upkeep.ts +++ b/contracts/ethereum/helpers/upkeep.ts @@ -19,7 +19,7 @@ export async function runUpkeep({ return ranUpkeep } -export async function fulfillOracleAnswer({ +export async function fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }: { upkeep: CasimirUpkeep, diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 3bd934fc1..80938d992 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -2,20 +2,21 @@ import { deployContract } from '@casimir/ethereum/helpers/deploy' import { ContractConfig, DeploymentConfig } from '@casimir/types' import { CasimirUpkeep, CasimirManager } from '@casimir/ethereum/build/artifacts/types' import { ethers } from 'hardhat' -import { fulfillOracleAnswer, runUpkeep } from '@casimir/ethereum/helpers/upkeep' -import { initiatePool } from '@casimir/ethereum/helpers/oracle' +import { fulfillFunctionsRequest, runUpkeep } from '@casimir/ethereum/helpers/upkeep' +import { initiatePoolDeposit } from '@casimir/ethereum/helpers/dkg' import EventEmitter, { on } from 'events' void async function () { - const [, , , , fourthUser, keeper, oracle] = await ethers.getSigners() + const [, , , , fourthUser, keeper, dkg] = await ethers.getSigners() let config: DeploymentConfig = { CasimirManager: { address: '', args: { beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, + dkgOracleAddress: dkg.address || process.env.DKG_ORACLE_ADDRESS, + functionsOracleAddress: process.env.FUNCTIONS_ORACLE_ADDRESS, + functionsSubscriptionId: process.env.FUNCTIONS_SUBSCRIPTION_ID, linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, - oracleAddress: process.env.ORACLE_ADDRESS, - oracleSubId: process.env.ORACLE_SUB_ID, ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, ssvTokenAddress: process.env.SSV_TOKEN_ADDRESS, swapFactoryAddress: process.env.SWAP_FACTORY_ADDRESS, @@ -45,7 +46,7 @@ void async function () { /** Link mock external contracts to Casimir */ if (name === 'CasimirManager') { - (config[name as keyof typeof config] as ContractConfig).args.oracleAddress = config.MockFunctionsOracle?.address + (config[name as keyof typeof config] as ContractConfig).args.dkgAddress = config.MockFunctionsOracle?.address } const { args, options, proxy } = config[name as keyof typeof config] as ContractConfig @@ -78,14 +79,14 @@ void async function () { /** Perform upkeep */ const ranUpkeepBefore = await runUpkeep({ upkeep, keeper }) - /** Fulfill oracle answer */ + /** Fulfill functions request */ if (ranUpkeepBefore) { const nextActiveStakeAmount = Math.round((parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) + rewardAmount) * 10) / 10 const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 const nextDepositedCount = 0 const nextExitedCount = 0 - await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } /** Sweep rewards before next upkeep (balance will increment silently) */ @@ -95,14 +96,14 @@ void async function () { /** Perform upkeep */ const ranUpkeepAfter = await runUpkeep({ upkeep, keeper }) - /** Fulfill oracle answer */ + /** Fulfill functions request */ if (ranUpkeepAfter) { const nextActiveStakeAmount = Math.round((parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) - rewardAmount) * 10) / 10 const nextSweptRewardsAmount = rewardAmount const nextSweptExitsAmount = 0 const nextDepositedCount = 0 const nextExitedCount = 0 - await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } } @@ -119,25 +120,25 @@ void async function () { await fourthUserStake?.wait() }, 1000) - /** Perform upkeep and fulfill oracle answer after each pool is filled */ - for await (const event of on(manager as unknown as EventEmitter, 'PoolFilled')) { + /** Perform upkeep and fulfill dkg answer after each pool is filled */ + for await (const event of on(manager as unknown as EventEmitter, 'PoolReady')) { const [ id, details ] = event console.log(`Pool ${id} filled at block number ${details.blockNumber}`) const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length - await initiatePool({ manager, oracle, index: nextValidatorIndex }) + await initiatePoolDeposit({ manager, dkg, index: nextValidatorIndex }) /** Perform upkeep */ const ranUpkeep = await runUpkeep({ upkeep, keeper }) - /** Fulfill oracle answer */ + /** Fulfill functions request */ if (ranUpkeep) { const nextActiveStakeAmount = parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) + 32 const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 const nextDepositedCount = 1 const nextExitedCount = 0 - await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } } }() \ No newline at end of file diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index c175c6f6f..b78d1ddb2 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -44,7 +44,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /* Distribution threshold (100 WEI) */ uint256 private constant distributionThreshold = 100 wei; - /** Scale factor for each reward to stake ratio */ + /** Scale factor for each rewards to stake ratio */ uint256 private constant scaleFactor = 1 ether; /** Uniswap 0.3% fee tier */ uint24 private constant uniswapFeeTier = 3000; @@ -52,9 +52,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint256 private constant poolCapacity = 32 ether; /*************/ - /* Contracts */ + /* Immutable */ /*************/ + /** DKG oracle address */ + address private immutable dkgOracleAddress; /** Upkeep contract */ ICasimirUpkeep private immutable upkeep; /** Beacon deposit contract */ @@ -88,7 +90,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Latest active (consensus) balance reported from upkeep */ uint256 latestActiveStake; /** Last pool ID created */ - uint256 lastPoolId; + uint32 nextPoolId; /** Token addresses */ mapping(Token => address) private tokenAddresses; /** Unswapped tokens by address */ @@ -109,8 +111,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { bytes[] private stakedValidatorPublicKeys; /** Exiting validator count */ uint256 private exitingValidatorCount; - /** Sum of scaled reward to stake ratios (intial value required) */ - uint256 rewardRatioSum = 1000 ether; + /** Sum of scaled rewards to stake ratios (intial value required) */ + uint256 rewardsRatioSum = 1000 ether; /** Requested withdrawals */ Withdrawal[] private requestedWithdrawalQueue; /** Pending withdrawals */ @@ -127,9 +129,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Constructor * @param beaconDepositAddress The Beacon deposit address + * @param _dkgOracleAddress The DKG oracle address + * @param functionsOracleAddress The Chainlink functions oracle address + * @param functionsSubscriptionId The Chainlink functions subscription ID * @param linkTokenAddress The Chainlink token address - * @param oracleAddress The Chainlink functions oracle address - * @param oracleSubId The Chainlink functions oracle subscription ID * @param ssvNetworkAddress The SSV network address * @param ssvTokenAddress The SSV token address * @param swapFactoryAddress The Uniswap factory address @@ -138,9 +141,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ constructor( address beaconDepositAddress, + address _dkgOracleAddress, + address functionsOracleAddress, + uint64 functionsSubscriptionId, address linkTokenAddress, - address oracleAddress, - uint64 oracleSubId, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, @@ -148,6 +152,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { address wethTokenAddress ) { beaconDeposit = IDepositContract(beaconDepositAddress); + dkgOracleAddress = _dkgOracleAddress; linkToken = IERC20(linkTokenAddress); tokenAddresses[Token.LINK] = linkTokenAddress; ssvNetwork = ISSVNetwork(ssvNetworkAddress); @@ -157,11 +162,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { swapRouter = ISwapRouter(swapRouterAddress); tokenAddresses[Token.WETH] = wethTokenAddress; - /** Deploy upkeep contract */ upkeep = new CasimirUpkeep( address(this), - oracleAddress, - oracleSubId + functionsOracleAddress, + functionsSubscriptionId ); } @@ -175,52 +179,52 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { processedAmount >= distributionThreshold, "Stake amount must be greater than 100 WEI" ); - // Todo cap deposits to avoid exhausting gas - /** Update user account state */ if (users[msg.sender].stake0 > 0) { - /** Settle user's current stake */ users[msg.sender].stake0 = getUserStake(msg.sender); } - users[msg.sender].rewardRatioSum0 = rewardRatioSum; + users[msg.sender].rewardsRatioSum0 = rewardsRatioSum; users[msg.sender].stake0 += processedAmount; - /** Distribute stake to open pools */ distributeStake(processedAmount); + + emit StakeDeposited(msg.sender, processedAmount); } /** * @notice Rebalance the reward to stake ratio and redistribute swept rewards * @param activeStake The active consensus stake - * @param sweptRewards The swept consensus stake + * @param sweptRewards The swept consensus rewards + * @param sweptExits The swept consensus exits */ - function rebalanceStake(uint256 activeStake, uint256 sweptRewards) external { + function rebalanceStake(uint256 activeStake, uint256 sweptRewards, uint256 sweptExits) external { require( msg.sender == address(upkeep), - "Only upkeep can distribute rewards" + "Only upkeep can rebalance stake" ); - int256 change = int256(activeStake + sweptRewards) - - int256(latestActiveStake + pendingPoolIds.length * poolCapacity); + int256 current = int256(activeStake + sweptRewards + sweptExits); + int256 previous = int256(latestActiveStake + pendingPoolIds.length * poolCapacity); + int256 change = current - previous; - /** Update reward to stake ratio */ if (change > 0) { - uint256 reward = SafeCast.toUint256(change); + uint256 rewards = SafeCast.toUint256(change); // /** Reward fees set to zero for testing */ // uint256 processedReward = processFees(reward, Fees(0, 0)); - rewardRatioSum += Math.mulDiv(rewardRatioSum, reward, getStake()); - emit StakeRebalanced(msg.sender, reward); + rewardsRatioSum += Math.mulDiv(rewardsRatioSum, rewards, getStake()); + emit StakeRebalanced(rewards); } else if (change < 0) { uint256 penalty = SafeCast.toUint256(change); - rewardRatioSum -= Math.mulDiv(rewardRatioSum, penalty, getStake()); - emit StakeRebalanced(msg.sender, penalty); + rewardsRatioSum -= Math.mulDiv(rewardsRatioSum, penalty, getStake()); + emit StakeRebalanced(penalty); } - /** Update latest active stake */ latestActiveStake = activeStake; - /** Distribute swept rewards */ - distributeStake(sweptRewards); + if (sweptRewards > 0) { + distributeStake(sweptRewards); + emit RewardsDeposited(sweptRewards); + } } /** @@ -228,29 +232,22 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param amount The amount of stake to distribute */ function distributeStake(uint256 amount) private { - emit StakeDistributed(msg.sender, amount); - - /** Distribute ETH to open pools */ while (amount > 0) { uint256 remainingCapacity = poolCapacity - openDeposits; if (remainingCapacity > amount) { - /** Add remaining amount to open deposits */ openDeposits += amount; amount = 0; } else { - /** Create new pool */ - lastPoolId++; - uint32 poolId = uint32(lastPoolId); + uint32 poolId = nextPoolId; + nextPoolId++; Pool storage pool; pool = pools[poolId]; - - /** Move open deposits and remaining capacity to pool */ openDeposits = 0; amount -= remainingCapacity; pool.deposits = poolCapacity; readyPoolIds.push(poolId); - emit PoolFilled(poolId); + emit PoolReady(poolId); } } } @@ -260,18 +257,12 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param amount The amount of stake to withdraw */ function requestWithdrawal(uint256 amount) external nonReentrant { - require(openDeposits >= amount, "Withdrawing more than open deposits"); - require(users[msg.sender].stake0 > 0, "User does not have a stake"); - - /** Settle user's compounded stake */ users[msg.sender].stake0 = getUserStake(msg.sender); - require( - users[msg.sender].stake0 >= amount, + users[msg.sender].stake0 > amount, "Withdrawing more than user stake" ); - /** Update requested withdrawals state */ requestedWithdrawalQueue.push( Withdrawal({user: msg.sender, amount: amount}) ); @@ -293,21 +284,14 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { while (count > 0) { count--; - /** Get next requested withdrawal */ Withdrawal memory withdrawal = requestedWithdrawalQueue[0]; - - /** Update user account state */ - users[withdrawal.user].rewardRatioSum0 = rewardRatioSum; + users[withdrawal.user].rewardsRatioSum0 = rewardsRatioSum; users[withdrawal.user].stake0 -= withdrawal.amount; - - /** Update requested withdrawals state */ requestedWithdrawalQueue.remove(0); requestedWithdrawals -= withdrawal.amount; if (withdrawal.amount <= openDeposits) { - /** Withdraw amount from open deposits */ openDeposits -= withdrawal.amount; - withdrawal.user.send(withdrawal.amount); emit WithdrawalCompleted( @@ -315,7 +299,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { withdrawal.amount ); } else { - /** Update requested withdrawals state */ pendingWithdrawalQueue.push(withdrawal); pendingWithdrawals += withdrawal.amount; @@ -340,13 +323,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { while (count > 0) { count--; - /** Get next pending withdrawal */ Withdrawal memory withdrawal = pendingWithdrawalQueue[0]; - - /** Update pending withdrawals state */ pendingWithdrawalQueue.remove(0); pendingWithdrawals -= withdrawal.amount; - withdrawal.user.send(withdrawal.amount); emit WithdrawalCompleted(withdrawal.user, withdrawal.amount); @@ -363,7 +342,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param signature The signature * @param withdrawalCredentials The withdrawal credentials */ - function initiateNextReadyPool( + function initiatePoolDeposit( bytes32 depositDataRoot, bytes calldata publicKey, uint32[] memory operatorIds, @@ -372,14 +351,15 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { bytes calldata signature, bytes calldata withdrawalCredentials ) external { - // Todo restrict to oracle - + require( + msg.sender == dkgOracleAddress, + "Only DKG oracle can initiate pools" + ); require(readyPoolIds.length > 0, "No ready pools"); - /** Get next filled pool ID */ - uint32 poolId = readyPoolIds[0]; + // Todo validate deposit data - /** Get the pool and update it */ + uint32 poolId = readyPoolIds[0]; Pool storage pool = pools[poolId]; pool.depositDataRoot = depositDataRoot; pool.publicKey = publicKey; @@ -388,29 +368,25 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { pool.sharesPublicKeys = sharesPublicKeys; pool.signature = signature; pool.withdrawalCredentials = withdrawalCredentials; - - /** Move pool from ready to pending state */ readyPoolIds.remove(0); pendingPoolIds.push(poolId); - /** Deposit validator */ beaconDeposit.deposit{value: pool.deposits}( - pool.publicKey, // bytes - pool.withdrawalCredentials, // bytes - pool.signature, // bytes - pool.depositDataRoot // bytes32 + pool.publicKey, + pool.withdrawalCredentials, + pool.signature, + pool.depositDataRoot ); - /** Pay SSV fees and register validator */ - /** Todo update for v3 SSV contracts and dynamic fees */ + // Todo update for v3 SSV contracts and dynamic fees uint256 mockSSVFee = 5 ether; ssvToken.approve(address(ssvNetwork), mockSSVFee); ssvNetwork.registerValidator( - pool.publicKey, // bytes - pool.operatorIds, // uint32[] - pool.sharesPublicKeys, // bytes[] - pool.sharesEncrypted, // bytes[], - mockSSVFee // uint256 (fees handled on user deposits) + pool.publicKey, + pool.operatorIds, + pool.sharesPublicKeys, + pool.sharesEncrypted, + mockSSVFee ); emit PoolInitiated(poolId); @@ -420,7 +396,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Complete a given count of the next pending pools * @param count The number of pools to complete */ - function completePendingPools(uint256 count) external { + function completePoolDeposits(uint256 count) external { require( msg.sender == address(upkeep), "Only upkeep can complete pending pools" @@ -430,15 +406,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { while (count > 0) { count--; - /** Get next pending pool */ uint32 poolId = pendingPoolIds[0]; Pool memory pool = pools[poolId]; - - /** Move pool from pending to staked state */ pendingPoolIds.remove(0); stakedPoolIds.push(poolId); - - /** Add validator to staked state */ stakedValidatorPublicKeys.push(pool.publicKey); emit PoolCompleted(poolId); @@ -455,7 +426,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { "Only upkeep can request pool exits" ); - uint256 index = 0; // Keeping the same staked pool array + uint256 index = 0; while (count > 0) { uint32 poolId = stakedPoolIds[index]; Pool storage pool = pools[poolId]; @@ -465,8 +436,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { index++; pool.exiting = true; - - /** Increase exiting validators */ exitingValidatorCount++; emit PoolExitRequested(poolId); @@ -505,17 +474,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { "Pool validator does not match staked validator" ); - /** Remove pool from staked pools and delete */ stakedPoolIds.remove(poolIndex); delete pools[poolId]; - - /** Remove validator from staked and exiting states and delete */ stakedValidatorPublicKeys.remove(validatorIndex); - - /** Decrease exiting validators */ exitingValidatorCount--; - /** Remove validator from SSV */ ssvNetwork.removeValidator(validatorPublicKey); emit PoolExited(poolId); @@ -526,10 +489,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param operatorId The operator ID */ function registerOperator(uint32 operatorId) external payable { - // require( - // msg.value >= operatorCollateralMinimum, - // "Insufficient operator collateral" - // ); + // } /** @@ -545,13 +505,17 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { bytes[] memory sharesEncrypted, bytes[] memory sharesPublicKeys ) external { + require( + msg.sender == dkgOracleAddress, + "Only DKG oracle can initiate pools" + ); + Pool memory pool = pools[poolId]; require( pool.reshareCount < 3, "Pool has been reshared twice" ); - /** Update pool */ pool.operatorIds = operatorIds; pool.sharesEncrypted = sharesEncrypted; pool.sharesPublicKeys = sharesPublicKeys; @@ -570,16 +534,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint256 depositAmount, Fees memory fees ) private returns (uint256 processedAmount) { - /** Calculate total fee percentage */ uint32 feePercent = fees.LINK + fees.SSV; - - /** Calculate ETH amount to return in processed deposit */ uint256 ethAmount = Math.mulDiv(depositAmount, 100, 100 + feePercent); - - /** Calculate fee amount to swap */ uint256 feeAmount = depositAmount - ethAmount; - /** Wrap and swap */ if (feeAmount > 0) { wrapFees(feeAmount); @@ -588,7 +546,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { tokenAddresses[Token.LINK], Math.mulDiv(feeAmount, fees.LINK, feePercent) ); - // Todo use linkToken.increaseAllowance(swappedLINK) if available linkToken.approve( address(upkeep), linkToken.balanceOf(address(this)) @@ -600,7 +557,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { tokenAddresses[Token.SSV], Math.mulDiv(feeAmount, fees.SSV, feePercent) ); - // Todo use ssvToken.increaseAllowance(swappedSSV) if available ssvToken.approve( address(upkeep), ssvToken.balanceOf(address(this)) @@ -617,7 +573,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function wrapFees(uint256 amount) private { IWETH9 wethToken = IWETH9(tokenAddresses[Token.WETH]); wethToken.deposit{value: amount}(); - // Todo use wethToken.increaseAllowance(swappedSSV) if available wethToken.approve( address(swapRouter), wethToken.balanceOf(address(this)) @@ -643,7 +598,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { amountIn = liquidity; } if (amountIn > 0) { - /** Get swap params */ ISwapRouter.ExactInputSingleParams memory params = ISwapRouter .ExactInputSingleParams({ tokenIn: tokenIn, @@ -655,8 +609,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { amountOutMinimum: 0, sqrtPriceLimitX96: 0 }); - - /** Perform swap */ amountOut = swapRouter.exactInputSingle(params); } } @@ -690,7 +642,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @return stake The total manager stake */ function getStake() public view returns (uint256 stake) { - stake = getBufferedStake() + getActiveStake(); // - pendingWithdrawals; + stake = getBufferedStake() + getActiveStake(); } /** @@ -731,8 +683,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { require(users[userAddress].stake0 > 0, "User does not have a stake"); userStake = Math.mulDiv( users[userAddress].stake0, - rewardRatioSum, - users[userAddress].rewardRatioSum0 + rewardsRatioSum, + users[userAddress].rewardsRatioSum0 ); } @@ -852,7 +804,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function getPool( uint32 poolId ) external view returns (Pool memory pool) { - /** Pool in ready state will not have validator or operators */ pool = pools[poolId]; } diff --git a/contracts/ethereum/src/CasimirUpkeep.sol b/contracts/ethereum/src/CasimirUpkeep.sol index 098b1800e..9dd706949 100644 --- a/contracts/ethereum/src/CasimirUpkeep.sol +++ b/contracts/ethereum/src/CasimirUpkeep.sol @@ -9,23 +9,6 @@ import "@openzeppelin/contracts/access/Ownable.sol"; // Dev-only imports import "hardhat/console.sol"; -// To be done by automation and functions oracle: -// 1. Store withdrawal requests ✔ -// 2. Request exits for withdrawals -// 3. Store pending exits and pending withdrawals -// 4. Get completed exits in upkeep (triggered by any amount increase > reward threshold) -// 5. Fulfill withdrawals and redistribute -// 6. Get cluster snapshots before staking ready pools - -// To be enabled with operator registry and selection (not an audit essential, postponing for now): -// 1. Replace lost stake with operator collateral -// 2. Distribute operators to minimize undercollateralization risk - -// To be enabled with single-instance @casimir/keys oracle (not an audit essential, postponing for now): -// 1. Validator keygen triggering -// 2. Validator reshare triggering (for penalties or otherwise) -// 3. Validator exit triggering (for max reshares or by liquidity needs) - /** * @title Oracle contract that triggers and handles actions */ @@ -41,10 +24,12 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /*************/ /** Oracle heartbeat */ - uint256 public constant oracleHeartbeat = 0; // Will use a ~quarter of a day in production + uint256 public constant reportHeartbeat = 0; // Will use a ~quarter of a day in production + /** Pool capacity */ + uint256 public constant poolCapacity = 32 ether; /*************/ - /* Contracts */ + /* Immutable */ /*************/ /** Manager contract */ @@ -71,7 +56,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /** Oracle fulfillment gas limit */ uint32 fulfillGasLimit; /** Oracle subscription ID */ - uint64 private oracleSubId; + uint64 private functionsSubscriptionId; /***************/ /* Constructor */ @@ -80,16 +65,16 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /** * Constructor * @param managerAddress The manager contract address - * @param oracleAddress The oracle contract address - * @param _oracleSubId The oracle subscription ID + * @param functionsOracleAddress The functions oracle contract address + * @param _functionsSubscriptionId The functions subscription ID */ constructor( address managerAddress, - address oracleAddress, - uint64 _oracleSubId - ) FunctionsClient(oracleAddress) { + address functionsOracleAddress, + uint64 _functionsSubscriptionId + ) FunctionsClient(functionsOracleAddress) { manager = ICasimirManager(managerAddress); - oracleSubId = _oracleSubId; + functionsSubscriptionId = _functionsSubscriptionId; } /** @@ -121,16 +106,16 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /** * @notice Set the bytes representing the CBOR-encoded Functions.Request * @param _fulfillGasLimit Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function - * @param _oracleSubId The oracle billing subscription ID used to pay for Functions requests + * @param _functionsSubscriptionId The functions billing subscription ID used to pay for Functions requests * @param _requestCBOR Bytes representing the CBOR-encoded Functions.Request */ function setRequest( uint32 _fulfillGasLimit, - uint64 _oracleSubId, + uint64 _functionsSubscriptionId, bytes calldata _requestCBOR ) external onlyOwner { fulfillGasLimit = _fulfillGasLimit; - oracleSubId = _oracleSubId; + functionsSubscriptionId = _functionsSubscriptionId; requestCBOR = _requestCBOR; } @@ -146,22 +131,19 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { override returns (bool upkeepNeeded, bytes memory performData) { - /** Check if the heartbeat interval is lapsed */ - if ((block.timestamp - latestResponseTimestamp) >= oracleHeartbeat) { + if ((block.timestamp - latestResponseTimestamp) >= reportHeartbeat) { upkeepNeeded = true; } - /** Check if any pools need to exit */ int256 requiredWithdrawals = int256(manager.getRequestedWithdrawals() + manager.getPendingWithdrawals()) - int256(manager.getExitingValidatorCount() * 32 ether); if (requiredWithdrawals > 0) { upkeepNeeded = true; } // Todo provide required withdrawals as performData (or some optimial input, maybe validator count) - // /** Check if last request has been fulfilled */ - // if (latestRequestId != latestFulfilledRequestId) { - // upkeepNeeded = false; - // } + if (latestFulfilledRequestId != "" && latestFulfilledRequestId != latestRequestId) { + upkeepNeeded = false; + } performData = abi.encode(requiredWithdrawals); } @@ -186,7 +168,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { Functions.Request memory req; /** Request a report */ - bytes32 requestId = sendRequest(req, oracleSubId, fulfillGasLimit); + bytes32 requestId = sendRequest(req, functionsSubscriptionId, fulfillGasLimit); latestRequestId = requestId; emit UpkeepPerformed(performData); @@ -217,16 +199,20 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /** Unpack values */ uint256 activeStake = uint256(uint64(report)) * 1 gwei; uint256 sweptRewards = uint256(uint64(report >> 64)) * 1 gwei; - // uint256 sweptExits = uint256(uint64(report >> 128)) * 1 gwei; - // uint32 depositCount = uint32(report >> 192); - // uint32 withdrawalCount = uint32(report >> 224); + uint256 sweptExits = uint256(uint64(report >> 128)) * 1 gwei; + uint32 depositCount = uint32(report >> 192); + // uint32 exitCount = uint32(report >> 224); + + // if (sweptExits < exitCount * poolCapacity) { + // sweptExits = amount recovered from blamed operator collateral + // } - manager.rebalanceStake(activeStake, sweptRewards); + /** Rebalance the stake */ + manager.rebalanceStake(activeStake, sweptRewards, sweptExits); - /** Complete the bounded count of pending pools */ - uint32[] memory pendingPoolIds = manager.getPendingPoolIds(); - if (pendingPoolIds.length > 0) { - manager.completePendingPools(pendingPoolIds.length); // Todo find good bounds for batching + /** Complete the deposit count of pending pools */ + if (depositCount > 0) { + manager.completePoolDeposits(depositCount); } } diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index bc8bb4e98..f852a93c6 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -33,7 +33,7 @@ interface ICasimirManager { /** User staking account */ struct User { uint256 stake0; - uint256 rewardRatioSum0; + uint256 rewardsRatioSum0; } /** Withdrawal */ struct Withdrawal { @@ -45,15 +45,16 @@ interface ICasimirManager { /* Events */ /**********/ - event PoolFilled(uint32 poolId); + event PoolReady(uint32 poolId); event PoolInitiated(uint32 poolId); event PoolCompleted(uint32 poolId); event PoolReshareRequested(uint32 poolId); event PoolReshared(uint32 poolId); event PoolExitRequested(uint32 poolId); event PoolExited(uint32 poolId); - event StakeDistributed(address sender, uint256 amount); - event StakeRebalanced(address sender, uint256 amount); + event StakeDeposited(address sender, uint256 amount); + event StakeRebalanced(uint256 amount); + event RewardsDeposited(uint256 amount); event WithdrawalRequested(address sender, uint256 amount); event WithdrawalInitiated(address sender, uint256 amount); event WithdrawalCompleted(address sender, uint256 amount); @@ -64,7 +65,7 @@ interface ICasimirManager { function depositStake() external payable; - function rebalanceStake(uint256 activeStake, uint256 sweptRewards) external; + function rebalanceStake(uint256 activeStake, uint256 sweptRewards, uint256 sweptExits) external; function requestWithdrawal(uint256 amount) external; @@ -72,7 +73,7 @@ interface ICasimirManager { function completePendingWithdrawals(uint256 count) external; - function initiateNextReadyPool( + function initiatePoolDeposit( bytes32 depositDataRoot, bytes calldata publicKey, uint32[] memory operatorIds, @@ -82,7 +83,7 @@ interface ICasimirManager { bytes calldata withdrawalCredentials ) external; - function completePendingPools(uint256 count) external; + function completePoolDeposits(uint256 count) external; function requestPoolExits(uint256 count) external; diff --git a/contracts/ethereum/src/mock/MockFunctionsOracle.sol b/contracts/ethereum/src/mock/MockFunctionsOracle.sol index 77f272f73..5cee6bf94 100644 --- a/contracts/ethereum/src/mock/MockFunctionsOracle.sol +++ b/contracts/ethereum/src/mock/MockFunctionsOracle.sol @@ -38,11 +38,9 @@ contract MockFunctionsOracle { bytes calldata _data, uint32 _gasLimit ) external returns (bytes32 requestId) { - subscriptionId = _subscriptionId; data = _data; gasLimit = _gasLimit; - requestId = keccak256(abi.encode(latestRequestIdNumber)); } } diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 9216e7c18..1c955ad53 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -2,8 +2,8 @@ import { ethers } from 'hardhat' import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' import { deployContract } from '@casimir/ethereum/helpers/deploy' import { CasimirManager, CasimirUpkeep } from '@casimir/ethereum/build/artifacts/types' -import { fulfillOracleAnswer, runUpkeep } from '@casimir/ethereum/helpers/upkeep' -import { initiatePool } from '@casimir/ethereum/helpers/oracle' +import { fulfillFunctionsRequest, runUpkeep } from '@casimir/ethereum/helpers/upkeep' +import { initiatePoolDeposit } from '@casimir/ethereum/helpers/dkg' import { ContractConfig, DeploymentConfig } from '@casimir/types' /** Simulation amount of reward to distribute per staked validator */ @@ -11,15 +11,16 @@ const rewardPerValidator = 0.1 /** Fixture to deploy SSV manager contract */ export async function deploymentFixture() { - const [owner, , , , , keeper, oracle] = await ethers.getSigners() + const [owner, , , , , keeper, dkg] = await ethers.getSigners() let config: DeploymentConfig = { CasimirManager: { address: '', args: { beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, + dkgOracleAddress: dkg.address || process.env.DKG_ORACLE_ADDRESS, + functionsOracleAddress: process.env.FUNCTIONS_ORACLE_ADDRESS, + functionsSubscriptionId: process.env.FUNCTIONS_SUBSCRIPTION_ID, linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, - oracleAddress: process.env.ORACLE_ADDRESS, - oracleSubId: process.env.ORACLE_SUB_ID, ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, ssvTokenAddress: process.env.SSV_TOKEN_ADDRESS, swapFactoryAddress: process.env.SWAP_FACTORY_ADDRESS, @@ -49,7 +50,7 @@ export async function deploymentFixture() { /** Link mock external contracts to Casimir */ if (name === 'CasimirManager') { - (config[name as keyof typeof config] as ContractConfig).args.oracleAddress = config.MockFunctionsOracle?.address + (config[name as keyof typeof config] as ContractConfig).args.functionsOracleAddress = config.MockFunctionsOracle?.address } const { args, options, proxy } = config[name as keyof typeof config] as ContractConfig @@ -67,12 +68,12 @@ export async function deploymentFixture() { const manager = await ethers.getContractAt('CasimirManager', config.CasimirManager.address as string) as CasimirManager const upkeep = await ethers.getContractAt('CasimirUpkeep', await manager.getUpkeepAddress()) as CasimirUpkeep - return { manager: manager as CasimirManager, upkeep: upkeep as CasimirUpkeep, owner, keeper, oracle } + return { manager: manager as CasimirManager, upkeep: upkeep as CasimirUpkeep, owner, keeper, dkg } } /** Fixture to stake 16 ETH for the first user */ export async function firstUserDepositFixture() { - const { manager, upkeep, owner, keeper, oracle } = await loadFixture(deploymentFixture) + const { manager, upkeep, owner, keeper, dkg } = await loadFixture(deploymentFixture) const [, firstUser] = await ethers.getSigners() const stakeAmount = 16 @@ -87,12 +88,12 @@ export async function firstUserDepositFixture() { /** Run upkeep */ await runUpkeep({ upkeep, keeper }) - return { manager, upkeep, owner, firstUser, keeper, oracle } + return { manager, upkeep, owner, firstUser, keeper, dkg } } /** Fixture to stake 24 ETH for the second user */ export async function secondUserDepositFixture() { - const { manager, upkeep, owner, firstUser, keeper, oracle } = await loadFixture(firstUserDepositFixture) + const { manager, upkeep, owner, firstUser, keeper, dkg } = await loadFixture(firstUserDepositFixture) const [, , secondUser] = await ethers.getSigners() const stakeAmount = 24 @@ -111,22 +112,22 @@ export async function secondUserDepositFixture() { /** Initiate next ready pool */ const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length - await initiatePool({ manager, oracle, index: nextValidatorIndex }) + await initiatePoolDeposit({ manager, dkg, index: nextValidatorIndex }) /** Run upkeep */ const ranUpkeep = await runUpkeep({ upkeep, keeper }) - /** Fulfill oracle answer */ + /** Fulfill functions request */ if (ranUpkeep) { - await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, upkeep, owner, firstUser, secondUser, keeper, oracle } + return { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } } /** Fixture to reward 0.1 ETH in total to the first and second user */ export async function rewardPostSecondUserDepositFixture() { - const { manager, upkeep, owner, firstUser, secondUser, keeper, oracle } = await loadFixture(secondUserDepositFixture) + const { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } = await loadFixture(secondUserDepositFixture) const rewardAmount = 0.1 const nextActiveStakeAmount = 32 + rewardAmount @@ -138,17 +139,17 @@ export async function rewardPostSecondUserDepositFixture() { /** Run upkeep */ const ranUpkeep = await runUpkeep({ upkeep, keeper }) - /** Fulfill oracle answer */ + /** Fulfill functions request */ if (ranUpkeep) { - await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, upkeep, owner, firstUser, secondUser, keeper, oracle } + return { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } } /** Fixture to sweep 0.1 ETH to the manager */ export async function sweepPostSecondUserDepositFixture() { - const { manager, upkeep, owner, firstUser, secondUser, keeper, oracle } = await loadFixture(secondUserDepositFixture) + const { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } = await loadFixture(secondUserDepositFixture) const sweptRewards = 0.1 const sweep = await keeper.sendTransaction({ to: manager.address, value: ethers.utils.parseEther(sweptRewards.toString()) }) @@ -163,17 +164,17 @@ export async function sweepPostSecondUserDepositFixture() { /** Run upkeep */ const ranUpkeep = await runUpkeep({ upkeep, keeper }) - /** Fulfill oracle answer */ + /** Fulfill functions request */ if (ranUpkeep) { - await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, upkeep, owner, firstUser, secondUser, keeper, oracle } + return { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } } /** Fixture to stake 24 ETH for the third user */ export async function thirdUserDepositFixture() { - const { manager, upkeep, owner, firstUser, secondUser, keeper, oracle } = await loadFixture(sweepPostSecondUserDepositFixture) + const { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } = await loadFixture(sweepPostSecondUserDepositFixture) const [, , , thirdUser] = await ethers.getSigners() const stakeAmount = 24 @@ -192,22 +193,22 @@ export async function thirdUserDepositFixture() { /** Initiate next ready pool */ const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length - await initiatePool({ manager, oracle, index: nextValidatorIndex }) + await initiatePoolDeposit({ manager, dkg, index: nextValidatorIndex }) /** Run upkeep */ const ranUpkeep = await runUpkeep({ upkeep, keeper }) - /** Fulfill oracle answer */ + /** Fulfill functions request */ if (ranUpkeep) { - await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle } + return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } } /** Fixture to reward 0.2 ETH in total to the first, second, and third user */ export async function rewardPostThirdUserDepositFixture() { - const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle } = await loadFixture(thirdUserDepositFixture) + const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } = await loadFixture(thirdUserDepositFixture) const rewardAmount = 0.2 const nextActiveStakeAmount = 64 + rewardAmount @@ -219,17 +220,17 @@ export async function rewardPostThirdUserDepositFixture() { /** Run upkeep */ const ranUpkeep = await runUpkeep({ upkeep, keeper }) - /** Fulfill oracle answer */ + /** Fulfill functions request */ if (ranUpkeep) { - await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle } + return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } } /** Fixture to sweep 0.2 ETH to the manager */ export async function sweepPostThirdUserDepositFixture() { - const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle } = await loadFixture(rewardPostThirdUserDepositFixture) + const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } = await loadFixture(rewardPostThirdUserDepositFixture) const sweptRewards = 0.2 const sweep = await keeper.sendTransaction({ to: manager.address, value: ethers.utils.parseEther(sweptRewards.toString()) }) @@ -244,17 +245,17 @@ export async function sweepPostThirdUserDepositFixture() { /** Run upkeep */ const ranUpkeep = await runUpkeep({ upkeep, keeper }) - /** Fulfill oracle answer */ + /** Fulfill functions request */ if (ranUpkeep) { - await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle } + return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } } /** Fixture to withdraw 0.3 to the first user */ export async function firstUserPartialWithdrawalFixture() { - const { manager, upkeep, firstUser, secondUser, thirdUser, keeper, oracle } = await loadFixture(sweepPostThirdUserDepositFixture) + const { manager, upkeep, firstUser, secondUser, thirdUser, keeper, dkg } = await loadFixture(sweepPostThirdUserDepositFixture) const openDeposits = await manager.getOpenDeposits() const withdraw = await manager.connect(firstUser).requestWithdrawal(openDeposits) await withdraw.wait() @@ -262,12 +263,12 @@ export async function firstUserPartialWithdrawalFixture() { /** Run upkeep */ await runUpkeep({ upkeep, keeper }) - return { manager, upkeep, firstUser, secondUser, thirdUser, keeper, oracle } + return { manager, upkeep, firstUser, secondUser, thirdUser, keeper, dkg } } /** Fixture to stake 72 for the fourth user */ export async function fourthUserDepositFixture() { - const { manager, upkeep, firstUser, secondUser, thirdUser, keeper, oracle } = await loadFixture(firstUserPartialWithdrawalFixture) + const { manager, upkeep, firstUser, secondUser, thirdUser, keeper, dkg } = await loadFixture(firstUserPartialWithdrawalFixture) const [, , , , fourthUser] = await ethers.getSigners() const stakeAmount = 72 @@ -287,23 +288,23 @@ export async function fourthUserDepositFixture() { /** Initiate next ready pools (2) */ for (let i = 0; i < 2; i++) { const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length - await initiatePool({ manager, oracle, index: nextValidatorIndex }) + await initiatePoolDeposit({ manager, dkg, index: nextValidatorIndex }) } /** Run upkeep */ const ranUpkeep = await runUpkeep({ upkeep, keeper }) - /** Fulfill oracle answer */ + /** Fulfill functions request */ if (ranUpkeep) { - await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle } + return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } } /** Fixture to simulate stakes and rewards */ export async function simulationFixture() { - const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle } = await loadFixture(fourthUserDepositFixture) + const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } = await loadFixture(fourthUserDepositFixture) let nextActiveStakeAmount = 128 @@ -320,11 +321,11 @@ export async function simulationFixture() { /** Run upkeep */ const ranUpkeep = await runUpkeep({ upkeep, keeper }) - /** Fulfill oracle answer */ + /** Fulfill functions request */ if (ranUpkeep) { - await fulfillOracleAnswer({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } } } - return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle } + return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } } \ No newline at end of file diff --git a/services/oracle/README.md b/services/oracle/README.md index 8dc0a6bcd..3fff200cb 100644 --- a/services/oracle/README.md +++ b/services/oracle/README.md @@ -1,18 +1,27 @@ -# @casimir/oracle +# @casimir/dkg -DAO oracle service equipped with [@casimir/keys](../keys/README.md) +Trustless DKG oracle service ## About -The DAO oracle service is a [NodeJS](https://nodejs.org) application that runs a tamper-resistant oracle capable of running a [RockX distributed key generation (DKG) CLI and messenger server](https://github.com/rockx/rockx-dkg-cli) to trigger distributed key operations for Casimir validators in a trustless fashion. The oracle service code is designed to be deployed to an AMD TrustZone secure enclave (using an [AMD EPYC 7002](https://www.amd.com/en/products/epyc-7002-series-processors)) to protect the integrity and security of computation and memory (Google Cloud uses this technology to provide its flagship confidential compute product). The oracle service also watches, and is watched by, the other DAO member oracle service instances. One leader oracle service is elected to trigger key operations as needed, and the other oracle services provide tamper detection, security monitoring, and vulernability reports. The oracles report logs to IPFS to provide system transparency. +The DKG oracle service is run by DAO members to trigger and prove distributed key operations. It is a [NodeJS](https://nodejs.org) application that runs either a leader oracle capable of running a [RockX distributed key generation (DKG) CLI and messenger server](https://github.com/rockx/rockx-dkg-cli), or a follower oracle that monitors leader operations, publishes proofs, and helps to elect a new leader if necessary. -### Colluding Operator Defense +The nature and location of DKG proofs is a WIP depending on [DKG verification](https://docs.obol.tech/docs/next/charon/dkg#dkg-verification) research. -Within the trusted execution environment, we create shared secrets of the DKG-enabled presigned exit messages. The encrypted shares are distributed to the other DAO members, and any oracle can propose to exit a validator, and the shares are used to reconstruct and use the presigned validator exit message on-demand. +Critical portions of the oracle service code can be deployed to a secure enclave (like an AMD TrustZone on an [AMD EPYC 7002](https://www.amd.com/en/products/epyc-7002-series-processors)) to improve the integrity and security of computation and memory. Google Cloud uses this technology to provide its flagship confidential compute product, and Chainlink uses it to build more tamper-resistant oracle nodes. + +### Malicious Operator Defense + +If a consensus threshold of node operators do not respond to a reshare or exit signature request, the DAO has a few options: + +- Store encrypted backups of presigned exit messages, and have the leader decrypt and submit them as needed (with DAO approval) +- Have the leader call a contract-native validator exit (with DAO approval) + +> 🚩 The latter is the most secure option, but requires a WIP EIP to be implemented ### Malicious Leader Defense -A theshold signature of the DAO oracles can elect a new leader as needed, by emitting a contract event detected by the node operators, so the leader can be swiftly replaced if it is at risk of compromise, or simply fails. +A theshold signature of the DAO oracles can elect a new leader as needed, by emitting a contract event monitored by node operators, so the leader can be swiftly replaced if it is at risk of compromise, or simply fails. ### Future diff --git a/services/oracle/src/index.ts b/services/oracle/src/index.ts index 2d7aa19bf..db313d27e 100644 --- a/services/oracle/src/index.ts +++ b/services/oracle/src/index.ts @@ -16,7 +16,7 @@ void async function () { if (!managerAddress) throw new Error('No manager address provided') const manager = new ethers.Contract(managerAddress, CasimirManagerJson.abi, wallet).connect(provider) - for await (const event of on(manager as unknown as EventEmitter, 'PoolFilled')) { + for await (const event of on(manager as unknown as EventEmitter, 'PoolReady')) { const [ id, details ] = event console.log(`Pool ${id} filled at block number ${details.blockNumber}`) From 365eb1d890869a40f5736e902b83ee78c1ad61e8 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Tue, 9 May 2023 00:26:31 -0400 Subject: [PATCH 23/78] Collect fees from rewards --- contracts/ethereum/docs/index.md | 60 ++-- contracts/ethereum/helpers/dkg.ts | 5 +- contracts/ethereum/helpers/math.ts | 4 + contracts/ethereum/scripts/dev.ts | 18 +- contracts/ethereum/src/CasimirManager.sol | 287 +++++++++++------- contracts/ethereum/src/CasimirUpkeep.sol | 33 +- .../src/interfaces/ICasimirManager.sol | 32 +- contracts/ethereum/test/fixtures/shared.ts | 82 ++--- contracts/ethereum/test/integration.ts | 4 +- 9 files changed, 305 insertions(+), 220 deletions(-) create mode 100644 contracts/ethereum/helpers/math.ts diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 50d5ad8a0..5ecd84cdb 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -20,21 +20,21 @@ uint256 latestActiveStake Latest active (consensus) balance reported from upkeep -### lastPoolId +### nextPoolId ```solidity -uint256 lastPoolId +uint32 nextPoolId ``` Last pool ID created -### rewardRatioSum +### rewardsRatioSum ```solidity -uint256 rewardRatioSum +uint256 rewardsRatioSum ``` -Sum of scaled reward to stake ratios (intial value required) +Sum of scaled rewards to stake ratios (intial value required) ### linkFee @@ -55,7 +55,7 @@ SSV fee percentage (intial value required) ### constructor ```solidity -constructor(address beaconDepositAddress, address linkTokenAddress, address oracleAddress, uint64 oracleSubId, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public +constructor(address beaconDepositAddress, address _dkgOracleAddress, address functionsOracleAddress, uint64 functionsSubscriptionId, address linkTokenAddress, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public ``` Constructor @@ -65,9 +65,10 @@ Constructor | Name | Type | Description | | ---- | ---- | ----------- | | beaconDepositAddress | address | The Beacon deposit address | +| _dkgOracleAddress | address | The DKG oracle address | +| functionsOracleAddress | address | The Chainlink functions oracle address | +| functionsSubscriptionId | uint64 | The Chainlink functions subscription ID | | linkTokenAddress | address | The Chainlink token address | -| oracleAddress | address | The Chainlink functions oracle address | -| oracleSubId | uint64 | The Chainlink functions oracle subscription ID | | ssvNetworkAddress | address | The SSV network address | | ssvTokenAddress | address | The SSV token address | | swapFactoryAddress | address | The Uniswap factory address | @@ -85,7 +86,7 @@ Deposit user stake ### rebalanceStake ```solidity -function rebalanceStake(uint256 activeStake, uint256 sweptRewards) external +function rebalanceStake(uint256 activeStake, uint256 sweptRewards, uint256 sweptExits) external ``` Rebalance the reward to stake ratio and redistribute swept rewards @@ -95,7 +96,8 @@ Rebalance the reward to stake ratio and redistribute swept rewards | Name | Type | Description | | ---- | ---- | ----------- | | activeStake | uint256 | The active consensus stake | -| sweptRewards | uint256 | The swept consensus stake | +| sweptRewards | uint256 | The swept consensus rewards | +| sweptExits | uint256 | The swept consensus exits | ### requestWithdrawal @@ -592,14 +594,22 @@ Used for mocking sweeps from Beacon to the manager_ ## CasimirUpkeep -### oracleHeartbeat +### reportHeartbeat ```solidity -uint256 oracleHeartbeat +uint256 reportHeartbeat ``` Oracle heartbeat +### poolCapacity + +```solidity +uint256 poolCapacity +``` + +Pool capacity + ### requestCBOR ```solidity @@ -635,7 +645,7 @@ Oracle fulfillment gas limit ### constructor ```solidity -constructor(address managerAddress, address oracleAddress, uint64 _oracleSubId) public +constructor(address managerAddress, address functionsOracleAddress, uint64 _functionsSubscriptionId) public ``` Constructor @@ -645,8 +655,8 @@ Constructor | Name | Type | Description | | ---- | ---- | ----------- | | managerAddress | address | The manager contract address | -| oracleAddress | address | The oracle contract address | -| _oracleSubId | uint64 | The oracle subscription ID | +| functionsOracleAddress | address | The functions oracle contract address | +| _functionsSubscriptionId | uint64 | The functions subscription ID | ### generateRequest @@ -667,7 +677,7 @@ Generate a new Functions.Request(off-chain, saving gas) ### setRequest ```solidity -function setRequest(uint32 _fulfillGasLimit, uint64 _oracleSubId, bytes _requestCBOR) external +function setRequest(uint32 _fulfillGasLimit, uint64 _functionsSubscriptionId, bytes _requestCBOR) external ``` Set the bytes representing the CBOR-encoded Functions.Request @@ -677,7 +687,7 @@ Set the bytes representing the CBOR-encoded Functions.Request | Name | Type | Description | | ---- | ---- | ----------- | | _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | -| _oracleSubId | uint64 | The oracle billing subscription ID used to pay for Functions requests | +| _functionsSubscriptionId | uint64 | The functions billing subscription ID used to pay for Functions requests | | _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | ### checkUpkeep @@ -792,7 +802,7 @@ struct Pool { ```solidity struct User { uint256 stake0; - uint256 rewardRatioSum0; + uint256 rewardsRatioSum0; } ``` @@ -847,16 +857,22 @@ event PoolExitRequested(uint32 poolId) event PoolExited(uint32 poolId) ``` -### StakeDistributed +### StakeDeposited ```solidity -event StakeDistributed(address sender, uint256 amount) +event StakeDeposited(address sender, uint256 amount) ``` ### StakeRebalanced ```solidity -event StakeRebalanced(address sender, uint256 amount) +event StakeRebalanced(uint256 amount) +``` + +### RewardsDeposited + +```solidity +event RewardsDeposited(uint256 amount) ``` ### WithdrawalRequested @@ -886,7 +902,7 @@ function depositStake() external payable ### rebalanceStake ```solidity -function rebalanceStake(uint256 activeStake, uint256 sweptRewards) external +function rebalanceStake(uint256 activeStake, uint256 sweptRewards, uint256 sweptExits) external ``` ### requestWithdrawal diff --git a/contracts/ethereum/helpers/dkg.ts b/contracts/ethereum/helpers/dkg.ts index 55dfbd5a4..3913320f7 100644 --- a/contracts/ethereum/helpers/dkg.ts +++ b/contracts/ethereum/helpers/dkg.ts @@ -1,9 +1,11 @@ +import { ethers } from 'hardhat' import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' import { CasimirManager } from '../build/artifacts/types' import { validatorStore } from '@casimir/data' import { Validator } from '@casimir/types' const mockValidators: Validator[] = Object.values(validatorStore) +const mockFee = 0.1 export async function initiatePoolDeposit({ manager, dkg, index }: { manager: CasimirManager, dkg: SignerWithAddress, index: number }) { const { @@ -22,7 +24,8 @@ export async function initiatePoolDeposit({ manager, dkg, index }: { manager: Ca sharesEncrypted, sharesPublicKeys, signature, - withdrawalCredentials + withdrawalCredentials, + ethers.utils.parseEther(mockFee.toString()) // Mock fee amount estimate ~ 10 SSV ) await initiatePool.wait() } \ No newline at end of file diff --git a/contracts/ethereum/helpers/math.ts b/contracts/ethereum/helpers/math.ts new file mode 100644 index 000000000..e72ac9769 --- /dev/null +++ b/contracts/ethereum/helpers/math.ts @@ -0,0 +1,4 @@ +export function round(num: number, decimals: number | undefined = 1) { + const multiplier = Math.pow(10, decimals) + return Math.round(num * multiplier) / multiplier +} \ No newline at end of file diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 80938d992..7419b4244 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -4,6 +4,7 @@ import { CasimirUpkeep, CasimirManager } from '@casimir/ethereum/build/artifacts import { ethers } from 'hardhat' import { fulfillFunctionsRequest, runUpkeep } from '@casimir/ethereum/helpers/upkeep' import { initiatePoolDeposit } from '@casimir/ethereum/helpers/dkg' +import { round } from '@casimir/ethereum/helpers/math' import EventEmitter, { on } from 'events' void async function () { @@ -66,7 +67,7 @@ void async function () { /** Simulate rewards per staked validator */ const blocksPerReward = 50 - const rewardPerValidator = 0.1 + const rewardPerValidator = 0.105 let lastRewardBlock = await ethers.provider.getBlockNumber() ethers.provider.on('block', async (block) => { if (block - blocksPerReward === lastRewardBlock) { @@ -81,7 +82,7 @@ void async function () { /** Fulfill functions request */ if (ranUpkeepBefore) { - const nextActiveStakeAmount = Math.round((parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) + rewardAmount) * 10) / 10 + const nextActiveStakeAmount = round(parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) + rewardAmount) const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 const nextDepositedCount = 0 @@ -98,7 +99,7 @@ void async function () { /** Fulfill functions request */ if (ranUpkeepAfter) { - const nextActiveStakeAmount = Math.round((parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) - rewardAmount) * 10) / 10 + const nextActiveStakeAmount = round(parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) - rewardAmount) const nextSweptRewardsAmount = rewardAmount const nextSweptExitsAmount = 0 const nextDepositedCount = 0 @@ -112,12 +113,11 @@ void async function () { /** Stake 64 from the fourth user */ setTimeout(async () => { - const fourthUserStakeAmount = 64 - const fourthUserFees = { ...await (manager as CasimirManager).getFees() } - const fourthUserFeePercent = fourthUserFees.LINK + fourthUserFees.SSV - const fourthUserDepositAmount = fourthUserStakeAmount * ((100 + fourthUserFeePercent) / 100) - const fourthUserStake = await manager?.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(fourthUserDepositAmount.toString()) }) - await fourthUserStake?.wait() + const stakeAmount = 64 + const feePercent = await manager.getFeePercent() + const depositAmount = stakeAmount * ((100 + feePercent) / 100) + const stake = await manager?.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) + await stake?.wait() }, 1000) /** Perform upkeep and fulfill dkg answer after each pool is filled */ diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index b78d1ddb2..dd50e52ce 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -87,7 +87,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /* Dynamic State */ /********************/ - /** Latest active (consensus) balance reported from upkeep */ + /** Latest active (consensus) balance */ + uint256 latestActiveBalance; + /** Latest active (consensus) stake after fees */ uint256 latestActiveStake; /** Last pool ID created */ uint32 nextPoolId; @@ -121,10 +123,16 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint256 private requestedWithdrawals; /** Total pending withdrawals */ uint256 private pendingWithdrawals; - /** LINK fee percentage (intial value required) */ - uint32 linkFee = 1; - /** SSV fee percentage (intial value required) */ - uint32 ssvFee = 1; + /** Total pending fees reserved */ + uint256 pendingFeesReserved; + /** Total fees reserved */ + uint256 private reservedFees; + /** ETH fee percentage */ + uint32 ethFeePercent = 3; + /** LINK fee percentage */ + uint32 linkFeePercent = 1; + /** SSV fee percentage */ + uint32 ssvFeePercent = 1; /** * @notice Constructor @@ -174,56 +182,85 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function depositStake() external payable nonReentrant { require(msg.value > 0, "Deposit amount must be greater than 0"); - uint256 processedAmount = processFees(msg.value, getFees()); - require( - processedAmount >= distributionThreshold, - "Stake amount must be greater than 100 WEI" - ); + + uint256 depositAfterFees = subtractFees(msg.value); + reservedFees += msg.value - depositAfterFees; if (users[msg.sender].stake0 > 0) { users[msg.sender].stake0 = getUserStake(msg.sender); } users[msg.sender].rewardsRatioSum0 = rewardsRatioSum; - users[msg.sender].stake0 += processedAmount; + users[msg.sender].stake0 += depositAfterFees; + + distributeStake(depositAfterFees); - distributeStake(processedAmount); + emit StakeDeposited(msg.sender, depositAfterFees); + } + + /** + * @notice Deposit rewards + * @param rewards The amount of rewards to deposit + */ + function depositRewards(uint256 rewards) private { + uint256 rewardsAfterFees = subtractFees(rewards); + reservedFees += rewards - rewardsAfterFees; + distributeStake(rewardsAfterFees); - emit StakeDeposited(msg.sender, processedAmount); + emit RewardsDeposited(rewardsAfterFees); } /** - * @notice Rebalance the reward to stake ratio and redistribute swept rewards - * @param activeStake The active consensus stake + * @notice Rebalance the rewards to stake ratio and redistribute swept rewards + * @param activeBalance The active consensus balance * @param sweptRewards The swept consensus rewards * @param sweptExits The swept consensus exits */ - function rebalanceStake(uint256 activeStake, uint256 sweptRewards, uint256 sweptExits) external { + function rebalanceStake( + uint256 activeBalance, + uint256 sweptRewards, + uint256 sweptExits, + uint32 depositCount, + uint32 exitCount + ) external { require( msg.sender == address(upkeep), "Only upkeep can rebalance stake" ); - int256 current = int256(activeStake + sweptRewards + sweptExits); - int256 previous = int256(latestActiveStake + pendingPoolIds.length * poolCapacity); + uint256 depositedStake = depositCount * poolCapacity; + int256 current = int256(activeBalance + sweptRewards + sweptExits); + int256 previous = int256(latestActiveBalance + depositedStake); int256 change = current - previous; + latestActiveBalance = activeBalance; + if (change > 0) { uint256 rewards = SafeCast.toUint256(change); - // /** Reward fees set to zero for testing */ - // uint256 processedReward = processFees(reward, Fees(0, 0)); - rewardsRatioSum += Math.mulDiv(rewardsRatioSum, rewards, getStake()); - emit StakeRebalanced(rewards); + uint256 rewardsAfterFees = subtractFees(rewards); + rewardsRatioSum += Math.mulDiv(rewardsRatioSum, rewardsAfterFees, getStake()); + latestActiveStake += rewardsAfterFees; + + emit StakeRebalanced(rewardsAfterFees); } else if (change < 0) { uint256 penalty = SafeCast.toUint256(change); rewardsRatioSum -= Math.mulDiv(rewardsRatioSum, penalty, getStake()); + latestActiveStake -= penalty; + emit StakeRebalanced(penalty); } - latestActiveStake = activeStake; + latestActiveStake += depositedStake; + latestActiveStake -= subtractFees(sweptRewards); + latestActiveStake -= sweptExits; + /** Deposit swept rewards */ if (sweptRewards > 0) { - distributeStake(sweptRewards); - emit RewardsDeposited(sweptRewards); + depositRewards(sweptRewards); + } + + /** Complete the deposit count of pending pools */ + if (depositCount > 0) { + completePoolDeposits(depositCount); } } @@ -232,6 +269,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param amount The amount of stake to distribute */ function distributeStake(uint256 amount) private { + require( + amount >= distributionThreshold, + "Stake amount must be greater than or equal to 100 WEI" + ); + while (amount > 0) { uint256 remainingCapacity = poolCapacity - openDeposits; if (remainingCapacity > amount) { @@ -341,6 +383,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param sharesPublicKeys The public keys of the shares * @param signature The signature * @param withdrawalCredentials The withdrawal credentials + * @param feeAmount The fee amount */ function initiatePoolDeposit( bytes32 depositDataRoot, @@ -349,16 +392,23 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { bytes[] memory sharesEncrypted, bytes[] memory sharesPublicKeys, bytes calldata signature, - bytes calldata withdrawalCredentials + bytes calldata withdrawalCredentials, + uint256 feeAmount ) external { require( msg.sender == dkgOracleAddress, "Only DKG oracle can initiate pools" ); require(readyPoolIds.length > 0, "No ready pools"); + require(reservedFees >= feeAmount, "Not enough reserved fees"); + + reservedFees -= feeAmount; // Todo validate deposit data + // Todo transfer LINK fees to keeper and functions subscriptions + (, uint256 ssvFees) = processFees(feeAmount); + uint32 poolId = readyPoolIds[0]; Pool storage pool = pools[poolId]; pool.depositDataRoot = depositDataRoot; @@ -378,16 +428,14 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { pool.depositDataRoot ); - // Todo update for v3 SSV contracts and dynamic fees - uint256 mockSSVFee = 5 ether; - ssvToken.approve(address(ssvNetwork), mockSSVFee); - ssvNetwork.registerValidator( - pool.publicKey, - pool.operatorIds, - pool.sharesPublicKeys, - pool.sharesEncrypted, - mockSSVFee - ); + ssvToken.approve(address(ssvNetwork), ssvFees); + // ssvNetwork.registerValidator( + // pool.publicKey, + // pool.operatorIds, + // pool.sharesPublicKeys, + // pool.sharesEncrypted, + // ssvFees + // ); emit PoolInitiated(poolId); } @@ -396,11 +444,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Complete a given count of the next pending pools * @param count The number of pools to complete */ - function completePoolDeposits(uint256 count) external { - require( - msg.sender == address(upkeep), - "Only upkeep can complete pending pools" - ); + function completePoolDeposits(uint256 count) private { require(pendingPoolIds.length >= count, "Not enough pending pools"); while (count > 0) { @@ -525,45 +569,54 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @dev Process fees from a deposit - * @param depositAmount The full deposit amount - * @param fees The fees to process - * @return processedAmount The processed deposit amount + * @dev Get reservable fees from a given amount + * @param amount The amount to reserve fees from + * @return amountAfterFees The amount after fees + */ + function subtractFees( + uint256 amount + ) private view returns (uint256 amountAfterFees) { + uint32 feePercent = getFeePercent(); + amountAfterFees = Math.mulDiv(amount, 100, 100 + feePercent); + } + + + /** + * @dev Process fees + * @param amount The amount of ETH to process + * @return linkFees The amount of swapped LINK fees + * @return ssvFees The amount of swapped SSV fees */ function processFees( - uint256 depositAmount, - Fees memory fees - ) private returns (uint256 processedAmount) { - uint32 feePercent = fees.LINK + fees.SSV; - uint256 ethAmount = Math.mulDiv(depositAmount, 100, 100 + feePercent); - uint256 feeAmount = depositAmount - ethAmount; - - if (feeAmount > 0) { - wrapFees(feeAmount); - - (, uint256 unswappedLINK) = swapFees( - tokenAddresses[Token.WETH], - tokenAddresses[Token.LINK], - Math.mulDiv(feeAmount, fees.LINK, feePercent) - ); - linkToken.approve( - address(upkeep), - linkToken.balanceOf(address(this)) - ); - unswappedTokens[tokenAddresses[Token.LINK]] += unswappedLINK; - - (, uint256 unswappedSSV) = swapFees( - tokenAddresses[Token.WETH], - tokenAddresses[Token.SSV], - Math.mulDiv(feeAmount, fees.SSV, feePercent) - ); - ssvToken.approve( - address(upkeep), - ssvToken.balanceOf(address(this)) - ); - unswappedTokens[tokenAddresses[Token.SSV]] += unswappedSSV; - } - processedAmount = ethAmount; + uint256 amount + ) private returns (uint256 linkFees, uint256 ssvFees) { + wrapFees(amount); + + uint32 feePercent = getFeePercent(); + + (uint256 swappedLINK, uint256 unswappedLINK) = swapFees( + tokenAddresses[Token.WETH], + tokenAddresses[Token.LINK], + Math.mulDiv(amount, linkFeePercent, feePercent) + ); + linkToken.approve( + address(upkeep), + linkToken.balanceOf(address(this)) + ); + linkFees = swappedLINK; + unswappedTokens[tokenAddresses[Token.LINK]] += unswappedLINK; + + (uint256 swappedSSV, uint256 unswappedSSV) = swapFees( + tokenAddresses[Token.WETH], + tokenAddresses[Token.SSV], + Math.mulDiv(amount, ssvFeePercent, feePercent) + ); + ssvToken.approve( + address(upkeep), + ssvToken.balanceOf(address(this)) + ); + ssvFees = swappedSSV; + unswappedTokens[tokenAddresses[Token.SSV]] += unswappedSSV; } /** @@ -581,6 +634,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @dev Swap token in for token out + * @param tokenIn The token to swap in + * @param tokenOut The token to swap out + * @param amountIn The amount of token in */ function swapFees( address tokenIn, @@ -614,19 +670,20 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @dev Update link fee - * @param newFee The new fee - */ - function setLINKFee(uint32 newFee) external onlyOwner { - linkFee = newFee; - } - - /** - * @dev Update ssv fee - * @param newFee The new fee + * @dev Update fee percentages + * @param _ethFeePercent The new ETH fee percentage + * @param _linkFeePercent The new LINK fee percentage + * @param _ssvFeePercent The new SSV fee percentage */ - function setSSVFee(uint32 newFee) external onlyOwner { - ssvFee = newFee; + function setFeePercents( + uint32 _ethFeePercent, + uint32 _linkFeePercent, + uint32 _ssvFeePercent + ) external onlyOwner { + ethFeePercent = _ethFeePercent; + linkFeePercent = _linkFeePercent; + ssvFeePercent = _ssvFeePercent; + // If new sum total, also set estimated block to use new percentages for swept rewards } /** @@ -638,38 +695,30 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Get the total manager stake - * @return stake The total manager stake + * @notice Get the manager stake + * @return stake The manager stake */ function getStake() public view returns (uint256 stake) { stake = getBufferedStake() + getActiveStake(); } /** - * @notice Get the total manager buffered (execution) stake - * @return bufferedStake The total manager buffered (execution) stake + * @notice Get the manager buffered (execution) stake + * @return stake The manager buffered (execution) stake */ - function getBufferedStake() public view returns (uint256 bufferedStake) { - bufferedStake = + function getBufferedStake() public view returns (uint256 stake) { + stake = (readyPoolIds.length + pendingPoolIds.length) * poolCapacity + openDeposits; } - /** - * @notice Get the total manager swept (execution) stake - * @return sweptStake The total manager swept (execution) stake - */ - function getSweptStake() public view returns (uint256 sweptStake) { - sweptStake = address(this).balance - getBufferedStake(); - } - /** * @notice Get the manager active (consensus) stake - * @return activeStake The total manager active (consensus) stake + * @return stake The manager active (consensus) stake */ - function getActiveStake() public view returns (uint256 activeStake) { - activeStake = latestActiveStake; + function getActiveStake() public view returns (uint256 stake) { + stake = latestActiveStake; } /** @@ -689,11 +738,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Get the current token fees as percentages - * @return fees The current token fees as percentages + * @notice Get the total fee percentage + * @return feePercent The total fee percentage */ - function getFees() public view returns (Fees memory fees) { - fees = Fees(linkFee, ssvFee); + function getFeePercent() public view returns (uint32 feePercent) { + feePercent = ethFeePercent + linkFeePercent + ssvFeePercent; } // External view functions @@ -807,20 +856,28 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { pool = pools[poolId]; } + /** + * @notice Get the ETH fee percentage to charge on each deposit + * @return The ETH fee percentage to charge on each deposit + */ + function getETHFeePercent() external view returns (uint32) { + return ethFeePercent; + } + /** * @notice Get the LINK fee percentage to charge on each deposit * @return The LINK fee percentage to charge on each deposit */ - function getLINKFee() external view returns (uint32) { - return linkFee; + function getLINKFeePercent() external view returns (uint32) { + return linkFeePercent; } /** * @notice Get the SSV fee percentage to charge on each deposit * @return The SSV fee percentage to charge on each deposit */ - function getSSVFee() external view returns (uint32) { - return ssvFee; + function getSSVFeePercent() external view returns (uint32) { + return ssvFeePercent; } /** diff --git a/contracts/ethereum/src/CasimirUpkeep.sol b/contracts/ethereum/src/CasimirUpkeep.sol index 9dd706949..466a305b2 100644 --- a/contracts/ethereum/src/CasimirUpkeep.sol +++ b/contracts/ethereum/src/CasimirUpkeep.sol @@ -39,23 +39,23 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /* Dynamic State */ /********************/ - /** Serialized oracle source code */ + /** Binary request source code */ bytes public requestCBOR; - /** Latest oracle request ID */ + /** Latest request ID */ bytes32 public latestRequestId; - /** Latest fulfilled oracle request ID */ + /** Latest fulfilled request ID */ bytes32 public latestFulfilledRequestId; - /** Latest oracle response */ + /** Latest response */ bytes private latestResponse; - /** Latest oracle response timestamp */ + /** Latest response timestamp */ uint256 private latestResponseTimestamp; - /** Latest oracle error */ + /** Latest error */ bytes private latestError; - /** Latest oracle response count */ + /** Latest response count */ uint256 private responseCounter; - /** Oracle fulfillment gas limit */ + /** Fulfillment gas limit */ uint32 fulfillGasLimit; - /** Oracle subscription ID */ + /** Functions subscription ID */ uint64 private functionsSubscriptionId; /***************/ @@ -201,19 +201,20 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { uint256 sweptRewards = uint256(uint64(report >> 64)) * 1 gwei; uint256 sweptExits = uint256(uint64(report >> 128)) * 1 gwei; uint32 depositCount = uint32(report >> 192); - // uint32 exitCount = uint32(report >> 224); + uint32 exitCount = uint32(report >> 224); // if (sweptExits < exitCount * poolCapacity) { // sweptExits = amount recovered from blamed operator collateral // } /** Rebalance the stake */ - manager.rebalanceStake(activeStake, sweptRewards, sweptExits); - - /** Complete the deposit count of pending pools */ - if (depositCount > 0) { - manager.completePoolDeposits(depositCount); - } + manager.rebalanceStake( + activeStake, + sweptRewards, + sweptExits, + depositCount, + exitCount + ); } emit OCRResponse(requestId, response, err); diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index f852a93c6..09cab26e9 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -12,11 +12,6 @@ interface ICasimirManager { uint256 linkAmount; uint256 ssvAmount; } - /** Token fees required for contract protocols */ - struct Fees { - uint32 LINK; - uint32 SSV; - } /** Pool used for running a validator */ struct Pool { uint256 deposits; @@ -65,7 +60,13 @@ interface ICasimirManager { function depositStake() external payable; - function rebalanceStake(uint256 activeStake, uint256 sweptRewards, uint256 sweptExits) external; + function rebalanceStake( + uint256 activeStake, + uint256 sweptRewards, + uint256 sweptExits, + uint32 depositCount, + uint32 exitCount + ) external; function requestWithdrawal(uint256 amount) external; @@ -80,11 +81,10 @@ interface ICasimirManager { bytes[] memory sharesEncrypted, bytes[] memory sharesPublicKeys, bytes calldata signature, - bytes calldata withdrawalCredentials + bytes calldata withdrawalCredentials, + uint256 feeAmount ) external; - function completePoolDeposits(uint256 count) external; - function requestPoolExits(uint256 count) external; function completePoolExit( @@ -92,17 +92,17 @@ interface ICasimirManager { uint256 validatorIndex ) external; - function setLINKFee(uint32 fee) external; - - function setSSVFee(uint32 fee) external; + function setFeePercents(uint32 ethFeePercent, uint32 linkFeePercent, uint32 ssvFeePercent) external; function setOracleAddress(address oracleAddress) external; - function getFees() external view returns (Fees memory); + function getFeePercent() external view returns (uint32); + + function getETHFeePercent() external view returns (uint32); - function getLINKFee() external view returns (uint32); + function getLINKFeePercent() external view returns (uint32); - function getSSVFee() external view returns (uint32); + function getSSVFeePercent() external view returns (uint32); function getStakedValidatorPublicKeys() external @@ -124,8 +124,6 @@ interface ICasimirManager { function getBufferedStake() external view returns (uint256); - function getSweptStake() external view returns (uint256); - function getActiveStake() external view returns (uint256); function getOpenDeposits() external view returns (uint256); diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 1c955ad53..845ffe590 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -4,10 +4,11 @@ import { deployContract } from '@casimir/ethereum/helpers/deploy' import { CasimirManager, CasimirUpkeep } from '@casimir/ethereum/build/artifacts/types' import { fulfillFunctionsRequest, runUpkeep } from '@casimir/ethereum/helpers/upkeep' import { initiatePoolDeposit } from '@casimir/ethereum/helpers/dkg' +import { round } from '@casimir/ethereum/helpers/math' import { ContractConfig, DeploymentConfig } from '@casimir/types' -/** Simulation amount of reward to distribute per staked validator */ -const rewardPerValidator = 0.1 +/** Simulation amount of rewards to distribute per staked validator */ +const rewardsPerValidator = 0.105 /** Fixture to deploy SSV manager contract */ export async function deploymentFixture() { @@ -77,12 +78,8 @@ export async function firstUserDepositFixture() { const [, firstUser] = await ethers.getSigners() const stakeAmount = 16 - - const fees = { ...await manager.getFees() } - const feePercent = fees.LINK + fees.SSV - const depositAmount = stakeAmount * ((100 + feePercent) / 100) - const value = ethers.utils.parseEther(depositAmount.toString()) - const deposit = await manager.connect(firstUser).depositStake({ value }) + const depositAmount = round(stakeAmount * ((100 + await manager.getFeePercent()) / 100), 10) + const deposit = await manager.connect(firstUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await deposit.wait() /** Run upkeep */ @@ -102,12 +99,8 @@ export async function secondUserDepositFixture() { const nextSweptExitsAmount = 0 const nextDepositedCount = 1 const nextExitedCount = 0 - - const fees = { ...await manager.getFees() } - const feePercent = fees.LINK + fees.SSV - const depositAmount = stakeAmount * ((100 + feePercent) / 100) - const value = ethers.utils.parseEther(depositAmount.toString()) - const deposit = await manager.connect(secondUser).depositStake({ value }) + const depositAmount = round(stakeAmount * ((100 + await manager.getFeePercent()) / 100), 10) + const deposit = await manager.connect(secondUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await deposit.wait() /** Initiate next ready pool */ @@ -125,12 +118,12 @@ export async function secondUserDepositFixture() { return { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } } -/** Fixture to reward 0.1 ETH in total to the first and second user */ +/** Fixture to report increase of 0.105 ETH in total rewards (before fees) */ export async function rewardPostSecondUserDepositFixture() { const { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } = await loadFixture(secondUserDepositFixture) - const rewardAmount = 0.1 - const nextActiveStakeAmount = 32 + rewardAmount + const rewardsAmount = 0.105 + const nextActiveStakeAmount = 32 + rewardsAmount const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 const nextDepositedCount = 0 @@ -147,11 +140,11 @@ export async function rewardPostSecondUserDepositFixture() { return { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } } -/** Fixture to sweep 0.1 ETH to the manager */ +/** Fixture to sweep 0.105 ETH to the manager */ export async function sweepPostSecondUserDepositFixture() { const { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } = await loadFixture(secondUserDepositFixture) - const sweptRewards = 0.1 + const sweptRewards = 0.105 const sweep = await keeper.sendTransaction({ to: manager.address, value: ethers.utils.parseEther(sweptRewards.toString()) }) await sweep.wait() @@ -183,12 +176,8 @@ export async function thirdUserDepositFixture() { const nextSweptExitsAmount = 0 const nextDepositedCount = 1 const nextExitedCount = 0 - - const fees = { ...await manager.getFees() } - const feePercent = fees.LINK + fees.SSV - const depositAmount = stakeAmount * ((100 + feePercent) / 100) - const value = ethers.utils.parseEther(depositAmount.toString()) - const deposit = await manager.connect(thirdUser).depositStake({ value }) + const depositAmount = round(stakeAmount * ((100 + await manager.getFeePercent()) / 100), 10) + const deposit = await manager.connect(thirdUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await deposit.wait() /** Initiate next ready pool */ @@ -206,12 +195,12 @@ export async function thirdUserDepositFixture() { return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } } -/** Fixture to reward 0.2 ETH in total to the first, second, and third user */ +/** Fixture to report increase of 0.21 ETH in total rewards (before fees) */ export async function rewardPostThirdUserDepositFixture() { const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } = await loadFixture(thirdUserDepositFixture) - const rewardAmount = 0.2 - const nextActiveStakeAmount = 64 + rewardAmount + const rewardsAmount = 0.21 + const nextActiveStakeAmount = 64 + rewardsAmount const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 const nextDepositedCount = 0 @@ -228,11 +217,11 @@ export async function rewardPostThirdUserDepositFixture() { return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } } -/** Fixture to sweep 0.2 ETH to the manager */ +/** Fixture to sweep 0.21 ETH to the manager */ export async function sweepPostThirdUserDepositFixture() { const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } = await loadFixture(rewardPostThirdUserDepositFixture) - const sweptRewards = 0.2 + const sweptRewards = 0.21 const sweep = await keeper.sendTransaction({ to: manager.address, value: ethers.utils.parseEther(sweptRewards.toString()) }) await sweep.wait() @@ -277,12 +266,8 @@ export async function fourthUserDepositFixture() { const nextSweptExitsAmount = 0 const nextDepositedCount = 2 const nextExitedCount = 0 - - const fees = { ...await manager.getFees() } - const feePercent = fees.LINK + fees.SSV - const depositAmount = stakeAmount * ((100 + feePercent) / 100) - const value = ethers.utils.parseEther(depositAmount.toString()) - const deposit = await manager.connect(fourthUser).depositStake({ value }) + const depositAmount = round(stakeAmount * ((100 + await manager.getFeePercent()) / 100), 10) + const deposit = await manager.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await deposit.wait() /** Initiate next ready pools (2) */ @@ -307,12 +292,14 @@ export async function simulationFixture() { const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } = await loadFixture(fourthUserDepositFixture) let nextActiveStakeAmount = 128 + let totalRewards = 0 for (let i = 0; i < 5; i++) { const stakedValidatorCount = (await manager.getStakedValidatorPublicKeys())?.length if (stakedValidatorCount) { - const rewardAmount = rewardPerValidator * stakedValidatorCount - nextActiveStakeAmount = Math.round((nextActiveStakeAmount + rewardAmount) * 10) / 10 // Fixes weird rounding error + const rewardsAmount = rewardsPerValidator * stakedValidatorCount + totalRewards += round(rewardsAmount, 10) + nextActiveStakeAmount = round(nextActiveStakeAmount + rewardsAmount, 10) const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 const nextDepositedCount = 0 @@ -327,5 +314,24 @@ export async function simulationFixture() { } } } + + const sweptRewards = totalRewards + const sweep = await keeper.sendTransaction({ to: manager.address, value: ethers.utils.parseEther(sweptRewards.toString()) }) + await sweep.wait() + + nextActiveStakeAmount = 128 + const nextSweptRewardsAmount = sweptRewards + const nextSweptExitsAmount = 0 + const nextDepositedCount = 0 + const nextExitedCount = 0 + + /** Run upkeep */ + const ranUpkeep = await runUpkeep({ upkeep, keeper }) + + /** Fulfill functions request */ + if (ranUpkeep) { + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + } + return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } } \ No newline at end of file diff --git a/contracts/ethereum/test/integration.ts b/contracts/ethereum/test/integration.ts index c35568ab4..2b06ffcfc 100644 --- a/contracts/ethereum/test/integration.ts +++ b/contracts/ethereum/test/integration.ts @@ -41,7 +41,7 @@ describe('Casimir manager', async function () { expect(ethers.utils.formatEther(stake)).equal('24.0') }) - it('First and second user\'s stake earns 0.1 in total after some time', async function () { + it('Functions oracle reports an increase of 0.1 in total after fees', async function () { const { manager } = await loadFixture(rewardPostSecondUserDepositFixture) const stake = await manager.getStake() expect(ethers.utils.formatEther(stake)).equal('40.1') @@ -85,7 +85,7 @@ describe('Casimir manager', async function () { expect(ethers.utils.formatEther(stake)).equal('24.0') }) - it('First, second, and third user\'s stake earns them 0.3 in total after some time', async function () { + it('Functions oracle reports an increase of 0.2 in total after fees', async function () { const { manager } = await loadFixture(rewardPostThirdUserDepositFixture) const stake = await manager.getStake() expect(ethers.utils.formatEther(stake)).equal('64.3') From f6efdd61ef7ab50cc1b98a90255671aa6768aafa Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Tue, 9 May 2023 23:11:09 -0400 Subject: [PATCH 24/78] Use dkg oracle in local network simulation --- .gitmodules | 2 +- common/helpers/src/index.ts | 2 +- contracts/ethereum/docs/index.md | 202 ++++++-------- contracts/ethereum/helpers/dkg.ts | 4 +- contracts/ethereum/scripts/dev.ts | 12 +- contracts/ethereum/src/CasimirManager.sol | 6 +- contracts/ethereum/test/fixtures/shared.ts | 48 ++-- contracts/ethereum/test/integration.ts | 10 +- scripts/ethereum/dev.ts | 2 +- services/{oracle => dkg}/README.md | 2 +- services/{oracle => dkg}/package.json | 13 +- services/dkg/scripts/dev.ts | 17 ++ .../scripts/resources/rockx-dkg-cli | 0 services/dkg/src/index.ts | 29 ++ .../src/interfaces/CreateValidatorOptions.ts | 0 services/dkg/src/interfaces/DKGOptions.ts | 4 + .../src/interfaces/DepositData.ts | 0 .../src/interfaces/KeyGenerationInput.ts | 0 .../src/interfaces/ReshareInput.ts | 0 .../src/interfaces/ReshareValidatorOptions.ts | 0 .../{keys => dkg}/src/interfaces/Shares.ts | 0 services/dkg/src/providers/commands.ts | 49 ++++ .../index.ts => dkg/src/providers/config.ts} | 24 +- services/dkg/src/providers/dkg.ts | 260 ++++++++++++++++++ services/dkg/src/providers/events.ts | 11 + services/dkg/src/providers/iterables.ts | 16 ++ services/dkg/src/providers/signer.ts | 49 ++++ services/{oracle => dkg}/tsconfig.json | 0 services/keys/.gitignore | 4 - services/keys/README.md | 37 --- services/keys/build.js | 13 - services/keys/jest.config.js | 9 - services/keys/package.json | 24 -- services/keys/scripts/dev.ts | 32 --- services/keys/src/index.ts | 6 - services/keys/src/interfaces/CLIOutput.ts | 8 - services/keys/src/interfaces/CommandArgs.ts | 12 - services/keys/src/interfaces/DKGOptions.ts | 4 - services/keys/src/interfaces/SSVOptions.ts | 4 - services/keys/src/providers/dkg.ts | 146 ---------- services/keys/src/providers/ssv.ts | 138 ---------- services/keys/test/validators.test.ts | 14 - services/keys/tsconfig.json | 28 -- 43 files changed, 593 insertions(+), 648 deletions(-) rename services/{oracle => dkg}/README.md (98%) rename services/{oracle => dkg}/package.json (54%) create mode 100644 services/dkg/scripts/dev.ts rename services/{keys => dkg}/scripts/resources/rockx-dkg-cli (100%) create mode 100644 services/dkg/src/index.ts rename services/{keys => dkg}/src/interfaces/CreateValidatorOptions.ts (100%) create mode 100644 services/dkg/src/interfaces/DKGOptions.ts rename services/{keys => dkg}/src/interfaces/DepositData.ts (100%) rename services/{keys => dkg}/src/interfaces/KeyGenerationInput.ts (100%) rename services/{keys => dkg}/src/interfaces/ReshareInput.ts (100%) rename services/{keys => dkg}/src/interfaces/ReshareValidatorOptions.ts (100%) rename services/{keys => dkg}/src/interfaces/Shares.ts (100%) create mode 100644 services/dkg/src/providers/commands.ts rename services/{oracle/src/index.ts => dkg/src/providers/config.ts} (56%) create mode 100644 services/dkg/src/providers/dkg.ts create mode 100644 services/dkg/src/providers/events.ts create mode 100644 services/dkg/src/providers/iterables.ts create mode 100644 services/dkg/src/providers/signer.ts rename services/{oracle => dkg}/tsconfig.json (100%) delete mode 100644 services/keys/.gitignore delete mode 100644 services/keys/README.md delete mode 100644 services/keys/build.js delete mode 100644 services/keys/jest.config.js delete mode 100644 services/keys/package.json delete mode 100644 services/keys/scripts/dev.ts delete mode 100644 services/keys/src/index.ts delete mode 100644 services/keys/src/interfaces/CLIOutput.ts delete mode 100644 services/keys/src/interfaces/CommandArgs.ts delete mode 100644 services/keys/src/interfaces/DKGOptions.ts delete mode 100644 services/keys/src/interfaces/SSVOptions.ts delete mode 100644 services/keys/src/providers/dkg.ts delete mode 100644 services/keys/src/providers/ssv.ts delete mode 100644 services/keys/test/validators.test.ts delete mode 100644 services/keys/tsconfig.json diff --git a/.gitmodules b/.gitmodules index c3081fa2d..a4c767733 100644 --- a/.gitmodules +++ b/.gitmodules @@ -23,5 +23,5 @@ path = scripts/trezor/resources/trezor-user-env url = https://github.com/trezor/trezor-user-env.git [submodule "services/keys/scripts/resources/rockx-dkg-cli"] - path = services/keys/scripts/resources/rockx-dkg-cli + path = services/dkg/scripts/resources/rockx-dkg-cli url = https://github.com/RockX-SG/rockx-dkg-cli.git diff --git a/common/helpers/src/index.ts b/common/helpers/src/index.ts index 2df307661..00d821082 100644 --- a/common/helpers/src/index.ts +++ b/common/helpers/src/index.ts @@ -1,4 +1,4 @@ -import { spawn } from 'child_process' +import { spawn, execSync } from 'child_process' import { fromIni } from '@aws-sdk/credential-providers' import { SecretsManagerClient, GetSecretValueCommand } from '@aws-sdk/client-secrets-manager' import { ethers } from 'ethers' diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 5ecd84cdb..b662280fb 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -12,13 +12,21 @@ enum Token { } ``` +### latestActiveBalance + +```solidity +uint256 latestActiveBalance +``` + +Latest active (consensus) balance + ### latestActiveStake ```solidity uint256 latestActiveStake ``` -Latest active (consensus) balance reported from upkeep +Latest active (consensus) stake after fees ### nextPoolId @@ -36,21 +44,37 @@ uint256 rewardsRatioSum Sum of scaled rewards to stake ratios (intial value required) -### linkFee +### pendingFeesReserved + +```solidity +uint256 pendingFeesReserved +``` + +Total pending fees reserved + +### ethFeePercent ```solidity -uint32 linkFee +uint32 ethFeePercent ``` -LINK fee percentage (intial value required) +ETH fee percentage -### ssvFee +### linkFeePercent ```solidity -uint32 ssvFee +uint32 linkFeePercent ``` -SSV fee percentage (intial value required) +LINK fee percentage + +### ssvFeePercent + +```solidity +uint32 ssvFeePercent +``` + +SSV fee percentage ### constructor @@ -86,18 +110,20 @@ Deposit user stake ### rebalanceStake ```solidity -function rebalanceStake(uint256 activeStake, uint256 sweptRewards, uint256 sweptExits) external +function rebalanceStake(uint256 activeBalance, uint256 sweptRewards, uint256 sweptExits, uint32 depositCount, uint32 exitCount) external ``` -Rebalance the reward to stake ratio and redistribute swept rewards +Rebalance the rewards to stake ratio and redistribute swept rewards #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| activeStake | uint256 | The active consensus stake | +| activeBalance | uint256 | The active consensus balance | | sweptRewards | uint256 | The swept consensus rewards | | sweptExits | uint256 | The swept consensus exits | +| depositCount | uint32 | | +| exitCount | uint32 | | ### requestWithdrawal @@ -144,7 +170,7 @@ Complete a given count of pending withdrawals ### initiatePoolDeposit ```solidity -function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external +function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials, uint256 feeAmount) external ``` Initiate the next ready pool @@ -160,20 +186,7 @@ Initiate the next ready pool | sharesPublicKeys | bytes[] | The public keys of the shares | | signature | bytes | The signature | | withdrawalCredentials | bytes | The withdrawal credentials | - -### completePoolDeposits - -```solidity -function completePoolDeposits(uint256 count) external -``` - -Complete a given count of the next pending pools - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| count | uint256 | The number of pools to complete | +| feeAmount | uint256 | The fee amount | ### requestPoolExits @@ -235,33 +248,21 @@ Reshare a given pool's validator | sharesEncrypted | bytes[] | The encrypted shares | | sharesPublicKeys | bytes[] | The public keys of the shares | -### setLINKFee - -```solidity -function setLINKFee(uint32 newFee) external -``` - -_Update link fee_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| newFee | uint32 | The new fee | - -### setSSVFee +### setFeePercents ```solidity -function setSSVFee(uint32 newFee) external +function setFeePercents(uint32 _ethFeePercent, uint32 _linkFeePercent, uint32 _ssvFeePercent) external ``` -_Update ssv fee_ +_Update fee percentages_ #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| newFee | uint32 | The new fee | +| _ethFeePercent | uint32 | The new ETH fee percentage | +| _linkFeePercent | uint32 | The new LINK fee percentage | +| _ssvFeePercent | uint32 | The new SSV fee percentage | ### setOracleAddress @@ -283,46 +284,32 @@ Update the functions oracle address function getStake() public view returns (uint256 stake) ``` -Get the total manager stake +Get the manager stake #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| stake | uint256 | The total manager stake | +| stake | uint256 | The manager stake | ### getBufferedStake ```solidity -function getBufferedStake() public view returns (uint256 bufferedStake) -``` - -Get the total manager buffered (execution) stake - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| bufferedStake | uint256 | The total manager buffered (execution) stake | - -### getSweptStake - -```solidity -function getSweptStake() public view returns (uint256 sweptStake) +function getBufferedStake() public view returns (uint256 stake) ``` -Get the total manager swept (execution) stake +Get the manager buffered (execution) stake #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| sweptStake | uint256 | The total manager swept (execution) stake | +| stake | uint256 | The manager buffered (execution) stake | ### getActiveStake ```solidity -function getActiveStake() public view returns (uint256 activeStake) +function getActiveStake() public view returns (uint256 stake) ``` Get the manager active (consensus) stake @@ -331,7 +318,7 @@ Get the manager active (consensus) stake | Name | Type | Description | | ---- | ---- | ----------- | -| activeStake | uint256 | The total manager active (consensus) stake | +| stake | uint256 | The manager active (consensus) stake | ### getUserStake @@ -353,19 +340,19 @@ Get the total user stake for a given user address | ---- | ---- | ----------- | | userStake | uint256 | The total user stake | -### getFees +### getFeePercent ```solidity -function getFees() public view returns (struct ICasimirManager.Fees fees) +function getFeePercent() public view returns (uint32 feePercent) ``` -Get the current token fees as percentages +Get the total fee percentage #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| fees | struct ICasimirManager.Fees | The current token fees as percentages | +| feePercent | uint32 | The total fee percentage | ### getRequestedWithdrawals @@ -541,10 +528,24 @@ Get a pool by ID | ---- | ---- | ----------- | | pool | struct ICasimirManager.Pool | The pool details | -### getLINKFee +### getETHFeePercent + +```solidity +function getETHFeePercent() external view returns (uint32) +``` + +Get the ETH fee percentage to charge on each deposit + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32 | The ETH fee percentage to charge on each deposit | + +### getLINKFeePercent ```solidity -function getLINKFee() external view returns (uint32) +function getLINKFeePercent() external view returns (uint32) ``` Get the LINK fee percentage to charge on each deposit @@ -555,10 +556,10 @@ Get the LINK fee percentage to charge on each deposit | ---- | ---- | ----------- | | [0] | uint32 | The LINK fee percentage to charge on each deposit | -### getSSVFee +### getSSVFeePercent ```solidity -function getSSVFee() external view returns (uint32) +function getSSVFeePercent() external view returns (uint32) ``` Get the SSV fee percentage to charge on each deposit @@ -616,7 +617,7 @@ Pool capacity bytes requestCBOR ``` -Serialized oracle source code +Binary request source code ### latestRequestId @@ -624,7 +625,7 @@ Serialized oracle source code bytes32 latestRequestId ``` -Latest oracle request ID +Latest request ID ### latestFulfilledRequestId @@ -632,7 +633,7 @@ Latest oracle request ID bytes32 latestFulfilledRequestId ``` -Latest fulfilled oracle request ID +Latest fulfilled request ID ### fulfillGasLimit @@ -640,7 +641,7 @@ Latest fulfilled oracle request ID uint32 fulfillGasLimit ``` -Oracle fulfillment gas limit +Fulfillment gas limit ### constructor @@ -771,15 +772,6 @@ struct ProcessedDeposit { } ``` -### Fees - -```solidity -struct Fees { - uint32 LINK; - uint32 SSV; -} -``` - ### Pool ```solidity @@ -902,7 +894,7 @@ function depositStake() external payable ### rebalanceStake ```solidity -function rebalanceStake(uint256 activeStake, uint256 sweptRewards, uint256 sweptExits) external +function rebalanceStake(uint256 activeStake, uint256 sweptRewards, uint256 sweptExits, uint32 depositCount, uint32 exitCount) external ``` ### requestWithdrawal @@ -926,13 +918,7 @@ function completePendingWithdrawals(uint256 count) external ### initiatePoolDeposit ```solidity -function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials) external -``` - -### completePoolDeposits - -```solidity -function completePoolDeposits(uint256 count) external +function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials, uint256 feeAmount) external ``` ### requestPoolExits @@ -947,40 +933,40 @@ function requestPoolExits(uint256 count) external function completePoolExit(uint256 poolIndex, uint256 validatorIndex) external ``` -### setLINKFee +### setFeePercents ```solidity -function setLINKFee(uint32 fee) external +function setFeePercents(uint32 ethFeePercent, uint32 linkFeePercent, uint32 ssvFeePercent) external ``` -### setSSVFee +### setOracleAddress ```solidity -function setSSVFee(uint32 fee) external +function setOracleAddress(address oracleAddress) external ``` -### setOracleAddress +### getFeePercent ```solidity -function setOracleAddress(address oracleAddress) external +function getFeePercent() external view returns (uint32) ``` -### getFees +### getETHFeePercent ```solidity -function getFees() external view returns (struct ICasimirManager.Fees) +function getETHFeePercent() external view returns (uint32) ``` -### getLINKFee +### getLINKFeePercent ```solidity -function getLINKFee() external view returns (uint32) +function getLINKFeePercent() external view returns (uint32) ``` -### getSSVFee +### getSSVFeePercent ```solidity -function getSSVFee() external view returns (uint32) +function getSSVFeePercent() external view returns (uint32) ``` ### getStakedValidatorPublicKeys @@ -1025,12 +1011,6 @@ function getStake() external view returns (uint256) function getBufferedStake() external view returns (uint256) ``` -### getSweptStake - -```solidity -function getSweptStake() external view returns (uint256) -``` - ### getActiveStake ```solidity diff --git a/contracts/ethereum/helpers/dkg.ts b/contracts/ethereum/helpers/dkg.ts index 3913320f7..ec707b851 100644 --- a/contracts/ethereum/helpers/dkg.ts +++ b/contracts/ethereum/helpers/dkg.ts @@ -7,7 +7,7 @@ import { Validator } from '@casimir/types' const mockValidators: Validator[] = Object.values(validatorStore) const mockFee = 0.1 -export async function initiatePoolDeposit({ manager, dkg, index }: { manager: CasimirManager, dkg: SignerWithAddress, index: number }) { +export async function initiatePoolDeposit({ manager, signer, index }: { manager: CasimirManager, signer: SignerWithAddress, index: number }) { const { depositDataRoot, publicKey, @@ -17,7 +17,7 @@ export async function initiatePoolDeposit({ manager, dkg, index }: { manager: Ca signature, withdrawalCredentials } = mockValidators[index] - const initiatePool = await manager.connect(dkg).initiatePoolDeposit( + const initiatePool = await manager.connect(signer).initiatePoolDeposit( depositDataRoot, publicKey, operatorIds, diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 7419b4244..c8d361c93 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -3,7 +3,6 @@ import { ContractConfig, DeploymentConfig } from '@casimir/types' import { CasimirUpkeep, CasimirManager } from '@casimir/ethereum/build/artifacts/types' import { ethers } from 'hardhat' import { fulfillFunctionsRequest, runUpkeep } from '@casimir/ethereum/helpers/upkeep' -import { initiatePoolDeposit } from '@casimir/ethereum/helpers/dkg' import { round } from '@casimir/ethereum/helpers/math' import EventEmitter, { on } from 'events' @@ -47,7 +46,7 @@ void async function () { /** Link mock external contracts to Casimir */ if (name === 'CasimirManager') { - (config[name as keyof typeof config] as ContractConfig).args.dkgAddress = config.MockFunctionsOracle?.address + (config[name as keyof typeof config] as ContractConfig).args.functionsOracleAddress = config.MockFunctionsOracle?.address } const { args, options, proxy } = config[name as keyof typeof config] as ContractConfig @@ -120,13 +119,10 @@ void async function () { await stake?.wait() }, 1000) - /** Perform upkeep and fulfill dkg answer after each pool is filled */ - for await (const event of on(manager as unknown as EventEmitter, 'PoolReady')) { + /** Perform upkeep and fulfill dkg answer after each pool is initiated by the local oracle */ + for await (const event of on(manager as unknown as EventEmitter, 'PoolInitiated')) { const [ id, details ] = event - console.log(`Pool ${id} filled at block number ${details.blockNumber}`) - - const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length - await initiatePoolDeposit({ manager, dkg, index: nextValidatorIndex }) + console.log(`Pool ${id} initiated at block number ${details.blockNumber}`) /** Perform upkeep */ const ranUpkeep = await runUpkeep({ upkeep, keeper }) diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index dd50e52ce..40d21f5e7 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -92,7 +92,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Latest active (consensus) stake after fees */ uint256 latestActiveStake; /** Last pool ID created */ - uint32 nextPoolId; + uint32 lastPoolId; /** Token addresses */ mapping(Token => address) private tokenAddresses; /** Unswapped tokens by address */ @@ -280,8 +280,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { openDeposits += amount; amount = 0; } else { - uint32 poolId = nextPoolId; - nextPoolId++; + lastPoolId++; + uint32 poolId = lastPoolId; Pool storage pool; pool = pools[poolId]; openDeposits = 0; diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 845ffe590..ebe089ec2 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -7,9 +7,6 @@ import { initiatePoolDeposit } from '@casimir/ethereum/helpers/dkg' import { round } from '@casimir/ethereum/helpers/math' import { ContractConfig, DeploymentConfig } from '@casimir/types' -/** Simulation amount of rewards to distribute per staked validator */ -const rewardsPerValidator = 0.105 - /** Fixture to deploy SSV manager contract */ export async function deploymentFixture() { const [owner, , , , , keeper, dkg] = await ethers.getSigners() @@ -72,7 +69,7 @@ export async function deploymentFixture() { return { manager: manager as CasimirManager, upkeep: upkeep as CasimirUpkeep, owner, keeper, dkg } } -/** Fixture to stake 16 ETH for the first user */ +/** Fixture to stake 16 for the first user */ export async function firstUserDepositFixture() { const { manager, upkeep, owner, keeper, dkg } = await loadFixture(deploymentFixture) const [, firstUser] = await ethers.getSigners() @@ -88,7 +85,7 @@ export async function firstUserDepositFixture() { return { manager, upkeep, owner, firstUser, keeper, dkg } } -/** Fixture to stake 24 ETH for the second user */ +/** Fixture to stake 24 for the second user */ export async function secondUserDepositFixture() { const { manager, upkeep, owner, firstUser, keeper, dkg } = await loadFixture(firstUserDepositFixture) const [, , secondUser] = await ethers.getSigners() @@ -105,7 +102,7 @@ export async function secondUserDepositFixture() { /** Initiate next ready pool */ const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length - await initiatePoolDeposit({ manager, dkg, index: nextValidatorIndex }) + await initiatePoolDeposit({ manager, signer: dkg, index: nextValidatorIndex }) /** Run upkeep */ const ranUpkeep = await runUpkeep({ upkeep, keeper }) @@ -118,8 +115,8 @@ export async function secondUserDepositFixture() { return { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } } -/** Fixture to report increase of 0.105 ETH in total rewards (before fees) */ -export async function rewardPostSecondUserDepositFixture() { +/** Fixture to report increase of 0.105 in total rewards before fees */ +export async function rewardsPostSecondUserDepositFixture() { const { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } = await loadFixture(secondUserDepositFixture) const rewardsAmount = 0.105 @@ -140,7 +137,7 @@ export async function rewardPostSecondUserDepositFixture() { return { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } } -/** Fixture to sweep 0.105 ETH to the manager */ +/** Fixture to sweep 0.105 to the manager */ export async function sweepPostSecondUserDepositFixture() { const { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } = await loadFixture(secondUserDepositFixture) @@ -165,7 +162,7 @@ export async function sweepPostSecondUserDepositFixture() { return { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } } -/** Fixture to stake 24 ETH for the third user */ +/** Fixture to stake 24 for the third user */ export async function thirdUserDepositFixture() { const { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } = await loadFixture(sweepPostSecondUserDepositFixture) const [, , , thirdUser] = await ethers.getSigners() @@ -182,7 +179,7 @@ export async function thirdUserDepositFixture() { /** Initiate next ready pool */ const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length - await initiatePoolDeposit({ manager, dkg, index: nextValidatorIndex }) + await initiatePoolDeposit({ manager, signer: dkg, index: nextValidatorIndex }) /** Run upkeep */ const ranUpkeep = await runUpkeep({ upkeep, keeper }) @@ -195,8 +192,8 @@ export async function thirdUserDepositFixture() { return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } } -/** Fixture to report increase of 0.21 ETH in total rewards (before fees) */ -export async function rewardPostThirdUserDepositFixture() { +/** Fixture to report increase of 0.21 in total rewards before fees */ +export async function rewardsPostThirdUserDepositFixture() { const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } = await loadFixture(thirdUserDepositFixture) const rewardsAmount = 0.21 @@ -217,9 +214,9 @@ export async function rewardPostThirdUserDepositFixture() { return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } } -/** Fixture to sweep 0.21 ETH to the manager */ +/** Fixture to sweep 0.21 to the manager */ export async function sweepPostThirdUserDepositFixture() { - const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } = await loadFixture(rewardPostThirdUserDepositFixture) + const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } = await loadFixture(rewardsPostThirdUserDepositFixture) const sweptRewards = 0.21 const sweep = await keeper.sendTransaction({ to: manager.address, value: ethers.utils.parseEther(sweptRewards.toString()) }) @@ -242,7 +239,7 @@ export async function sweepPostThirdUserDepositFixture() { return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } } -/** Fixture to withdraw 0.3 to the first user */ +/** Fixture to partial withdraw 0.3 to the first user */ export async function firstUserPartialWithdrawalFixture() { const { manager, upkeep, firstUser, secondUser, thirdUser, keeper, dkg } = await loadFixture(sweepPostThirdUserDepositFixture) const openDeposits = await manager.getOpenDeposits() @@ -273,7 +270,7 @@ export async function fourthUserDepositFixture() { /** Initiate next ready pools (2) */ for (let i = 0; i < 2; i++) { const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length - await initiatePoolDeposit({ manager, dkg, index: nextValidatorIndex }) + await initiatePoolDeposit({ manager, signer: dkg, index: nextValidatorIndex }) } /** Run upkeep */ @@ -287,10 +284,25 @@ export async function fourthUserDepositFixture() { return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } } +/** Fixture to full withdraw ~24.07 */ +export async function thirdUserFullWithdrawalFixture() { + const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } = await loadFixture(fourthUserDepositFixture) + + const thirdStake = await manager.getUserStake(thirdUser.address) + const withdraw = await manager.connect(thirdUser).requestWithdrawal(thirdStake) + await withdraw.wait() + + /** Run upkeep */ + await runUpkeep({ upkeep, keeper }) + + return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } +} + /** Fixture to simulate stakes and rewards */ export async function simulationFixture() { - const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } = await loadFixture(fourthUserDepositFixture) + const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } = await loadFixture(thirdUserFullWithdrawalFixture) + const rewardsPerValidator = 0.105 let nextActiveStakeAmount = 128 let totalRewards = 0 diff --git a/contracts/ethereum/test/integration.ts b/contracts/ethereum/test/integration.ts index 2b06ffcfc..b046b75d1 100644 --- a/contracts/ethereum/test/integration.ts +++ b/contracts/ethereum/test/integration.ts @@ -1,7 +1,7 @@ import { ethers } from 'hardhat' import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' import { expect } from 'chai' -import { firstUserDepositFixture, rewardPostSecondUserDepositFixture, secondUserDepositFixture, thirdUserDepositFixture, rewardPostThirdUserDepositFixture, simulationFixture, firstUserPartialWithdrawalFixture, fourthUserDepositFixture, sweepPostSecondUserDepositFixture, sweepPostThirdUserDepositFixture } from './fixtures/shared' +import { firstUserDepositFixture, rewardsPostSecondUserDepositFixture, secondUserDepositFixture, thirdUserDepositFixture, rewardsPostThirdUserDepositFixture, simulationFixture, firstUserPartialWithdrawalFixture, fourthUserDepositFixture, sweepPostSecondUserDepositFixture, sweepPostThirdUserDepositFixture } from './fixtures/shared' describe('Casimir manager', async function () { @@ -42,13 +42,13 @@ describe('Casimir manager', async function () { }) it('Functions oracle reports an increase of 0.1 in total after fees', async function () { - const { manager } = await loadFixture(rewardPostSecondUserDepositFixture) + const { manager } = await loadFixture(rewardsPostSecondUserDepositFixture) const stake = await manager.getStake() expect(ethers.utils.formatEther(stake)).equal('40.1') }) it('First and second user\'s stake earns them 0.04 and 0.06, respectively, after some time', async function () { - const { manager, firstUser, secondUser } = await loadFixture(rewardPostSecondUserDepositFixture) + const { manager, firstUser, secondUser } = await loadFixture(rewardsPostSecondUserDepositFixture) const firstStake = await manager.getUserStake(firstUser.address) const secondStake = await manager.getUserStake(secondUser.address) expect(ethers.utils.formatEther(firstStake)).equal('16.04') @@ -86,13 +86,13 @@ describe('Casimir manager', async function () { }) it('Functions oracle reports an increase of 0.2 in total after fees', async function () { - const { manager } = await loadFixture(rewardPostThirdUserDepositFixture) + const { manager } = await loadFixture(rewardsPostThirdUserDepositFixture) const stake = await manager.getStake() expect(ethers.utils.formatEther(stake)).equal('64.3') }) it('First, second, and third user\'s stake earns them ~0.09, ~0.135 and ~0.075, respectively, after some time', async function () { - const { manager, firstUser, secondUser, thirdUser } = await loadFixture(rewardPostThirdUserDepositFixture) + const { manager, firstUser, secondUser, thirdUser } = await loadFixture(rewardsPostThirdUserDepositFixture) const firstStake = await manager.getUserStake(firstUser.address) const secondStake = await manager.getUserStake(secondUser.address) const thirdStake = await manager.getUserStake(thirdUser.address) diff --git a/scripts/ethereum/dev.ts b/scripts/ethereum/dev.ts index efb6e30c6..d13f394e5 100644 --- a/scripts/ethereum/dev.ts +++ b/scripts/ethereum/dev.ts @@ -86,5 +86,5 @@ void async function () { /** Start local oracle */ process.env.ETHEREUM_RPC_URL = 'http://localhost:8545' - $`npm run dev --workspace @casimir/oracle` + $`npm run dev --workspace @casimir/dkg` }() \ No newline at end of file diff --git a/services/oracle/README.md b/services/dkg/README.md similarity index 98% rename from services/oracle/README.md rename to services/dkg/README.md index 3fff200cb..44432f838 100644 --- a/services/oracle/README.md +++ b/services/dkg/README.md @@ -1,6 +1,6 @@ # @casimir/dkg -Trustless DKG oracle service +DKG oracle service ## About diff --git a/services/oracle/package.json b/services/dkg/package.json similarity index 54% rename from services/oracle/package.json rename to services/dkg/package.json index bfbc1d742..88e35f5ef 100644 --- a/services/oracle/package.json +++ b/services/dkg/package.json @@ -1,21 +1,24 @@ { - "name": "@casimir/oracle", + "name": "@casimir/dkg", "version": "0.0.1", - "description": "DAO oracle service", + "description": "Casimir DKG oracle service", "main": "dist/index.js", "scripts": { "build": "tsc", "start": "node dist/index.js", - "dev": "npx esno -r dotenv/config src/index.ts", + "dev": "npx esno -r dotenv/config scripts/dev.ts", "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { "ethers": "^5.7.2" }, "devDependencies": { - "@types/node": "^20.0.0", + "@types/cors": "^2.8.12", + "@types/jest": "^29.4.0", + "@types/node": "^17.0.38", "dotenv": "^16.0.3", + "esbuild": "^0.15.9", "esno": "^0.16.3", - "typescript": "^5.0.4" + "zx": "^7.1.1" } } \ No newline at end of file diff --git a/services/dkg/scripts/dev.ts b/services/dkg/scripts/dev.ts new file mode 100644 index 000000000..261d68a8f --- /dev/null +++ b/services/dkg/scripts/dev.ts @@ -0,0 +1,17 @@ +import { retryFetch } from '@casimir/helpers' +import { $ } from 'zx' + +void async function () { + process.env.MESSENGER_SRV_ADDR = 'http://0.0.0.0:3000' + process.env.USE_HARDCODED_OPERATORS ='true' + + /** Start the DKG service */ + await $`docker compose -f scripts/resources/rockx-dkg-cli/docker-compose.yaml up -d` + + /** Ping the DGK service for a pong */ + const ping = await retryFetch(`${process.env.MESSENGER_SRV_ADDR}/ping`) + const { message } = await ping.json() + if (message !== 'pong') throw new Error('DKG service is not running') + + $`npx esno -r dotenv/config src/index.ts` +}() \ No newline at end of file diff --git a/services/keys/scripts/resources/rockx-dkg-cli b/services/dkg/scripts/resources/rockx-dkg-cli similarity index 100% rename from services/keys/scripts/resources/rockx-dkg-cli rename to services/dkg/scripts/resources/rockx-dkg-cli diff --git a/services/dkg/src/index.ts b/services/dkg/src/index.ts new file mode 100644 index 000000000..4ec6a1274 --- /dev/null +++ b/services/dkg/src/index.ts @@ -0,0 +1,29 @@ +import { config } from './providers/config' +import { getEventEmitter } from './providers/events' +import { initiatePoolDepositCommand, initiatePoolExitCommand } from './providers/commands' + +const { manager, signer, messengerUrl } = config() + +const events = [ + 'PoolReady', + 'PoolExitRequested' +] + +const eventEmitter = getEventEmitter({ manager, events }) + +;(async function () { + for await (const event of eventEmitter) { + const [ id, details ] = event + + if (details.event === 'PoolReady') { + await initiatePoolDepositCommand({ manager, signer, messengerUrl }) + console.log(`Pool ${id} deposit initiated at block number ${details.blockNumber}`) + } + + if (details.event === 'PoolExitRequested') { + await initiatePoolExitCommand({ manager, messengerUrl, id }) + console.log(`Pool ${id} exit initiated at block number ${details.blockNumber}`) + } + } +})() + diff --git a/services/keys/src/interfaces/CreateValidatorOptions.ts b/services/dkg/src/interfaces/CreateValidatorOptions.ts similarity index 100% rename from services/keys/src/interfaces/CreateValidatorOptions.ts rename to services/dkg/src/interfaces/CreateValidatorOptions.ts diff --git a/services/dkg/src/interfaces/DKGOptions.ts b/services/dkg/src/interfaces/DKGOptions.ts new file mode 100644 index 000000000..a2d7b8cba --- /dev/null +++ b/services/dkg/src/interfaces/DKGOptions.ts @@ -0,0 +1,4 @@ +export interface DKGOptions { + /** The distributed key generation messenger service URL */ + messengerUrl: string +} \ No newline at end of file diff --git a/services/keys/src/interfaces/DepositData.ts b/services/dkg/src/interfaces/DepositData.ts similarity index 100% rename from services/keys/src/interfaces/DepositData.ts rename to services/dkg/src/interfaces/DepositData.ts diff --git a/services/keys/src/interfaces/KeyGenerationInput.ts b/services/dkg/src/interfaces/KeyGenerationInput.ts similarity index 100% rename from services/keys/src/interfaces/KeyGenerationInput.ts rename to services/dkg/src/interfaces/KeyGenerationInput.ts diff --git a/services/keys/src/interfaces/ReshareInput.ts b/services/dkg/src/interfaces/ReshareInput.ts similarity index 100% rename from services/keys/src/interfaces/ReshareInput.ts rename to services/dkg/src/interfaces/ReshareInput.ts diff --git a/services/keys/src/interfaces/ReshareValidatorOptions.ts b/services/dkg/src/interfaces/ReshareValidatorOptions.ts similarity index 100% rename from services/keys/src/interfaces/ReshareValidatorOptions.ts rename to services/dkg/src/interfaces/ReshareValidatorOptions.ts diff --git a/services/keys/src/interfaces/Shares.ts b/services/dkg/src/interfaces/Shares.ts similarity index 100% rename from services/keys/src/interfaces/Shares.ts rename to services/dkg/src/interfaces/Shares.ts diff --git a/services/dkg/src/providers/commands.ts b/services/dkg/src/providers/commands.ts new file mode 100644 index 000000000..fb94bbb27 --- /dev/null +++ b/services/dkg/src/providers/commands.ts @@ -0,0 +1,49 @@ +import { ethers } from 'ethers' +import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' +import { DKG } from './dkg' + +export async function initiatePoolDepositCommand({ + manager, + signer, + messengerUrl +}: { + manager: CasimirManager, + signer: ethers.Signer, + messengerUrl: string +}) { + const group = [1, 2, 3, 4] + const ssv = new DKG({ messengerUrl }) + const validator = await ssv.createValidator({ operatorIds: group }) + const { + depositDataRoot, + publicKey, + operatorIds, + sharesEncrypted, + sharesPublicKeys, + signature, + withdrawalCredentials + } = validator + const initiatePoolDeposit = await manager.connect(signer).initiatePoolDeposit( + depositDataRoot, + publicKey, + operatorIds, + sharesEncrypted, + sharesPublicKeys, + signature, + withdrawalCredentials, + ethers.utils.parseEther('0.1') // Mock fee amount estimate ~ 10 SSV + ) + await initiatePoolDeposit.wait() +} + +export async function initiatePoolExitCommand({ manager, messengerUrl, id }: { manager: CasimirManager, messengerUrl: string, id: number }) { + // Get pool to exit + const pool = await manager.getPool(id) + const { publicKey, operatorIds } = pool + + // Get operators to sign exit + const ssv = new DKG({ messengerUrl }) + + // Broadcast exit signature + +} \ No newline at end of file diff --git a/services/oracle/src/index.ts b/services/dkg/src/providers/config.ts similarity index 56% rename from services/oracle/src/index.ts rename to services/dkg/src/providers/config.ts index db313d27e..972113814 100644 --- a/services/oracle/src/index.ts +++ b/services/dkg/src/providers/config.ts @@ -1,26 +1,24 @@ import { ethers } from 'ethers' import CasimirManagerJson from '@casimir/ethereum/build/artifacts/src/CasimirManager.sol/CasimirManager.json' -import EventEmitter, { on } from 'events' +import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' -void async function () { - +export function config() { const url = process.env.ETHEREUM_RPC_URL if (!url) throw new Error('No rpc url provided') const provider = new ethers.providers.JsonRpcProvider(url) - + const mnemonic = process.env.BIP39_SEED if (!mnemonic) throw new Error('No mnemonic provided') - const wallet = ethers.Wallet.fromMnemonic(mnemonic) + const wallet = ethers.Wallet.fromMnemonic(mnemonic, 'm/44\'/60\'/0\'/0/6') + + const signer = wallet.connect(provider) const managerAddress = process.env.PUBLIC_MANAGER_ADDRESS if (!managerAddress) throw new Error('No manager address provided') - const manager = new ethers.Contract(managerAddress, CasimirManagerJson.abi, wallet).connect(provider) + const manager = new ethers.Contract(managerAddress, CasimirManagerJson.abi, signer) as ethers.Contract & CasimirManager - for await (const event of on(manager as unknown as EventEmitter, 'PoolReady')) { - const [ id, details ] = event - console.log(`Pool ${id} filled at block number ${details.blockNumber}`) + const messengerUrl = process.env.MESSENGER_SRV_ADDR + if (!messengerUrl) throw new Error('No messenger url provided') - const pool = await manager.getPool(id) - console.log('Pool details:', pool) - } -}() + return { manager, signer, messengerUrl } +} diff --git a/services/dkg/src/providers/dkg.ts b/services/dkg/src/providers/dkg.ts new file mode 100644 index 000000000..1b6cd014e --- /dev/null +++ b/services/dkg/src/providers/dkg.ts @@ -0,0 +1,260 @@ +import fs from 'fs' +import { execSync } from 'child_process' +import { KeyGenerationInput } from '../interfaces/KeyGenerationInput' +import { DepositData } from '../interfaces/DepositData' +import { Shares } from '../interfaces/Shares' +import { DKGOptions } from '../interfaces/DKGOptions' +import { ReshareInput } from '../interfaces/ReshareInput' +import { getWithdrawalCredentials } from '@casimir/helpers' +import { CreateValidatorOptions } from '../interfaces/CreateValidatorOptions' +import { Validator } from '@casimir/types' +import { ReshareValidatorOptions } from '../interfaces/ReshareValidatorOptions' +import { operatorStore } from '@casimir/data' + +export class DKG { + /** Key generation messenger service URL */ + messengerUrl: string + + constructor(options: DKGOptions) { + this.messengerUrl = options.messengerUrl + } + + /** + * Create validator with operator key shares and deposit data + * @param {CreateValidatorOptions} options - Options for creating a validator + * @returns {Promise} Validator with operator key shares and deposit data + * @example + * const validator = await createValidator({ + * operatorIds: [1, 2, 3, 4], + * withdrawalAddress: '0x07e05700cb4e946ba50244e27f01805354cd8ef0' + * }) + */ + async createValidator(options: CreateValidatorOptions): Promise { + + const operatorIds = options?.operatorIds || process.env.OPERATOR_IDS?.split(',').map(id => parseInt(id)) || [1, 2, 3, 4, 5, 6, 7, 8] + const withdrawalAddress = options?.withdrawalAddress || process.env.WITHDRAWAL_ADDRESS || '0x07e05700cb4e946ba50244e27f01805354cd8ef0' + const operators = this.getOperatorGroup(operatorIds) + + /** Start a key generation ceremony with the given operators */ + const ceremonyId = await this.startKeyGeneration({ operators, withdrawalAddress }) + console.log(`Started ceremony with ID ${ceremonyId}`) + + /** Wait for ceremony to complete */ + await new Promise(resolve => setTimeout(resolve, 2000)) + + /** Get operator key shares */ + const { encryptedKeys, publicKeys } = await this.getShares(ceremonyId) + + /** Get validator deposit data */ + const { depositDataRoot, publicKey, signature, withdrawalCredentials } = await this.getDepositData(ceremonyId, withdrawalAddress) + + /** Create validator */ + const validator: Validator = { + depositDataRoot, + publicKey, + operatorIds, + sharesEncrypted: encryptedKeys, + sharesPublicKeys: publicKeys, + signature, + withdrawalCredentials + } + + return validator + } + + /** + * Reshare validator for new operator key shares and deposit data + * @param {ReshareValidatorOptions} options - Options for resharing a validator + * @returns {Promise} Validator with operator key shares and deposit data + * @example + * const validator = await reshareValidator({ + * operatorIds: [1, 2, 3, 4], + * validatorPublicKey: '0x8eb0f05adc697cdcbdf8848f7f1e8c2277f4fc7b0efc97ceb87ce75286e4328db7259fc0c1b39ced0c594855a30d415c', + * oldOperators: { + * "2": "http://0.0.0.0:8082", + * "3": "http://0.0.0.0:8083", + * "4": "http://0.0.0.0:8084" + * } + * }) + */ + async reshareValidator(options: ReshareValidatorOptions): Promise { + + const operatorIds = options?.operatorIds || process.env.OPERATOR_IDS?.split(',').map(id => parseInt(id)) || [2, 3, 4, 5] + const validatorPublicKey = options?.validatorPublicKey || process.env.VALIDATOR_PUBLIC_KEY || '0x8eb0f05adc697cdcbdf8848f7f1e8c2277f4fc7b0efc97ceb87ce75286e4328db7259fc0c1b39ced0c594855a30d415c' + const oldOperatorIds = options?.oldOperatorIds || process.env.OLD_OPERATOR_IDS?.split(',').map(id => parseInt(id)) || [2, 3, 4] + const operators = this.getOperatorGroup(operatorIds) + const oldOperators = this.getOperatorGroup(oldOperatorIds) + const withdrawalAddress = options?.withdrawalAddress || process.env.WITHDRAWAL_ADDRESS || '0x07e05700cb4e946ba50244e27f01805354cd8ef0' + + /** Start a key generation ceremony with the given operators */ + const ceremonyId = await this.startReshare({ operators, validatorPublicKey, oldOperators }) + console.log(`Started ceremony with ID ${ceremonyId}`) + + /** Get operator key shares */ + const { encryptedKeys, publicKeys } = await this.getShares(ceremonyId) + + /** Get validator deposit data */ + const { depositDataRoot, publicKey, signature, withdrawalCredentials } = await this.getDepositData(ceremonyId, withdrawalAddress) + + /** Create validator */ + const validator: Validator = { + depositDataRoot, + publicKey, + operatorIds, + sharesEncrypted: encryptedKeys, + sharesPublicKeys: publicKeys, + signature, + withdrawalCredentials + } + + return validator + } + + /** + * Get operator group from operator IDs + * @param {number[]} operatorIds - Array of operator IDs + * @returns {} Operator group + * @example + * const group = getOperatorGroup([1, 2, 3, 4]) + * console.log(group) + * // => { + * // "1": "http://0.0.0.0:8081", + * // "2": "http://0.0.0.0:8082", + * // "3": "http://0.0.0.0:8083", + * // "4": "http://0.0.0.0:8084" + * // } + */ + getOperatorGroup(operatorIds: number[]): Record { + return operatorIds.reduce((group: Record, id: number) => { + const key = id.toString() as keyof typeof operatorStore + group[key] = operatorStore[key] + return group + }, {}) + } + + /** + * Start a new key generation ceremony + * @param {KeyGenerationInput} input - Key generation input + * @returns {Promise} Ceremony ID + * @example + * const id = await startKeyGeneration({ + * operators: { + * "1": "http://host.docker.internal:8081", + * "2": "http://host.docker.internal:8082", + * "3": "http://host.docker.internal:8083", + * "4": "http://host.docker.internal:8084" + * }, + * withdrawalAddress: '0x07e05700cb4e946ba50244e27f01805354cd8ef0' + * }) + * console.log(id) + * // => "b7e8b0e0-5c1a-4b1e-9b1e-8c1c1c1c1c1c" + */ + async startKeyGeneration(input: KeyGenerationInput): Promise { + const { operators, withdrawalAddress } = input + const operatorFlags = Object.entries(operators).map(([id, url]) => `--operator ${id}=${url}`).join(' ') + const thresholdFlag = `--threshold ${Object.keys(operators).length - 1}` + const withdrawalCredentialsFlag = `--withdrawal-credentials ${getWithdrawalCredentials(withdrawalAddress)}` + const forkVersionFlag = '--fork-version prater' + const command = `rockx-dkg-cli keygen ${operatorFlags} ${thresholdFlag} ${withdrawalCredentialsFlag} ${forkVersionFlag}` + const startKeyGeneration = execSync(`${command}`).toString().trim() as string + const ceremonyId = startKeyGeneration.split(' ').pop() as string + return ceremonyId + } + + /** + * Start a resharing ceremony + * @param {ReshareInput} input - Reshare input + * @returns {Promise} Ceremony ID + * @example + * const id = await startReshare({ + * operators: { + * "2": "http://host.docker.internal:8082", + * "3": "http://host.docker.internal:8083", + * "4": "http://host.docker.internal:8084", + * "5": "http://host.docker.internal:8085" + * }, + * validatorPublicKey: '0x8eb0f05adc697cdcbdf8848f7f1e8c2277f4fc7b0efc97ceb87ce75286e4328db7259fc0c1b39ced0c594855a30d415c', + * oldOperators: { + * "2": "http://host.docker.internal:8082", + * "3": "http://host.docker.internal:8083", + * "4": "http://host.docker.internal:8084" + * } + * }) + * console.log(id) + * // => "b7e8b0e0-5c1a-4b1e-9b1e-8c1c1c1c1c1c" + */ + async startReshare(input: ReshareInput): Promise { + const { operators, validatorPublicKey, oldOperators } = input + const operatorFlags = Object.entries(operators).map(([id, url]) => `--operator ${id}=${url}`).join(' ') + const thresholdFlag = `--threshold ${Object.keys(operators).length - 1}` + const validatorPublicKeyFlag = `--validator-public-key ${validatorPublicKey}` + const oldOperatorFlags = Object.entries(oldOperators).map(([id, url]) => `--old-operator ${id}=${url}`).join(' ') + const command = `rockx-dkg-cli reshare ${operatorFlags} ${thresholdFlag} ${validatorPublicKeyFlag} ${oldOperatorFlags}` + const startReshare = execSync(`${command}`).toString().trim() as string + const ceremonyId = startReshare.split(' ').pop() as string + return ceremonyId + } + + /** + * Get key generation shares and public keys + * @param {string} ceremonyId - Ceremony ID + * @returns {Promise} Arrays of shares and public keys + * @example + * const shares = await getShares('b7e8b0e0-5c1a-4b1e-9b1e-8c1c1c1c1c1c') + * console.log(shares) + * // => { + * // encryptedKeys: ["0x000000...", ...], + * // publicKeys: ["0x000000...", ...] + * // } + */ + async getShares(ceremonyId: string): Promise { + const requestIdFlag = `--request-id ${ceremonyId}` + const command = `rockx-dkg-cli get-keyshares ${requestIdFlag}` + const getShares = execSync(`${command}`).toString().trim() as string + const sharesFile = getShares.split(' ').pop() as string + const sharesJSON = JSON.parse(fs.readFileSync(`${sharesFile}`, 'utf8')) + fs.rmSync(sharesFile) + return { + encryptedKeys: sharesJSON.data.shares.encryptedKeys.map((key: string) => '0x' + key), + publicKeys: sharesJSON.data.shares.publicKeys + } + + } + + /** + * Get key generation deposit data + * @param {string} ceremonyId - Ceremony ID + * @returns {Promise} Deposit data + * @example + * const depositData = await getDepositData('b7e8b0e0-5c1a-4b1e-9b1e-8c1c1c1c1c1c') + * console.log(depositData) + * // => { + * // depositDataRoot: "0x000000...", + * // publicKey: "0x000000...", + * // signature: "0x000000...", + * // withdrawalCredentials: "0x000000..." + * // } + */ + async getDepositData(ceremonyId: string, withdrawalAddress: string): Promise { + const requestIdFlag = `--request-id ${ceremonyId}` + const withdrawalCredentialsFlag = `--withdrawal-credentials 01${'0'.repeat(22)}${withdrawalAddress.split('0x')[1]}` + const forkVersionFlag = '--fork-version prater' + const command = `rockx-dkg-cli generate-deposit-data ${requestIdFlag} ${withdrawalCredentialsFlag} ${forkVersionFlag}` + const getDepositData = execSync(`${command}`).toString().trim() as string + const depositDataFile = getDepositData.split(' ').pop() as string + const depositData = JSON.parse(fs.readFileSync(depositDataFile, 'utf8')) + fs.rmSync(depositDataFile) + const { + deposit_data_root: depositDataRoot, + pubkey: publicKey, + signature, + withdrawal_credentials: withdrawalCredentials + } = depositData + return { + depositDataRoot: `0x${depositDataRoot}`, + publicKey: `0x${publicKey}`, + signature: `0x${signature}`, + withdrawalCredentials: `0x${withdrawalCredentials}` + } + } +} \ No newline at end of file diff --git a/services/dkg/src/providers/events.ts b/services/dkg/src/providers/events.ts new file mode 100644 index 000000000..c6bcbdf3e --- /dev/null +++ b/services/dkg/src/providers/events.ts @@ -0,0 +1,11 @@ +import { ethers } from 'ethers' +import { on, EventEmitter } from 'events' +import { mergeAsyncIterables } from './iterables' + +export function getEventEmitter({ manager, events }: { manager: ethers.Contract, events: string[] }) { + return mergeAsyncIterables(events.map(event => getEvent({ manager, event }))) +} + +function getEvent({ manager, event }: { manager: ethers.Contract, event: string }) { + return on(manager as unknown as EventEmitter, event) +} \ No newline at end of file diff --git a/services/dkg/src/providers/iterables.ts b/services/dkg/src/providers/iterables.ts new file mode 100644 index 000000000..c4e027eb9 --- /dev/null +++ b/services/dkg/src/providers/iterables.ts @@ -0,0 +1,16 @@ +export async function* mergeAsyncIterables(iterables: AsyncIterable[]) { + const promises = iterables.map(iterable => iterable[Symbol.asyncIterator]().next()) + + while (promises.length > 0) { + const { index, value } = await Promise.race( + promises.map((promise, index) => promise.then(value => ({ index, value }))) + ) + + if (!value.done) { + promises[index] = iterables[index][Symbol.asyncIterator]().next() + yield value.value + } else { + promises.splice(index, 1) + } + } +} \ No newline at end of file diff --git a/services/dkg/src/providers/signer.ts b/services/dkg/src/providers/signer.ts new file mode 100644 index 000000000..4125cfd49 --- /dev/null +++ b/services/dkg/src/providers/signer.ts @@ -0,0 +1,49 @@ +import { ethers } from 'ethers' + +export class SignerWithAddress extends ethers.Signer { + public static async create(signer: ethers.providers.JsonRpcSigner) { + return new SignerWithAddress(await signer.getAddress(), signer) + } + + private constructor( + public readonly address: string, + private readonly _signer: ethers.providers.JsonRpcSigner + ) { + super(); + (this as any).provider = _signer.provider + } + + public async getAddress(): Promise { + return this.address + } + + public signMessage(message: string | ethers.utils.Bytes): Promise { + return this._signer.signMessage(message) + } + + public signTransaction( + transaction: ethers.utils.Deferrable + ): Promise { + return this._signer.signTransaction(transaction) + } + + public sendTransaction( + transaction: ethers.utils.Deferrable + ): Promise { + return this._signer.sendTransaction(transaction) + } + + public connect(provider: ethers.providers.Provider): SignerWithAddress { + return new SignerWithAddress(this.address, this._signer.connect(provider)) + } + + public _signTypedData( + ...params: Parameters + ): Promise { + return this._signer._signTypedData(...params) + } + + public toJSON() { + return `` + } +} \ No newline at end of file diff --git a/services/oracle/tsconfig.json b/services/dkg/tsconfig.json similarity index 100% rename from services/oracle/tsconfig.json rename to services/dkg/tsconfig.json diff --git a/services/keys/.gitignore b/services/keys/.gitignore deleted file mode 100644 index 8f055f3b5..000000000 --- a/services/keys/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -node_modules/ -dist/ -mock-logs.txt -data/ diff --git a/services/keys/README.md b/services/keys/README.md deleted file mode 100644 index cf70ad945..000000000 --- a/services/keys/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# @casimir/keys - -Service to run secure key operations with a RockX DKG messenger - -## Usage - -Create a new SSV validator with operator key shares and deposit data. - -### Install - -```zsh -npm install @casimir/keys @casimir/types # (Alternatively install as devDependencies) -``` - -### Package - -Use the package in your Node.js project. - -```ts -import { Validator } from '@casimir/types' -import { SSV, CreateValidatorOptions } from '@casimir/keys' - -... - -const ssv = new SSV({ dkgServiceUrl: 'http://0.0.0.0:8000' }) -const options: CreateValidatorOptions = { - operatorIds: [1, 2, 3, 4], - withdrawalAddress: '0x07e05700cb4e946ba50244e27f01805354cd8ef0' -} -const validators: Validator[] = await ssv.createValidator(options) -``` - -### Environment Variables - -- `DKG_SERVICE_URL` - URL of the DKG service to use for key generation (default: 'http://0.0.0.0:8000') -- `OPERATOR_IDS` - Four operator registry IDs to use for the key generation (default: [1, 2, 3, 4]) -- `WITHDRAWAL_ADDRESS` - Validator withdrawal address (default: '0x07e05700cb4e946ba50244e27f01805354cd8ef0') diff --git a/services/keys/build.js b/services/keys/build.js deleted file mode 100644 index 369b16c90..000000000 --- a/services/keys/build.js +++ /dev/null @@ -1,13 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -const esbuild = require('esbuild') - -esbuild.build({ - entryPoints: ['src/index.ts'], - outfile: 'dist/index.js', - bundle: true, - minify: true, - sourcemap: true, - platform: 'node', - target: 'esnext', - external: ['pg-native'] -}) \ No newline at end of file diff --git a/services/keys/jest.config.js b/services/keys/jest.config.js deleted file mode 100644 index 1c0c8c1ea..000000000 --- a/services/keys/jest.config.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - testEnvironment: 'node', - roots: ['/test'], - testMatch: ['**/*.test.ts'], - testTimeout: 60000, - transform: { - '^.+\\.tsx?$': 'ts-jest' - } -} \ No newline at end of file diff --git a/services/keys/package.json b/services/keys/package.json deleted file mode 100644 index a39a6224f..000000000 --- a/services/keys/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "@casimir/keys", - "private": "true", - "main": "src/index.ts", - "scripts": { - "build": "node build.js", - "dev": "npx esno -r dotenv/config src/index.ts", - "test": "jest --config jest.config.js" - }, - "dependencies": { - "ethers": "^5.7.2" - }, - "devDependencies": { - "@types/cors": "^2.8.12", - "@types/jest": "^29.4.0", - "@types/node": "^17.0.38", - "dotenv": "^16.0.3", - "esbuild": "^0.15.9", - "esno": "^0.16.3", - "jest": "^29.4.0", - "ts-jest": "^29.0.5", - "zx": "^7.1.1" - } -} diff --git a/services/keys/scripts/dev.ts b/services/keys/scripts/dev.ts deleted file mode 100644 index 33079fe30..000000000 --- a/services/keys/scripts/dev.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { retryFetch } from '@casimir/helpers' -import { $ } from 'zx' - -// Todo just start services and import/run the desired command (dev CLI, no prod CLI) - -process.env.PUBLIC_MANAGER_ADDRESS = '0xaaf5751d370d2fD5F1D5642C2f88bbFa67a29301' - -void async function () { - await $`npx esno -r dotenv/config src/index.ts help` - - const dkgServiceUrl = 'http://0.0.0.0:3000' - const groups = [[1, 2, 3, 4], [1, 2, 3, 4]] - process.env.MESSENGER_SRV_ADDR = dkgServiceUrl - process.env.USE_HARDCODED_OPERATORS ='true' - - /** Start the DKG service */ - await $`docker compose -f scripts/resources/rockx-dkg-cli/docker-compose.yaml up -d` - - /** Ping the DGK service for a pong */ - const ping = await retryFetch(`${dkgServiceUrl}/ping`) - const { message } = await ping.json() - if (message !== 'pong') throw new Error('DKG service is not running') - - await Promise.all(groups.map(async (group) => { - console.log(`Starting ceremony for operators: ${group.join(',')}`) - await $`npx esno -r dotenv/config src/index.ts create-validator --dkgServiceUrl ${dkgServiceUrl} --operatorIds ${group.join(',')}` - console.log('Completed ceremony...') - })) - - /** Stop the DKG service */ - await $`docker compose -f scripts/resources/rockx-dkg-cli/docker-compose.yaml down` -}() \ No newline at end of file diff --git a/services/keys/src/index.ts b/services/keys/src/index.ts deleted file mode 100644 index 65c69a204..000000000 --- a/services/keys/src/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { SSV } from './providers/ssv' -import { Validator } from '@casimir/types' -import { CreateValidatorOptions } from './interfaces/CreateValidatorOptions' -import { ReshareValidatorOptions } from './interfaces/ReshareValidatorOptions' - -export { SSV, Validator, CreateValidatorOptions, ReshareValidatorOptions } \ No newline at end of file diff --git a/services/keys/src/interfaces/CLIOutput.ts b/services/keys/src/interfaces/CLIOutput.ts deleted file mode 100644 index 43761e754..000000000 --- a/services/keys/src/interfaces/CLIOutput.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Validator } from '@casimir/types' - -export interface CLIOutput { - /** Status */ - status: number - /** Validator */ - validator: Validator -} \ No newline at end of file diff --git a/services/keys/src/interfaces/CommandArgs.ts b/services/keys/src/interfaces/CommandArgs.ts deleted file mode 100644 index ecf69e111..000000000 --- a/services/keys/src/interfaces/CommandArgs.ts +++ /dev/null @@ -1,12 +0,0 @@ -export interface CommandArgs { - /** The distributed key generation API service URL */ - dkgServiceUrl: string - /** Operator registry IDs */ - operatorIds: number[] - /** Validator public key */ - validatorPublicKey: string - /** Validator withdrawal address */ - withdrawalAddress: string - /** Old operator registry IDs */ - oldOperatorIds: number[] -} \ No newline at end of file diff --git a/services/keys/src/interfaces/DKGOptions.ts b/services/keys/src/interfaces/DKGOptions.ts deleted file mode 100644 index 79fd496b9..000000000 --- a/services/keys/src/interfaces/DKGOptions.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface DKGOptions { - /** The key generation API service URL */ - serviceUrl: string -} \ No newline at end of file diff --git a/services/keys/src/interfaces/SSVOptions.ts b/services/keys/src/interfaces/SSVOptions.ts deleted file mode 100644 index 6bf935b59..000000000 --- a/services/keys/src/interfaces/SSVOptions.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface SSVOptions { - /** Key generation API service URL */ - dkgServiceUrl: string -} \ No newline at end of file diff --git a/services/keys/src/providers/dkg.ts b/services/keys/src/providers/dkg.ts deleted file mode 100644 index 860996ab6..000000000 --- a/services/keys/src/providers/dkg.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { KeyGenerationInput } from '../interfaces/KeyGenerationInput' -import { DepositData } from '../interfaces/DepositData' -import { Shares } from '../interfaces/Shares' -import { DKGOptions } from '../interfaces/DKGOptions' -import { ReshareInput } from '../interfaces/ReshareInput' -import { retryFetch, retryRun, run, getWithdrawalCredentials } from '@casimir/helpers' -import fs from 'fs' - -export class DKG { - /** Key generation service URL */ - serviceUrl: string - - constructor(options: DKGOptions) { - this.serviceUrl = options.serviceUrl - } - - /** - * Start a new key generation ceremony - * @param {KeyGenerationInput} input - Key generation input - * @returns {Promise} Ceremony ID - * @example - * const id = await startKeyGeneration({ - * operators: { - * "1": "http://host.docker.internal:8081", - * "2": "http://host.docker.internal:8082", - * "3": "http://host.docker.internal:8083", - * "4": "http://host.docker.internal:8084" - * }, - * withdrawalAddress: '0x07e05700cb4e946ba50244e27f01805354cd8ef0' - * }) - * console.log(id) - * // => "b7e8b0e0-5c1a-4b1e-9b1e-8c1c1c1c1c1c" - */ - async startKeyGeneration(input: KeyGenerationInput): Promise { - const { operators, withdrawalAddress } = input - const operatorFlags = Object.entries(operators).map(([id, url]) => `--operator ${id}=${url}`).join(' ') - const thresholdFlag = `--threshold ${Object.keys(operators).length - 1}` - const withdrawalCredentialsFlag = `--withdrawal-credentials ${getWithdrawalCredentials(withdrawalAddress)}` - const forkVersionFlag = '--fork-version prater' - const command = `rockx-dkg-cli keygen ${operatorFlags} ${thresholdFlag} ${withdrawalCredentialsFlag} ${forkVersionFlag}` - const startKeyGeneration = await retryRun(`${command}`) as string - const ceremonyId = startKeyGeneration.split(' ').pop() as string - return ceremonyId - } - - /** - * Start a resharing ceremony - * @param {ReshareInput} input - Reshare input - * @returns {Promise} Ceremony ID - * @example - * const id = await startReshare({ - * operators: { - * "2": "http://host.docker.internal:8082", - * "3": "http://host.docker.internal:8083", - * "4": "http://host.docker.internal:8084", - * "5": "http://host.docker.internal:8085" - * }, - * validatorPublicKey: '0x8eb0f05adc697cdcbdf8848f7f1e8c2277f4fc7b0efc97ceb87ce75286e4328db7259fc0c1b39ced0c594855a30d415c', - * oldOperators: { - * "2": "http://host.docker.internal:8082", - * "3": "http://host.docker.internal:8083", - * "4": "http://host.docker.internal:8084" - * } - * }) - * console.log(id) - * // => "b7e8b0e0-5c1a-4b1e-9b1e-8c1c1c1c1c1c" - */ - async startReshare(input: ReshareInput): Promise { - const { operators, validatorPublicKey, oldOperators } = input - const operatorFlags = Object.entries(operators).map(([id, url]) => `--operator ${id}=${url}`).join(' ') - const thresholdFlag = `--threshold ${Object.keys(operators).length - 1}` - const validatorPublicKeyFlag = `--validator-public-key ${validatorPublicKey}` - const oldOperatorFlags = Object.entries(oldOperators).map(([id, url]) => `--old-operator ${id}=${url}`).join(' ') - const command = `rockx-dkg-cli reshare ${operatorFlags} ${thresholdFlag} ${validatorPublicKeyFlag} ${oldOperatorFlags}` - const startReshare = await retryRun(`${command}`) as string - const ceremonyId = startReshare.split(' ').pop() as string - return ceremonyId - } - - /** - * Get key generation shares and public keys - * @param {string} ceremonyId - Ceremony ID - * @returns {Promise} Arrays of shares and public keys - * @example - * const shares = await getShares('b7e8b0e0-5c1a-4b1e-9b1e-8c1c1c1c1c1c') - * console.log(shares) - * // => { - * // encryptedKeys: ["0x000000...", ...], - * // publicKeys: ["0x000000...", ...] - * // } - */ - async getShares(ceremonyId: string): Promise { - const requestIdFlag = `--request-id ${ceremonyId}` - const command = `rockx-dkg-cli get-keyshares ${requestIdFlag}` - const getShares = await retryRun(`${command}`) as string - console.log('shares getShares', getShares) - ceremonyId = getShares.split(':').pop() as string - console.log('shares ceremonyId', ceremonyId) - const sharesFile = `keyshares-${ceremonyId}` - const sharesJSON = JSON.parse(fs.readFileSync(`${sharesFile}`, 'utf8')) - fs.rmSync(sharesFile) - return { - encryptedKeys: sharesJSON.data.shares.encryptedKeys.map((key: string) => '0x' + key), - publicKeys: sharesJSON.data.shares.publicKeys - } - - } - - /** - * Get key generation deposit data - * @param {string} ceremonyId - Ceremony ID - * @returns {Promise} Deposit data - * @example - * const depositData = await getDepositData('b7e8b0e0-5c1a-4b1e-9b1e-8c1c1c1c1c1c') - * console.log(depositData) - * // => { - * // depositDataRoot: "0x000000...", - * // publicKey: "0x000000...", - * // signature: "0x000000...", - * // withdrawalCredentials: "0x000000..." - * // } - */ - async getDepositData(ceremonyId: string, withdrawalAddress: string): Promise { - const requestIdFlag = `--request-id ${ceremonyId}` - const withdrawalCredentialsFlag = `--withdrawal-credentials 01${'0'.repeat(22)}${withdrawalAddress.split('0x')[1]}` - const forkVersionFlag = '--fork-version prater' - const command = `rockx-dkg-cli generate-deposit-data ${requestIdFlag} ${withdrawalCredentialsFlag} ${forkVersionFlag}` - const getDepositData = await retryRun(`${command}`) as string - const datetime = getDepositData.split(' ').pop() as string - const depositDataFile = `depositdata-${datetime}` - const depositData = JSON.parse(fs.readFileSync(depositDataFile, 'utf8')) - fs.rmSync(depositDataFile) - const { - deposit_data_root: depositDataRoot, - pubkey: publicKey, - signature, - withdrawal_credentials: withdrawalCredentials - } = depositData - return { - depositDataRoot: `0x${depositDataRoot}`, - publicKey: `0x${publicKey}`, - signature: `0x${signature}`, - withdrawalCredentials: `0x${withdrawalCredentials}` - } - } -} \ No newline at end of file diff --git a/services/keys/src/providers/ssv.ts b/services/keys/src/providers/ssv.ts deleted file mode 100644 index 66a085091..000000000 --- a/services/keys/src/providers/ssv.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { Validator } from '@casimir/types' -import { operatorStore } from '@casimir/data' -import { DKG } from './dkg' -import { SSVOptions } from '../interfaces/SSVOptions' -import { CreateValidatorOptions } from '../interfaces/CreateValidatorOptions' -import { ReshareValidatorOptions } from '../interfaces/ReshareValidatorOptions' - -export class SSV { - /** Distributed key generation API service */ - dkgService: DKG - - /** - * SSV constructor - * @param {SSVOptions} options - SSV options - * @example - * const ssv = new SSV({ dkgServiceUrl: 'http://0.0.0.0:8000' }) - * const validators = await ssv.createValidator({ - * operatorIds: [1, 2, 3, 4], - * withdrawalAddress: '0x07e05700cb4e946ba50244e27f01805354cd8ef0' - * }) - */ - constructor(options: SSVOptions) { - this.dkgService = new DKG({ serviceUrl: options.dkgServiceUrl }) - } - - /** - * Create validator with operator key shares and deposit data - * @param {CreateValidatorOptions} options - Options for creating a validator - * @returns {Promise} Validator with operator key shares and deposit data - * @example - * const validator = await createValidator({ - * operatorIds: [1, 2, 3, 4], - * withdrawalAddress: '0x07e05700cb4e946ba50244e27f01805354cd8ef0' - * }) - */ - async createValidator(options: CreateValidatorOptions): Promise { - - const operatorIds = options?.operatorIds || process.env.OPERATOR_IDS?.split(',').map(id => parseInt(id)) || [1, 2, 3, 4, 5, 6, 7, 8] - const withdrawalAddress = options?.withdrawalAddress || process.env.WITHDRAWAL_ADDRESS || '0x07e05700cb4e946ba50244e27f01805354cd8ef0' - const operators = this.getOperatorGroup(operatorIds) - - /** Start a key generation ceremony with the given operators */ - const ceremonyId = await this.dkgService.startKeyGeneration({ operators, withdrawalAddress }) - console.log(`Started ceremony with ID ${ceremonyId}`) - - /** Wait for ceremony to complete */ - await new Promise(resolve => setTimeout(resolve, 2000)) - - /** Get operator key shares */ - const { encryptedKeys, publicKeys } = await this.dkgService.getShares(ceremonyId) - - /** Get validator deposit data */ - const { depositDataRoot, publicKey, signature, withdrawalCredentials } = await this.dkgService.getDepositData(ceremonyId, withdrawalAddress) - - /** Create validator */ - const validator: Validator = { - depositDataRoot, - publicKey, - operatorIds, - sharesEncrypted: encryptedKeys, - sharesPublicKeys: publicKeys, - signature, - withdrawalCredentials - } - - return validator - } - - /** - * Reshare validator for new operator key shares and deposit data - * @param {ReshareValidatorOptions} options - Options for resharing a validator - * @returns {Promise} Validator with operator key shares and deposit data - * @example - * const validator = await reshareValidator({ - * operatorIds: [1, 2, 3, 4], - * validatorPublicKey: '0x8eb0f05adc697cdcbdf8848f7f1e8c2277f4fc7b0efc97ceb87ce75286e4328db7259fc0c1b39ced0c594855a30d415c', - * oldOperators: { - * "2": "http://0.0.0.0:8082", - * "3": "http://0.0.0.0:8083", - * "4": "http://0.0.0.0:8084" - * } - * }) - */ - async reshareValidator(options: ReshareValidatorOptions): Promise { - - const operatorIds = options?.operatorIds || process.env.OPERATOR_IDS?.split(',').map(id => parseInt(id)) || [2, 3, 4, 5] - const validatorPublicKey = options?.validatorPublicKey || process.env.VALIDATOR_PUBLIC_KEY || '0x8eb0f05adc697cdcbdf8848f7f1e8c2277f4fc7b0efc97ceb87ce75286e4328db7259fc0c1b39ced0c594855a30d415c' - const oldOperatorIds = options?.oldOperatorIds || process.env.OLD_OPERATOR_IDS?.split(',').map(id => parseInt(id)) || [2, 3, 4] - const operators = this.getOperatorGroup(operatorIds) - const oldOperators = this.getOperatorGroup(oldOperatorIds) - const withdrawalAddress = options?.withdrawalAddress || process.env.WITHDRAWAL_ADDRESS || '0x07e05700cb4e946ba50244e27f01805354cd8ef0' - - /** Start a key generation ceremony with the given operators */ - const ceremonyId = await this.dkgService.startReshare({ operators, validatorPublicKey, oldOperators }) - console.log(`Started ceremony with ID ${ceremonyId}`) - - /** Get operator key shares */ - const { encryptedKeys, publicKeys } = await this.dkgService.getShares(ceremonyId) - - /** Get validator deposit data */ - const { depositDataRoot, publicKey, signature, withdrawalCredentials } = await this.dkgService.getDepositData(ceremonyId, withdrawalAddress) - - /** Create validator */ - const validator: Validator = { - depositDataRoot, - publicKey, - operatorIds, - sharesEncrypted: encryptedKeys, - sharesPublicKeys: publicKeys, - signature, - withdrawalCredentials - } - - return validator - } - - /** - * Get operator group from operator IDs - * @param {number[]} operatorIds - Array of operator IDs - * @returns {} Operator group - * @example - * const group = getOperatorGroup([1, 2, 3, 4]) - * console.log(group) - * // => { - * // "1": "http://0.0.0.0:8081", - * // "2": "http://0.0.0.0:8082", - * // "3": "http://0.0.0.0:8083", - * // "4": "http://0.0.0.0:8084" - * // } - */ - getOperatorGroup(operatorIds: number[]): Record { - return operatorIds.reduce((group: Record, id: number) => { - const key = id.toString() as keyof typeof operatorStore - group[key] = operatorStore[key] - return group - }, {}) - } -} \ No newline at end of file diff --git a/services/keys/test/validators.test.ts b/services/keys/test/validators.test.ts deleted file mode 100644 index 4c1fb1adb..000000000 --- a/services/keys/test/validators.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { SSV } from '../src/index' - -test('Create 2 SSV validator with 4 eligible operators', async function () { - const dkgServiceUrl = 'http://0.0.0.0:3000' - const groups = [[1, 2, 3, 4], [1, 2, 3, 4]] - const ssv = new SSV({ dkgServiceUrl }) - const validators = await Promise.all(groups.map(async (group) => { - console.log(`Starting ceremony for operators: ${group.join(',')}`) - const validator = await ssv.createValidator({ operatorIds: group }) - console.log('Completed ceremony...') - return validator - })) - expect(validators.length).toBe(2) -}) \ No newline at end of file diff --git a/services/keys/tsconfig.json b/services/keys/tsconfig.json deleted file mode 100644 index 555ddbeec..000000000 --- a/services/keys/tsconfig.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "compilerOptions": { - "target": "ESNext", - "module": "CommonJS", - "lib": [ - "ESNext", - "DOM" - ], - "declaration": true, - "strict": true, - "noEmit": true, - "noImplicitAny": true, - "strictNullChecks": true, - "noImplicitThis": true, - "alwaysStrict": true, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": false, - "inlineSourceMap": true, - "inlineSources": true, - "experimentalDecorators": true, - "strictPropertyInitialization": false, - "types": ["node", "jest"], - "esModuleInterop": true, - "resolveJsonModule": true - } -} \ No newline at end of file From fffcf5ee440c62e7ef56a151316063d1d74e9072 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Mon, 15 May 2023 12:15:03 -0400 Subject: [PATCH 25/78] Account for lost and regained effective balance --- apps/web/src/composables/users.ts | 2 +- contracts/ethereum/docs/index.md | 30 +-- .../ethereum/functions/API-request-source.js | 133 ++++++++++++ contracts/ethereum/helpers/deploy.ts | 2 +- contracts/ethereum/helpers/upkeep.ts | 12 +- contracts/ethereum/scripts/dev.ts | 22 +- contracts/ethereum/src/CasimirManager.sol | 116 ++++++---- contracts/ethereum/src/CasimirUpkeep.sol | 3 + .../src/interfaces/ICasimirManager.sol | 10 +- contracts/ethereum/test/fixtures/shared.ts | 199 +++++++++++++++--- contracts/ethereum/test/integration.ts | 14 +- services/dkg/README.md | 31 +-- services/dkg/src/index.ts | 25 +-- services/dkg/src/interfaces/CommandOptions.ts | 13 ++ .../src/interfaces/CreateValidatorOptions.ts | 4 +- services/dkg/src/interfaces/ReshareInput.ts | 2 +- .../src/interfaces/ReshareValidatorOptions.ts | 4 +- services/dkg/src/providers/commands.ts | 42 ++-- services/dkg/src/providers/dkg.ts | 24 +-- 19 files changed, 504 insertions(+), 184 deletions(-) create mode 100644 contracts/ethereum/functions/API-request-source.js create mode 100644 services/dkg/src/interfaces/CommandOptions.ts diff --git a/apps/web/src/composables/users.ts b/apps/web/src/composables/users.ts index 3e8e17c28..696b384e5 100644 --- a/apps/web/src/composables/users.ts +++ b/apps/web/src/composables/users.ts @@ -179,7 +179,7 @@ export default function useUsers () { address: manager.address, topics: [ // ethers.utils.id('ManagerDistribution(address,uint256,uint256,uint256)'), // TODO: Make sure to query for past events on page load (Fetch and then subscribe), - ethers.utils.id('PoolInitiated(uint32)'), + ethers.utils.id('PoolDepositInitiated(uint32)'), ] } manager.connect(provider).on(validatorInitFilter, async () => { diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index b662280fb..0eddfd657 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -28,18 +28,18 @@ uint256 latestActiveStake Latest active (consensus) stake after fees -### nextPoolId +### lastPoolId ```solidity -uint32 nextPoolId +uint32 lastPoolId ``` Last pool ID created -### rewardsRatioSum +### stakeRatioSum ```solidity -uint256 rewardsRatioSum +uint256 stakeRatioSum ``` Sum of scaled rewards to stake ratios (intial value required) @@ -410,10 +410,10 @@ Get the pending withdrawal queue | ---- | ---- | ----------- | | [0] | struct ICasimirManager.Withdrawal[] | pendingWithdrawalQueue The pending withdrawal queue | -### getStakedValidatorPublicKeys +### getValidatorPublicKeys ```solidity -function getStakedValidatorPublicKeys() external view returns (bytes[]) +function getValidatorPublicKeys() external view returns (bytes[]) ``` Get staked validator public keys @@ -794,7 +794,7 @@ struct Pool { ```solidity struct User { uint256 stake0; - uint256 rewardsRatioSum0; + uint256 stakeRatioSum0; } ``` @@ -807,22 +807,22 @@ struct Withdrawal { } ``` -### PoolReady +### PoolDepositRequested ```solidity -event PoolReady(uint32 poolId) +event PoolDepositRequested(uint32 poolId) ``` -### PoolInitiated +### PoolDepositInitiated ```solidity -event PoolInitiated(uint32 poolId) +event PoolDepositInitiated(uint32 poolId) ``` -### PoolCompleted +### PoolDeposited ```solidity -event PoolCompleted(uint32 poolId) +event PoolDeposited(uint32 poolId) ``` ### PoolReshareRequested @@ -969,10 +969,10 @@ function getLINKFeePercent() external view returns (uint32) function getSSVFeePercent() external view returns (uint32) ``` -### getStakedValidatorPublicKeys +### getValidatorPublicKeys ```solidity -function getStakedValidatorPublicKeys() external view returns (bytes[]) +function getValidatorPublicKeys() external view returns (bytes[]) ``` ### getExitingValidatorCount diff --git a/contracts/ethereum/functions/API-request-source.js b/contracts/ethereum/functions/API-request-source.js new file mode 100644 index 000000000..dfc9e5435 --- /dev/null +++ b/contracts/ethereum/functions/API-request-source.js @@ -0,0 +1,133 @@ +// Arguments can be provided when a request is initated on-chain and used in the request source code as shown below + +const managerAddress = "0x07e05700cb4e946ba50244e27f01805354cd8ef0" +// We want to get a string (not bytes) array of length of the number of validators +// See PoR Address List +const getValidatorPublicKeys = "0xeab1442e" +const getSweptRewards = "0x9d816764" + +const getPublicKeys = await Functions.makeHttpRequest({ + url: 'http://localhost:8545', + method: 'POST', + data: { + jsonrpc: '2.0', + method: 'eth_call', + params: [{ + to: managerAddress, + data: getValidatorPublicKeys + }, 'latest'], + id: 1 + } +}) + +const { result } = getPublicKeys.data + +// Remove the '0x' prefix +let raw = result.slice(2); + +// Fetch the number of keys from the start of the data +let numKeys = parseInt(raw.slice(0, 64), 16); + +// Initial offset is 32 bytes (or 64 characters), multiplied by 2 for hex +let offset = 64 * 2; + +let publicKeys = []; + +for (let i = 0; i < numKeys; i++) { + // Extract each public key + let publicKey = raw.slice(offset, offset + 128); + publicKeys.push('0x' + publicKey); + + // Move the offset to the next key + offset += 128; +} + +console.log(publicKeys); + +// To make an HTTP request, use the Functions.makeHttpRequest function +// Functions.makeHttpRequest function parameters: +// - url +// - method (optional, defaults to 'GET') +// - headers: headers supplied as an object (optional) +// - params: URL query parameters supplied as an object (optional) +// - data: request body supplied as an object (optional) +// - timeout: maximum request duration in ms (optional, defaults to 10000ms) +// - responseType: expected response type (optional, defaults to 'json') + +const validatorPublicKeys = [ + "0x974dc2826f2d7d413dbe67da0333c1a462ee4194239dfec22cf06989b7aa6f174a3603bb6f55cbf6a57a858e972b4f7d", + "0xb02a546d0a6c73b1fb12cf001b30a645ebe217399200d25af547ffef244dc9c4747a974c785fde00a2f925465dc957ec", + "0x800269a2708150b8560cd8d88d30be15bd661a3d8eddb080717e9cd4deb425b9aa88e720676fc98c716b75f72c136a6f", + "0x800015473bdc3a7f45ef8eb8abc598bc20021e55ad6e6ad1d745aaef9730dd2c28ec08bf42df18451de94dd4a6d24ec5" +] + +const url = secrets.ethereumApiUrl + +console.log(`Making request to ${url}`) + +const response = { + data: new Array(), + error: false +} + +const sync = await Functions.makeHttpRequest({ + url: `${url}/eth/v1/node/syncing` +}) + +if (sync.error) { + response.error = true +} else { + const { head_slot: headSlot } = sync.data.data + console.log(`Head slot: ${headSlot}`) +} + +const registeredValidators = await Functions.makeHttpRequest({ + url: `${url}/eth/v1/beacon/states/finalized/validators?id=${validatorPublicKeys.join(',')}` +}) + +if (registeredValidators.error) { + response.error = true +} else { + for (const { index, balance, status, validator } of registeredValidators.data.data) { + + if (status === 'withdrawal_done') { + + const withdrawalEpoch = validator.withdrawable_epoch + const slotsPerEpoch = 32 + const slot = withdrawalEpoch * slotsPerEpoch + + const exitedValidator = await Functions.makeHttpRequest({ + url: `${url}/eth/v1/beacon/states/${slot}/validators/${index}` + }) + + if (exitedValidator.error) { + response.error = true + break + } else { + const { balance } = exitedValidator.data.data + validator.exited_effective_balance = parseInt(balance.slice(0, 2)) >= 32 ? '32000000000' : balance + } + } + + response.data.push({ ...validator, balance, status }) + } +} + +const validators = ethereumApiResponse.data.map((validator) => { + console.log(validator) + + return { + publicKey: validator.pubkey, + balance: validator.balance, + exitedBalance: validator.exited_balance, + status: validator.status + } +}) + +// The source code MUST return a Buffer or the request will return an error message +// Use one of the following functions to convert to a Buffer representing the response bytes that are returned to the client smart contract: +// - Functions.encodeUint256 +// - Functions.encodeInt256 +// - Functions.encodeString +// Or return a custom Buffer for a custom byte encoding +return Functions.encodeUint256(packedReport) \ No newline at end of file diff --git a/contracts/ethereum/helpers/deploy.ts b/contracts/ethereum/helpers/deploy.ts index c612c2475..d4fb314c6 100644 --- a/contracts/ethereum/helpers/deploy.ts +++ b/contracts/ethereum/helpers/deploy.ts @@ -8,7 +8,7 @@ async function deployContract(name: string, proxy?: boolean, args?: Record { if (block - blocksPerReward === lastRewardBlock) { lastRewardBlock = block - const stakedValidatorPublicKeys = await manager.getStakedValidatorPublicKeys() - if (stakedValidatorPublicKeys?.length) { - console.log(`Rewarding ${stakedValidatorPublicKeys.length} validators ${rewardPerValidator} each`) - const rewardAmount = rewardPerValidator * stakedValidatorPublicKeys.length + const validatorCount = await manager.getValidatorPublicKeys() + if (validatorCount?.length) { + console.log(`Rewarding ${validatorCount.length} validators ${rewardPerValidator} each`) + const rewardAmount = rewardPerValidator * validatorCount.length /** Perform upkeep */ const ranUpkeepBefore = await runUpkeep({ upkeep, keeper }) /** Fulfill functions request */ if (ranUpkeepBefore) { - const nextActiveStakeAmount = round(parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) + rewardAmount) + const nextActiveBalanceAmount = round(parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) + rewardAmount) const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 const nextDepositedCount = 0 const nextExitedCount = 0 - await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveBalanceAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } /** Sweep rewards before next upkeep (balance will increment silently) */ @@ -98,12 +98,12 @@ void async function () { /** Fulfill functions request */ if (ranUpkeepAfter) { - const nextActiveStakeAmount = round(parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) - rewardAmount) + const nextActiveBalanceAmount = round(parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) - rewardAmount) const nextSweptRewardsAmount = rewardAmount const nextSweptExitsAmount = 0 const nextDepositedCount = 0 const nextExitedCount = 0 - await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveBalanceAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } } @@ -120,7 +120,7 @@ void async function () { }, 1000) /** Perform upkeep and fulfill dkg answer after each pool is initiated by the local oracle */ - for await (const event of on(manager as unknown as EventEmitter, 'PoolInitiated')) { + for await (const event of on(manager as unknown as EventEmitter, 'PoolDepositInitiated')) { const [ id, details ] = event console.log(`Pool ${id} initiated at block number ${details.blockNumber}`) @@ -129,12 +129,12 @@ void async function () { /** Fulfill functions request */ if (ranUpkeep) { - const nextActiveStakeAmount = parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) + 32 + const nextActiveBalanceAmount = parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) + 32 const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 const nextDepositedCount = 1 const nextExitedCount = 0 - await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveBalanceAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } } }() \ No newline at end of file diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index 40d21f5e7..305f10f0c 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -109,12 +109,12 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint32[] private pendingPoolIds; /** IDs of pools staked */ uint32[] private stakedPoolIds; - /** Public keys of staked validators */ - bytes[] private stakedValidatorPublicKeys; + /** Public keys of registered validators */ + bytes[] private validatorPublicKeys; /** Exiting validator count */ uint256 private exitingValidatorCount; /** Sum of scaled rewards to stake ratios (intial value required) */ - uint256 rewardsRatioSum = 1000 ether; + uint256 stakeRatioSum = 1000 ether; /** Requested withdrawals */ Withdrawal[] private requestedWithdrawalQueue; /** Pending withdrawals */ @@ -123,8 +123,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint256 private requestedWithdrawals; /** Total pending withdrawals */ uint256 private pendingWithdrawals; - /** Total pending fees reserved */ - uint256 pendingFeesReserved; /** Total fees reserved */ uint256 private reservedFees; /** ETH fee percentage */ @@ -189,7 +187,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { if (users[msg.sender].stake0 > 0) { users[msg.sender].stake0 = getUserStake(msg.sender); } - users[msg.sender].rewardsRatioSum0 = rewardsRatioSum; + users[msg.sender].stakeRatioSum0 = stakeRatioSum; users[msg.sender].stake0 += depositAfterFees; distributeStake(depositAfterFees); @@ -227,34 +225,46 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { "Only upkeep can rebalance stake" ); - uint256 depositedStake = depositCount * poolCapacity; - int256 current = int256(activeBalance + sweptRewards + sweptExits); - int256 previous = int256(latestActiveBalance + depositedStake); - int256 change = current - previous; - - latestActiveBalance = activeBalance; + uint256 expectedDeposits = depositCount * poolCapacity; + uint256 expectedExits = exitCount * poolCapacity; + int256 expectedEffective = int256(stakedPoolIds.length * poolCapacity + expectedDeposits + expectedExits); + int256 previousExpectedEffective = int256(stakedPoolIds.length * poolCapacity); + int256 previousActiveRewards = int256(latestActiveBalance) - previousExpectedEffective; + int256 actualActiveBalance = int256(activeBalance + sweptRewards + sweptExits); + int256 actualActiveRewards = actualActiveBalance - expectedEffective; + int256 change = actualActiveRewards - previousActiveRewards; if (change > 0) { - uint256 rewards = SafeCast.toUint256(change); - uint256 rewardsAfterFees = subtractFees(rewards); - rewardsRatioSum += Math.mulDiv(rewardsRatioSum, rewardsAfterFees, getStake()); - latestActiveStake += rewardsAfterFees; - - emit StakeRebalanced(rewardsAfterFees); + + uint256 gain = SafeCast.toUint256(change); + if (actualActiveRewards > 0) { + uint256 gainAfterFees = subtractFees(gain); + stakeRatioSum += Math.mulDiv(stakeRatioSum, gainAfterFees, getStake()); + latestActiveStake += gainAfterFees; + + emit StakeRebalanced(gainAfterFees); + } else { + stakeRatioSum += Math.mulDiv(stakeRatioSum, gain, getStake()); + latestActiveStake += gain; + + emit StakeRebalanced(gain); + } + } else if (change < 0) { - uint256 penalty = SafeCast.toUint256(change); - rewardsRatioSum -= Math.mulDiv(rewardsRatioSum, penalty, getStake()); - latestActiveStake -= penalty; + uint256 loss = SafeCast.toUint256(-change); + stakeRatioSum -= Math.mulDiv(stakeRatioSum, loss, getStake()); + latestActiveStake -= loss; - emit StakeRebalanced(penalty); + emit StakeRebalanced(loss); } - latestActiveStake += depositedStake; - latestActiveStake -= subtractFees(sweptRewards); + latestActiveBalance = activeBalance; + latestActiveStake += expectedDeposits; latestActiveStake -= sweptExits; /** Deposit swept rewards */ if (sweptRewards > 0) { + latestActiveStake -= subtractFees(sweptRewards); depositRewards(sweptRewards); } @@ -289,7 +299,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { pool.deposits = poolCapacity; readyPoolIds.push(poolId); - emit PoolReady(poolId); + emit PoolDepositRequested(poolId); } } } @@ -327,7 +337,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { count--; Withdrawal memory withdrawal = requestedWithdrawalQueue[0]; - users[withdrawal.user].rewardsRatioSum0 = rewardsRatioSum; + users[withdrawal.user].stakeRatioSum0 = stakeRatioSum; users[withdrawal.user].stake0 -= withdrawal.amount; requestedWithdrawalQueue.remove(0); requestedWithdrawals -= withdrawal.amount; @@ -420,6 +430,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { pool.withdrawalCredentials = withdrawalCredentials; readyPoolIds.remove(0); pendingPoolIds.push(poolId); + validatorPublicKeys.push(publicKey); beaconDeposit.deposit{value: pool.deposits}( pool.publicKey, @@ -437,7 +448,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { // ssvFees // ); - emit PoolInitiated(poolId); + emit PoolDepositInitiated(poolId); } /** @@ -451,12 +462,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { count--; uint32 poolId = pendingPoolIds[0]; - Pool memory pool = pools[poolId]; pendingPoolIds.remove(0); stakedPoolIds.push(poolId); - stakedValidatorPublicKeys.push(pool.publicKey); - emit PoolCompleted(poolId); + emit PoolDeposited(poolId); } } @@ -508,7 +517,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { require(pool.exiting, "Pool is not exiting"); bytes memory validatorPublicKey = pool.publicKey; - bytes memory stakedValidatorPublicKey = stakedValidatorPublicKeys[ + bytes memory stakedValidatorPublicKey = validatorPublicKeys[ validatorIndex ]; @@ -520,7 +529,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { stakedPoolIds.remove(poolIndex); delete pools[poolId]; - stakedValidatorPublicKeys.remove(validatorIndex); + validatorPublicKeys.remove(validatorIndex); exitingValidatorCount--; ssvNetwork.removeValidator(validatorPublicKey); @@ -699,7 +708,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @return stake The manager stake */ function getStake() public view returns (uint256 stake) { - stake = getBufferedStake() + getActiveStake(); + stake = getBufferedStake() + getPendingStake() + getActiveStake(); } /** @@ -707,10 +716,15 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @return stake The manager buffered (execution) stake */ function getBufferedStake() public view returns (uint256 stake) { - stake = - (readyPoolIds.length + pendingPoolIds.length) * - poolCapacity + - openDeposits; + stake = openDeposits + readyPoolIds.length * poolCapacity; + } + + /** + * @notice Get the manager pending (consensus) stake + * @return stake The manager pending (consensus) stake + */ + function getPendingStake() public view returns (uint256 stake) { + stake = pendingPoolIds.length * poolCapacity; } /** @@ -732,11 +746,27 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { require(users[userAddress].stake0 > 0, "User does not have a stake"); userStake = Math.mulDiv( users[userAddress].stake0, - rewardsRatioSum, - users[userAddress].rewardsRatioSum0 + stakeRatioSum, + users[userAddress].stakeRatioSum0 ); } + /** + * @notice Get the manager reserved fees + * @return reservedFees The manager reserved fees + */ + function getReservedFees() public view returns (uint256) { + return reservedFees; + } + + /** + * @notice Get the manager swept balance + * @return balance The manager swept balance + */ + function getSweptBalance() public view returns (uint256 balance) { + balance = address(this).balance - getBufferedStake() - getReservedFees(); + } + /** * @notice Get the total fee percentage * @return feePercent The total fee percentage @@ -786,15 +816,15 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Get staked validator public keys - * @return A list of active validator public keys + * @notice Get validator public keys + * @return A list of pending and active validator public keys */ - function getStakedValidatorPublicKeys() + function getValidatorPublicKeys() external view returns (bytes[] memory) { - return stakedValidatorPublicKeys; + return validatorPublicKeys; } /** diff --git a/contracts/ethereum/src/CasimirUpkeep.sol b/contracts/ethereum/src/CasimirUpkeep.sol index 466a305b2..ba1cd2ebf 100644 --- a/contracts/ethereum/src/CasimirUpkeep.sol +++ b/contracts/ethereum/src/CasimirUpkeep.sol @@ -1,6 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.7; +// 1. Handle exits, withdrawals, and clusters +// 2. Pick between Functions, EA, and custom oracle + import "./interfaces/ICasimirUpkeep.sol"; import "./interfaces/ICasimirManager.sol"; import {Functions, FunctionsClient} from "@chainlink/contracts/src/v0.8/dev/functions/FunctionsClient.sol"; diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index 09cab26e9..1f2aff2b4 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -28,7 +28,7 @@ interface ICasimirManager { /** User staking account */ struct User { uint256 stake0; - uint256 rewardsRatioSum0; + uint256 stakeRatioSum0; } /** Withdrawal */ struct Withdrawal { @@ -40,9 +40,9 @@ interface ICasimirManager { /* Events */ /**********/ - event PoolReady(uint32 poolId); - event PoolInitiated(uint32 poolId); - event PoolCompleted(uint32 poolId); + event PoolDepositRequested(uint32 poolId); + event PoolDepositInitiated(uint32 poolId); + event PoolDeposited(uint32 poolId); event PoolReshareRequested(uint32 poolId); event PoolReshared(uint32 poolId); event PoolExitRequested(uint32 poolId); @@ -104,7 +104,7 @@ interface ICasimirManager { function getSSVFeePercent() external view returns (uint32); - function getStakedValidatorPublicKeys() + function getValidatorPublicKeys() external view returns (bytes[] memory); diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index ebe089ec2..f0a72ddbe 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -7,6 +7,12 @@ import { initiatePoolDeposit } from '@casimir/ethereum/helpers/dkg' import { round } from '@casimir/ethereum/helpers/math' import { ContractConfig, DeploymentConfig } from '@casimir/types' +const getSweptBalanceFunctionSignature = ethers.utils.id('getSweptBalance()').slice(0, 10) +console.log(getSweptBalanceFunctionSignature) + +const getValidatorPublicKeysFunctionSignature = ethers.utils.id('getValidatorPublicKeys()').slice(0, 10) +console.log(getValidatorPublicKeysFunctionSignature) + /** Fixture to deploy SSV manager contract */ export async function deploymentFixture() { const [owner, , , , , keeper, dkg] = await ethers.getSigners() @@ -91,7 +97,7 @@ export async function secondUserDepositFixture() { const [, , secondUser] = await ethers.getSigners() const stakeAmount = 24 - const nextActiveStakeAmount = 32 + const nextActiveBalanceAmount = 32 const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 const nextDepositedCount = 1 @@ -109,7 +115,15 @@ export async function secondUserDepositFixture() { /** Fulfill functions request */ if (ranUpkeep) { - await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ + upkeep, + keeper, + nextActiveBalanceAmount, + nextSweptRewardsAmount, + nextSweptExitsAmount, + nextDepositedCount, + nextExitedCount + }) } return { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } @@ -120,7 +134,7 @@ export async function rewardsPostSecondUserDepositFixture() { const { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } = await loadFixture(secondUserDepositFixture) const rewardsAmount = 0.105 - const nextActiveStakeAmount = 32 + rewardsAmount + const nextActiveBalanceAmount = 32 + rewardsAmount const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 const nextDepositedCount = 0 @@ -131,7 +145,15 @@ export async function rewardsPostSecondUserDepositFixture() { /** Fulfill functions request */ if (ranUpkeep) { - await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ + upkeep, + keeper, + nextActiveBalanceAmount, + nextSweptRewardsAmount, + nextSweptExitsAmount, + nextDepositedCount, + nextExitedCount + }) } return { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } @@ -145,7 +167,7 @@ export async function sweepPostSecondUserDepositFixture() { const sweep = await keeper.sendTransaction({ to: manager.address, value: ethers.utils.parseEther(sweptRewards.toString()) }) await sweep.wait() - const nextActiveStakeAmount = 32 + const nextActiveBalanceAmount = 32 const nextSweptRewardsAmount = sweptRewards const nextSweptExitsAmount = 0 const nextDepositedCount = 0 @@ -156,7 +178,15 @@ export async function sweepPostSecondUserDepositFixture() { /** Fulfill functions request */ if (ranUpkeep) { - await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ + upkeep, + keeper, + nextActiveBalanceAmount, + nextSweptRewardsAmount, + nextSweptExitsAmount, + nextDepositedCount, + nextExitedCount + }) } return { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } @@ -168,7 +198,7 @@ export async function thirdUserDepositFixture() { const [, , , thirdUser] = await ethers.getSigners() const stakeAmount = 24 - const nextActiveStakeAmount = 64 + const nextActiveBalanceAmount = 64 const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 const nextDepositedCount = 1 @@ -186,7 +216,15 @@ export async function thirdUserDepositFixture() { /** Fulfill functions request */ if (ranUpkeep) { - await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ + upkeep, + keeper, + nextActiveBalanceAmount, + nextSweptRewardsAmount, + nextSweptExitsAmount, + nextDepositedCount, + nextExitedCount + }) } return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } @@ -197,7 +235,7 @@ export async function rewardsPostThirdUserDepositFixture() { const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } = await loadFixture(thirdUserDepositFixture) const rewardsAmount = 0.21 - const nextActiveStakeAmount = 64 + rewardsAmount + const nextActiveBalanceAmount = 64 + rewardsAmount const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 const nextDepositedCount = 0 @@ -208,7 +246,15 @@ export async function rewardsPostThirdUserDepositFixture() { /** Fulfill functions request */ if (ranUpkeep) { - await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ + upkeep, + keeper, + nextActiveBalanceAmount, + nextSweptRewardsAmount, + nextSweptExitsAmount, + nextDepositedCount, + nextExitedCount + }) } return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } @@ -222,7 +268,7 @@ export async function sweepPostThirdUserDepositFixture() { const sweep = await keeper.sendTransaction({ to: manager.address, value: ethers.utils.parseEther(sweptRewards.toString()) }) await sweep.wait() - const nextActiveStakeAmount = 64 + const nextActiveBalanceAmount = 64 const nextSweptRewardsAmount = sweptRewards const nextSweptExitsAmount = 0 const nextDepositedCount = 0 @@ -233,7 +279,15 @@ export async function sweepPostThirdUserDepositFixture() { /** Fulfill functions request */ if (ranUpkeep) { - await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ + upkeep, + keeper, + nextActiveBalanceAmount, + nextSweptRewardsAmount, + nextSweptExitsAmount, + nextDepositedCount, + nextExitedCount + }) } return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } @@ -258,7 +312,7 @@ export async function fourthUserDepositFixture() { const [, , , , fourthUser] = await ethers.getSigners() const stakeAmount = 72 - const nextActiveStakeAmount = 128 + const nextActiveBalanceAmount = 128 const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 const nextDepositedCount = 2 @@ -278,40 +332,111 @@ export async function fourthUserDepositFixture() { /** Fulfill functions request */ if (ranUpkeep) { - await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ + upkeep, + keeper, + nextActiveBalanceAmount, + nextSweptRewardsAmount, + nextSweptExitsAmount, + nextDepositedCount, + nextExitedCount + }) } return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } } -/** Fixture to full withdraw ~24.07 */ -export async function thirdUserFullWithdrawalFixture() { +/** Fixture to simulate a validator stake penalty that decreases the active balance */ +export async function activeBalanceLossFixture() { const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } = await loadFixture(fourthUserDepositFixture) - const thirdStake = await manager.getUserStake(thirdUser.address) - const withdraw = await manager.connect(thirdUser).requestWithdrawal(thirdStake) - await withdraw.wait() + const nextActiveBalanceAmount = 126 + const nextSweptRewardsAmount = 0 + const nextSweptExitsAmount = 0 + const nextDepositedCount = 0 + const nextExitedCount = 0 /** Run upkeep */ - await runUpkeep({ upkeep, keeper }) + const ranUpkeep = await runUpkeep({ upkeep, keeper }) + + /** Fulfill functions request */ + if (ranUpkeep) { + await fulfillFunctionsRequest({ + upkeep, + keeper, + nextActiveBalanceAmount, + nextSweptRewardsAmount, + nextSweptExitsAmount, + nextDepositedCount, + nextExitedCount + }) + } + + return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } +} + +/** Fixture to simulate a validator reward that brings the active balance back to expected */ +export async function activeBalanceRecoveryFixture() { + const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } = await loadFixture(activeBalanceLossFixture) + + let nextActiveBalanceAmount = 126 + const nextSweptRewardsAmount = 0 + const nextSweptExitsAmount = 0 + const nextDepositedCount = 0 + const nextExitedCount = 0 + + /** Simulate two distinct reported gains */ + for (let i = 0; i < 2; i++) { + nextActiveBalanceAmount += 1 + + /** Run upkeep */ + const ranUpkeep = await runUpkeep({ upkeep, keeper }) + + /** Fulfill functions request */ + if (ranUpkeep) { + await fulfillFunctionsRequest({ + upkeep, + keeper, + nextActiveBalanceAmount, + nextSweptRewardsAmount, + nextSweptExitsAmount, + nextDepositedCount, + nextExitedCount + }) + } + } return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } } +// /** Fixture to full withdraw ~24.07 */ +// export async function thirdUserFullWithdrawalFixture() { +// const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } = await loadFixture(fourthUserDepositFixture) + +// const thirdStake = await manager.getUserStake(thirdUser.address) +// const withdraw = await manager.connect(thirdUser).requestWithdrawal(thirdStake) +// await withdraw.wait() + +// /** Run upkeep */ +// await runUpkeep({ upkeep, keeper }) + +// return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } +// } + /** Fixture to simulate stakes and rewards */ export async function simulationFixture() { - const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } = await loadFixture(thirdUserFullWithdrawalFixture) + const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } = await loadFixture(activeBalanceRecoveryFixture) const rewardsPerValidator = 0.105 - let nextActiveStakeAmount = 128 + let nextActiveBalanceAmount = 128 let totalRewards = 0 for (let i = 0; i < 5; i++) { - const stakedValidatorCount = (await manager.getStakedValidatorPublicKeys())?.length - if (stakedValidatorCount) { - const rewardsAmount = rewardsPerValidator * stakedValidatorCount + const validatorCount = (await manager.getValidatorPublicKeys())?.length + if (validatorCount) { + const rewardsAmount = rewardsPerValidator * validatorCount totalRewards += round(rewardsAmount, 10) - nextActiveStakeAmount = round(nextActiveStakeAmount + rewardsAmount, 10) + nextActiveBalanceAmount = round(nextActiveBalanceAmount + rewardsAmount, 10) const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 const nextDepositedCount = 0 @@ -322,7 +447,15 @@ export async function simulationFixture() { /** Fulfill functions request */ if (ranUpkeep) { - await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ + upkeep, + keeper, + nextActiveBalanceAmount, + nextSweptRewardsAmount, + nextSweptExitsAmount, + nextDepositedCount, + nextExitedCount + }) } } } @@ -331,7 +464,7 @@ export async function simulationFixture() { const sweep = await keeper.sendTransaction({ to: manager.address, value: ethers.utils.parseEther(sweptRewards.toString()) }) await sweep.wait() - nextActiveStakeAmount = 128 + nextActiveBalanceAmount = 128 const nextSweptRewardsAmount = sweptRewards const nextSweptExitsAmount = 0 const nextDepositedCount = 0 @@ -342,7 +475,15 @@ export async function simulationFixture() { /** Fulfill functions request */ if (ranUpkeep) { - await fulfillFunctionsRequest({ upkeep, keeper, nextActiveStakeAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) + await fulfillFunctionsRequest({ + upkeep, + keeper, + nextActiveBalanceAmount, + nextSweptRewardsAmount, + nextSweptExitsAmount, + nextDepositedCount, + nextExitedCount + }) } return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } diff --git a/contracts/ethereum/test/integration.ts b/contracts/ethereum/test/integration.ts index b046b75d1..86832f9bc 100644 --- a/contracts/ethereum/test/integration.ts +++ b/contracts/ethereum/test/integration.ts @@ -1,7 +1,7 @@ import { ethers } from 'hardhat' import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' import { expect } from 'chai' -import { firstUserDepositFixture, rewardsPostSecondUserDepositFixture, secondUserDepositFixture, thirdUserDepositFixture, rewardsPostThirdUserDepositFixture, simulationFixture, firstUserPartialWithdrawalFixture, fourthUserDepositFixture, sweepPostSecondUserDepositFixture, sweepPostThirdUserDepositFixture } from './fixtures/shared' +import { firstUserDepositFixture, rewardsPostSecondUserDepositFixture, secondUserDepositFixture, thirdUserDepositFixture, rewardsPostThirdUserDepositFixture, simulationFixture, firstUserPartialWithdrawalFixture, fourthUserDepositFixture, sweepPostSecondUserDepositFixture, sweepPostThirdUserDepositFixture, activeBalanceLossFixture, activeBalanceRecoveryFixture } from './fixtures/shared' describe('Casimir manager', async function () { @@ -137,6 +137,18 @@ describe('Casimir manager', async function () { expect(fourthPool.operatorIds.length).equal(4) }) + it('A loss is reported and brings the active stake below expected', async function () { + const { manager } = await loadFixture(activeBalanceLossFixture) + const activeStake = await manager.getActiveStake() + expect(ethers.utils.formatEther(activeStake)).equal('126.0') + }) + + it('Gains are reported and bring the active stake back to expected', async function () { + const { manager } = await loadFixture(activeBalanceRecoveryFixture) + const activeStake = await manager.getActiveStake() + expect(ethers.utils.formatEther(activeStake)).equal('128.0') + }) + it('Check more rewards and dust', async function () { const { manager, firstUser, secondUser, thirdUser, fourthUser } = await loadFixture(simulationFixture) const stake = await manager.getStake() diff --git a/services/dkg/README.md b/services/dkg/README.md index 44432f838..77369704e 100644 --- a/services/dkg/README.md +++ b/services/dkg/README.md @@ -1,37 +1,18 @@ # @casimir/dkg -DKG oracle service +Casimir DKG oracle service ## About -The DKG oracle service is run by DAO members to trigger and prove distributed key operations. It is a [NodeJS](https://nodejs.org) application that runs either a leader oracle capable of running a [RockX distributed key generation (DKG) CLI and messenger server](https://github.com/rockx/rockx-dkg-cli), or a follower oracle that monitors leader operations, publishes proofs, and helps to elect a new leader if necessary. +The distributed key generation (DKG) oracle is initially intended to be a single-instance service used to initiate, publish, and prove fair distributed key operations. It contains a [NodeJS](https://nodejs.org) application that listens for `PoolDepositRequested`, `PoolReshareRequested`, and `PoolExitRequested` events, which then internally uses the [RockX DKG CLI and messenger server](https://github.com/rockx/rockx-dkg-cli) to initiate and retrieve operator group DKG results. The `PoolDepositRequested` event starts a new DKG keygen and retrieves the results to submit a new validator via `initiatePoolDeposit`. The `PoolReshareRequested` event starts a new DKG reshare and retrieves the results to update an existing validator via `resharePool`. The `PoolExitRequested` event starts a new DKG exit and retrieves the results to submit a signed exit message directly to the Beacon chain. -The nature and location of DKG proofs is a WIP depending on [DKG verification](https://docs.obol.tech/docs/next/charon/dkg#dkg-verification) research. +The DKG operations will have verifiable aspects that can eventually be used in proofs. The "what" and "where" of these proofs is a WIP depending on continued [DKG verification](https://docs.obol.tech/docs/next/charon/dkg#dkg-verification) research. -Critical portions of the oracle service code can be deployed to a secure enclave (like an AMD TrustZone on an [AMD EPYC 7002](https://www.amd.com/en/products/epyc-7002-series-processors)) to improve the integrity and security of computation and memory. Google Cloud uses this technology to provide its flagship confidential compute product, and Chainlink uses it to build more tamper-resistant oracle nodes. - -### Malicious Operator Defense - -If a consensus threshold of node operators do not respond to a reshare or exit signature request, the DAO has a few options: - -- Store encrypted backups of presigned exit messages, and have the leader decrypt and submit them as needed (with DAO approval) -- Have the leader call a contract-native validator exit (with DAO approval) - -> 🚩 The latter is the most secure option, but requires a WIP EIP to be implemented - -### Malicious Leader Defense - -A theshold signature of the DAO oracles can elect a new leader as needed, by emitting a contract event monitored by node operators, so the leader can be swiftly replaced if it is at risk of compromise, or simply fails. +> 🚩 The deployment strategy, including the API security, of this service is a WIP, and will be done in a way that allows for easy upgrades and/or replacement with a contract-native DKG trigger mechanism. Casimir is researching the best approach to trustless operations in collaboration with Chainlink, SSV, and RockX, and the @casimir/dkg service will prioritize a combination of security and decentralization as much as possible. ### Future -In the future, some aspects of this DAO oracle network may be improved, or become obsolete, as the underlying decentralized protocols evolve: +In the future, some aspects of this oracle service may be improved, or become obsolete, as the underlying decentralized protocols evolve: -- SSV contract-native, zero-coordination key operation triggers (with SSV DKG support) may augment or replace the DKG messenger server and the need for a leader oracle service +- SSV contract-native, zero-coordination key operation triggers (with SSV DKG support) may augment or replace the DKG messenger server and the need for a single-instance oracle service - Contract-native validator exit triggers may remove the need for presigned validator exit messages - -Eventually, the DAO responsibility may be reduceable to an entity providing voting-mechanisms for owners (stakers, operators, and DAO members) to vote on contract changes alongside underlying protocol updates. - -## Development - -Todo. diff --git a/services/dkg/src/index.ts b/services/dkg/src/index.ts index 4ec6a1274..1c262dbfb 100644 --- a/services/dkg/src/index.ts +++ b/services/dkg/src/index.ts @@ -1,29 +1,26 @@ import { config } from './providers/config' import { getEventEmitter } from './providers/events' -import { initiatePoolDepositCommand, initiatePoolExitCommand } from './providers/commands' +import { initiatePoolDepositCommand, initiatePoolExitCommand, initiatePoolReshareCommand } from './providers/commands' const { manager, signer, messengerUrl } = config() -const events = [ - 'PoolReady', - 'PoolExitRequested' -] +const commands = { + PoolDepositRequested: initiatePoolDepositCommand, + PoolReshareRequested: initiatePoolReshareCommand, + PoolExitRequested: initiatePoolExitCommand +} -const eventEmitter = getEventEmitter({ manager, events }) +const eventEmitter = getEventEmitter({ manager, events: Object.keys(commands) }) ;(async function () { for await (const event of eventEmitter) { const [ id, details ] = event - if (details.event === 'PoolReady') { - await initiatePoolDepositCommand({ manager, signer, messengerUrl }) - console.log(`Pool ${id} deposit initiated at block number ${details.blockNumber}`) - } + const command = commands[details.event as keyof typeof commands] + if (!command) throw new Error(`No command found for event ${details.event}`) - if (details.event === 'PoolExitRequested') { - await initiatePoolExitCommand({ manager, messengerUrl, id }) - console.log(`Pool ${id} exit initiated at block number ${details.blockNumber}`) - } + console.log(`Executing ${details.event} command for pool ${id}`) + await command({ manager, signer, messengerUrl, id }) } })() diff --git a/services/dkg/src/interfaces/CommandOptions.ts b/services/dkg/src/interfaces/CommandOptions.ts new file mode 100644 index 000000000..bc9a54a39 --- /dev/null +++ b/services/dkg/src/interfaces/CommandOptions.ts @@ -0,0 +1,13 @@ +import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' +import { ethers } from 'ethers' + +export interface CommandOptions { + /** The manager contract */ + manager: ethers.Contract & CasimirManager + /** The command signer */ + signer: ethers.Signer + /** The distributed key generation messenger service URL */ + messengerUrl: string + /** The pool ID */ + id: number +} \ No newline at end of file diff --git a/services/dkg/src/interfaces/CreateValidatorOptions.ts b/services/dkg/src/interfaces/CreateValidatorOptions.ts index 7db505962..924250dcd 100644 --- a/services/dkg/src/interfaces/CreateValidatorOptions.ts +++ b/services/dkg/src/interfaces/CreateValidatorOptions.ts @@ -1,6 +1,6 @@ export interface CreateValidatorOptions { /** Operator registry IDs */ - operatorIds?: number[] + operatorIds: number[] /** Validator withdrawal address */ - withdrawalAddress?: string + withdrawalAddress: string } \ No newline at end of file diff --git a/services/dkg/src/interfaces/ReshareInput.ts b/services/dkg/src/interfaces/ReshareInput.ts index c3774add5..b65dedb65 100644 --- a/services/dkg/src/interfaces/ReshareInput.ts +++ b/services/dkg/src/interfaces/ReshareInput.ts @@ -2,7 +2,7 @@ export interface ReshareInput { /** Operator map with DKG endpoints */ operators: Record; /** Validator public key */ - validatorPublicKey: string; + publicKey: string; /** Old operator registry IDs */ oldOperators: Record; } \ No newline at end of file diff --git a/services/dkg/src/interfaces/ReshareValidatorOptions.ts b/services/dkg/src/interfaces/ReshareValidatorOptions.ts index 6b513459b..7bbdfa81c 100644 --- a/services/dkg/src/interfaces/ReshareValidatorOptions.ts +++ b/services/dkg/src/interfaces/ReshareValidatorOptions.ts @@ -2,9 +2,9 @@ export interface ReshareValidatorOptions { /** Operator registry IDs */ operatorIds: number[]; /** Validator public key */ - validatorPublicKey: string; + publicKey: string; /** Old operator registry IDs */ oldOperatorIds: number[]; /** Validator withdrawal address */ - withdrawalAddress?: string + withdrawalAddress: string } \ No newline at end of file diff --git a/services/dkg/src/providers/commands.ts b/services/dkg/src/providers/commands.ts index fb94bbb27..c705b6b6a 100644 --- a/services/dkg/src/providers/commands.ts +++ b/services/dkg/src/providers/commands.ts @@ -1,19 +1,12 @@ import { ethers } from 'ethers' -import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' import { DKG } from './dkg' +import { CommandOptions } from '../interfaces/CommandOptions' -export async function initiatePoolDepositCommand({ - manager, - signer, - messengerUrl -}: { - manager: CasimirManager, - signer: ethers.Signer, - messengerUrl: string -}) { - const group = [1, 2, 3, 4] +export async function initiatePoolDepositCommand(options: CommandOptions) { + const { manager, signer, messengerUrl } = options + const newOperatorGroup = [1, 2, 3, 4] // Todo get new group here const ssv = new DKG({ messengerUrl }) - const validator = await ssv.createValidator({ operatorIds: group }) + const validator = await ssv.createValidator({ operatorIds: newOperatorGroup, withdrawalAddress: manager.address }) const { depositDataRoot, publicKey, @@ -36,7 +29,30 @@ export async function initiatePoolDepositCommand({ await initiatePoolDeposit.wait() } -export async function initiatePoolExitCommand({ manager, messengerUrl, id }: { manager: CasimirManager, messengerUrl: string, id: number }) { +export async function initiatePoolReshareCommand(options: CommandOptions) { + const { manager, signer, messengerUrl, id } = options + + // Todo reshare event will include the operator to boot + + // Get pool to reshare + const pool = await manager.getPool(id) + const { publicKey, operatorIds } = pool + + // Todo old operators and new operators only different by 1 operator + const newOperatorGroup = [1, 2, 3, 4] + + // Get operators to sign reshare + const ssv = new DKG({ messengerUrl }) + const validator = await ssv.reshareValidator({ publicKey, operatorIds: newOperatorGroup, oldOperatorIds: operatorIds, withdrawalAddress: manager.address }) + + + // Submit new shares to pool + +} + +export async function initiatePoolExitCommand(options: CommandOptions) { + const { manager, signer, messengerUrl, id } = options + // Get pool to exit const pool = await manager.getPool(id) const { publicKey, operatorIds } = pool diff --git a/services/dkg/src/providers/dkg.ts b/services/dkg/src/providers/dkg.ts index 1b6cd014e..b819671be 100644 --- a/services/dkg/src/providers/dkg.ts +++ b/services/dkg/src/providers/dkg.ts @@ -30,9 +30,7 @@ export class DKG { * }) */ async createValidator(options: CreateValidatorOptions): Promise { - - const operatorIds = options?.operatorIds || process.env.OPERATOR_IDS?.split(',').map(id => parseInt(id)) || [1, 2, 3, 4, 5, 6, 7, 8] - const withdrawalAddress = options?.withdrawalAddress || process.env.WITHDRAWAL_ADDRESS || '0x07e05700cb4e946ba50244e27f01805354cd8ef0' + const { operatorIds, withdrawalAddress } = options const operators = this.getOperatorGroup(operatorIds) /** Start a key generation ceremony with the given operators */ @@ -69,7 +67,7 @@ export class DKG { * @example * const validator = await reshareValidator({ * operatorIds: [1, 2, 3, 4], - * validatorPublicKey: '0x8eb0f05adc697cdcbdf8848f7f1e8c2277f4fc7b0efc97ceb87ce75286e4328db7259fc0c1b39ced0c594855a30d415c', + * publicKey: '0x8eb0f05adc697cdcbdf8848f7f1e8c2277f4fc7b0efc97ceb87ce75286e4328db7259fc0c1b39ced0c594855a30d415c', * oldOperators: { * "2": "http://0.0.0.0:8082", * "3": "http://0.0.0.0:8083", @@ -78,23 +76,19 @@ export class DKG { * }) */ async reshareValidator(options: ReshareValidatorOptions): Promise { - - const operatorIds = options?.operatorIds || process.env.OPERATOR_IDS?.split(',').map(id => parseInt(id)) || [2, 3, 4, 5] - const validatorPublicKey = options?.validatorPublicKey || process.env.VALIDATOR_PUBLIC_KEY || '0x8eb0f05adc697cdcbdf8848f7f1e8c2277f4fc7b0efc97ceb87ce75286e4328db7259fc0c1b39ced0c594855a30d415c' - const oldOperatorIds = options?.oldOperatorIds || process.env.OLD_OPERATOR_IDS?.split(',').map(id => parseInt(id)) || [2, 3, 4] + const { operatorIds, publicKey, oldOperatorIds, withdrawalAddress } = options const operators = this.getOperatorGroup(operatorIds) const oldOperators = this.getOperatorGroup(oldOperatorIds) - const withdrawalAddress = options?.withdrawalAddress || process.env.WITHDRAWAL_ADDRESS || '0x07e05700cb4e946ba50244e27f01805354cd8ef0' /** Start a key generation ceremony with the given operators */ - const ceremonyId = await this.startReshare({ operators, validatorPublicKey, oldOperators }) + const ceremonyId = await this.startReshare({ operators, publicKey, oldOperators }) console.log(`Started ceremony with ID ${ceremonyId}`) /** Get operator key shares */ const { encryptedKeys, publicKeys } = await this.getShares(ceremonyId) /** Get validator deposit data */ - const { depositDataRoot, publicKey, signature, withdrawalCredentials } = await this.getDepositData(ceremonyId, withdrawalAddress) + const { depositDataRoot, signature, withdrawalCredentials } = await this.getDepositData(ceremonyId, withdrawalAddress) /** Create validator */ const validator: Validator = { @@ -173,7 +167,7 @@ export class DKG { * "4": "http://host.docker.internal:8084", * "5": "http://host.docker.internal:8085" * }, - * validatorPublicKey: '0x8eb0f05adc697cdcbdf8848f7f1e8c2277f4fc7b0efc97ceb87ce75286e4328db7259fc0c1b39ced0c594855a30d415c', + * publicKey: '0x8eb0f05adc697cdcbdf8848f7f1e8c2277f4fc7b0efc97ceb87ce75286e4328db7259fc0c1b39ced0c594855a30d415c', * oldOperators: { * "2": "http://host.docker.internal:8082", * "3": "http://host.docker.internal:8083", @@ -184,12 +178,12 @@ export class DKG { * // => "b7e8b0e0-5c1a-4b1e-9b1e-8c1c1c1c1c1c" */ async startReshare(input: ReshareInput): Promise { - const { operators, validatorPublicKey, oldOperators } = input + const { operators, publicKey, oldOperators } = input const operatorFlags = Object.entries(operators).map(([id, url]) => `--operator ${id}=${url}`).join(' ') const thresholdFlag = `--threshold ${Object.keys(operators).length - 1}` - const validatorPublicKeyFlag = `--validator-public-key ${validatorPublicKey}` + const publicKeyFlag = `--validator-public-key ${publicKey}` const oldOperatorFlags = Object.entries(oldOperators).map(([id, url]) => `--old-operator ${id}=${url}`).join(' ') - const command = `rockx-dkg-cli reshare ${operatorFlags} ${thresholdFlag} ${validatorPublicKeyFlag} ${oldOperatorFlags}` + const command = `rockx-dkg-cli reshare ${operatorFlags} ${thresholdFlag} ${publicKeyFlag} ${oldOperatorFlags}` const startReshare = execSync(`${command}`).toString().trim() as string const ceremonyId = startReshare.split(' ').pop() as string return ceremonyId From 9a3115b0e5facee9c51380453af7c3856c7e442a Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Tue, 16 May 2023 13:58:02 -0400 Subject: [PATCH 26/78] Fix scripts and circular dependencies --- apps/landing/vite.config.ts | 2 +- apps/web/src/composables/auth.ts | 3 +- apps/web/src/composables/ethers.ts | 3 +- apps/web/src/composables/ledger.ts | 3 +- apps/web/src/composables/solana.ts | 3 +- apps/web/src/composables/ssv.ts | 14 +- apps/web/src/composables/trezor.ts | 2 +- apps/web/src/composables/users.ts | 2 +- apps/web/src/composables/wallet.ts | 3 +- apps/web/src/composables/walletConnect.ts | 2 +- apps/web/src/interfaces/User.ts | 12 - apps/web/src/interfaces/index.ts | 15 - apps/web/tsconfig.json | 2 +- apps/web/vite.config.ts | 10 +- common/data/package.json | 4 +- common/data/scripts/clean.ts | 19 +- common/data/scripts/{postgres.ts => dev.ts} | 6 +- common/data/src/providers/postgres.ts | 2 +- common/helpers/src/index.ts | 44 +- common/types/src/index.ts | 12 +- common/types/src/interfaces/Account.ts | 5 +- .../types}/src/interfaces/BrowserProviders.ts | 2 +- .../types}/src/interfaces/EthersProvider.ts | 0 .../types/src/interfaces/LoginCredentials.ts | 4 +- .../types}/src/interfaces/MessageInit.ts | 3 +- common/types/src/interfaces/ProviderString.ts | 4 +- .../types}/src/interfaces/TransactionInit.ts | 4 +- common/types/src/interfaces/User.ts | 2 - .../types/src/interfaces/UserWithAccounts.ts | 2 +- contracts/ethereum/docs/index.md | 54 +- .../ethereum/functions/API-request-source.js | 55 +- contracts/ethereum/hardhat.config.ts | 1 - contracts/ethereum/scripts/dev.ts | 35 +- package-lock.json | 7810 +++++++++-------- package.json | 4 +- scripts/ethereum/dev.ts | 13 +- scripts/local/dev.ts | 30 +- services/dkg/package.json | 1 + services/dkg/scripts/clean.ts | 11 + services/dkg/scripts/dev.ts | 18 +- services/dkg/src/index.ts | 4 +- services/dkg/src/interfaces/CommandOptions.ts | 10 +- services/dkg/src/interfaces/DKGOptions.ts | 4 +- services/dkg/src/providers/commands.ts | 12 +- services/dkg/src/providers/config.ts | 5 +- services/dkg/src/providers/dkg.ts | 26 +- services/dkg/tsconfig.json | 45 +- services/users/scripts/seed.ts | 4 +- services/users/tsconfig.json | 2 +- 49 files changed, 4202 insertions(+), 4131 deletions(-) delete mode 100644 apps/web/src/interfaces/User.ts delete mode 100644 apps/web/src/interfaces/index.ts rename common/data/scripts/{postgres.ts => dev.ts} (92%) rename {apps/web => common/types}/src/interfaces/BrowserProviders.ts (69%) rename {apps/web => common/types}/src/interfaces/EthersProvider.ts (100%) rename {apps/web => common/types}/src/interfaces/MessageInit.ts (56%) rename {apps/web => common/types}/src/interfaces/TransactionInit.ts (83%) create mode 100644 services/dkg/scripts/clean.ts diff --git a/apps/landing/vite.config.ts b/apps/landing/vite.config.ts index c5858cdde..ed3293579 100644 --- a/apps/landing/vite.config.ts +++ b/apps/landing/vite.config.ts @@ -4,7 +4,7 @@ import { fileURLToPath } from 'url' import * as path from 'path' export default defineConfig({ - server: { port: 3000 }, + server: { port: 3001 }, plugins: [ vue({ include: [/\.vue$/] }) ], diff --git a/apps/web/src/composables/auth.ts b/apps/web/src/composables/auth.ts index 466a37fd2..3d5978da3 100644 --- a/apps/web/src/composables/auth.ts +++ b/apps/web/src/composables/auth.ts @@ -1,5 +1,6 @@ import useEnvironment from '@/composables/environment' -import { LoginCredentials, ProviderString } from '@casimir/types' +import { LoginCredentials } from '@casimir/types' +import { ProviderString } from '@casimir/types' const { usersBaseURL } = useEnvironment() diff --git a/apps/web/src/composables/ethers.ts b/apps/web/src/composables/ethers.ts index 48a1b6463..fe118d6f1 100644 --- a/apps/web/src/composables/ethers.ts +++ b/apps/web/src/composables/ethers.ts @@ -1,7 +1,6 @@ import { ref } from 'vue' import { ethers } from 'ethers' -import { BrowserProviders, EthersProvider, MessageInit, TransactionInit } from '@/interfaces/index' -import { Currency, ProviderString } from '@casimir/types' +import { BrowserProviders, Currency, EthersProvider, MessageInit, ProviderString, TransactionInit } from '@casimir/types' import useAuth from '@/composables/auth' const { getMessage, login } = useAuth() diff --git a/apps/web/src/composables/ledger.ts b/apps/web/src/composables/ledger.ts index 974477618..3d22687ba 100644 --- a/apps/web/src/composables/ledger.ts +++ b/apps/web/src/composables/ledger.ts @@ -1,7 +1,6 @@ import { BitcoinLedgerSigner, EthersLedgerSigner } from '@casimir/wallets' import { ethers } from 'ethers' -import { MessageInit, TransactionInit } from '@/interfaces/index' -import { Currency, ProviderString } from '@casimir/types' +import { Currency, MessageInit, ProviderString, TransactionInit } from '@casimir/types' import useEnvironment from '@/composables/environment' import useEthers from '@/composables/ethers' import useAuth from '@/composables/auth' diff --git a/apps/web/src/composables/solana.ts b/apps/web/src/composables/solana.ts index 696b401ad..9d0ce9ac8 100644 --- a/apps/web/src/composables/solana.ts +++ b/apps/web/src/composables/solana.ts @@ -5,8 +5,7 @@ import { SystemProgram, PublicKey } from '@solana/web3.js' -import { BrowserProviders, MessageInit, TransactionInit } from '@/interfaces/index' -import { ProviderString } from '@casimir/types' +import { BrowserProviders, MessageInit, ProviderString, TransactionInit } from '@casimir/types' export default function useSolana() { const solanaProviderList = ['Phantom'] diff --git a/apps/web/src/composables/ssv.ts b/apps/web/src/composables/ssv.ts index e866b28da..938b4464c 100644 --- a/apps/web/src/composables/ssv.ts +++ b/apps/web/src/composables/ssv.ts @@ -8,7 +8,7 @@ import useLedger from './ledger' import useTrezor from './trezor' import useWalletConnect from './walletConnect' import { Account, Pool, ProviderString } from '@casimir/types' -import { ReadyOrStakeString } from '../interfaces' +import { ReadyOrStakeString } from '@/interfaces/ReadyOrStakeString' /** Manager contract */ let manager: CasimirManager @@ -46,10 +46,8 @@ export default function useSSV() { let signer = signerCreator(walletProvider) if (isWalletConnectSigner(signer)) signer = await signer const managerSigner = manager.connect(signer as ethers.Signer) - const fees = await managerSigner.getFees() - const { LINK, SSV } = fees - const feesTotalPercent = LINK + SSV - const depositAmount = parseFloat(amount) * ((100 + feesTotalPercent) / 100) + const fees = await managerSigner.getFeePercent() + const depositAmount = parseFloat(amount) * ((100 + fees) / 100) const value = ethers.utils.parseEther(depositAmount.toString()) const result = await managerSigner.depositStake({ value, type: 0 }) return await result.wait() @@ -57,10 +55,8 @@ export default function useSSV() { async function getDepositFees() { const provider = new ethers.providers.JsonRpcProvider(ethereumURL) - const fees = await manager.connect(provider).getFees() - const { LINK, SSV } = fees - const feesTotalPercent = LINK + SSV - const feesRounded = Math.round(feesTotalPercent * 100) / 100 + const fees = await manager.connect(provider).getFeePercent() + const feesRounded = Math.round(fees * 100) / 100 return feesRounded } diff --git a/apps/web/src/composables/trezor.ts b/apps/web/src/composables/trezor.ts index 4aa801008..4ea529806 100644 --- a/apps/web/src/composables/trezor.ts +++ b/apps/web/src/composables/trezor.ts @@ -2,7 +2,7 @@ import { EthersTrezorSigner } from '@casimir/wallets' import useEthers from '@/composables/ethers' import useEnvironment from '@/composables/environment' import { ethers } from 'ethers' -import { MessageInit, TransactionInit } from '@/interfaces/index' +import { MessageInit, TransactionInit } from '@casimir/types' const trezorPath = 'm/44\'/60\'/0\'/0/0' diff --git a/apps/web/src/composables/users.ts b/apps/web/src/composables/users.ts index 696b384e5..3bee763f0 100644 --- a/apps/web/src/composables/users.ts +++ b/apps/web/src/composables/users.ts @@ -1,4 +1,4 @@ -import { onMounted, ref } from 'vue' +import { ref } from 'vue' import { AddAccountOptions, ProviderString, RemoveAccountOptions, UserWithAccounts } from '@casimir/types' import { ethers } from 'ethers' import useEnvironment from '@/composables/environment' diff --git a/apps/web/src/composables/wallet.ts b/apps/web/src/composables/wallet.ts index e037dce72..ee6797b7a 100644 --- a/apps/web/src/composables/wallet.ts +++ b/apps/web/src/composables/wallet.ts @@ -5,8 +5,7 @@ import useEthers from '@/composables/ethers' import useWalletConnect from '@/composables/walletConnect' import useSolana from '@/composables/solana' import useUsers from '@/composables/users' -import { Account, ProviderString, Currency } from '@casimir/types' -import { MessageInit, TransactionInit } from '@/interfaces/index' +import { Account, Currency, MessageInit, ProviderString, TransactionInit } from '@casimir/types' import * as Session from 'supertokens-web-js/recipe/session' import router from './router' diff --git a/apps/web/src/composables/walletConnect.ts b/apps/web/src/composables/walletConnect.ts index 7cf416d97..b7006c7cd 100644 --- a/apps/web/src/composables/walletConnect.ts +++ b/apps/web/src/composables/walletConnect.ts @@ -1,6 +1,6 @@ import { ethers } from 'ethers' import WalletConnectProvider from '@walletconnect/web3-provider' -import { MessageInit, TransactionInit } from '@/interfaces/index' +import { MessageInit, TransactionInit } from '@casimir/types' import useEnvironment from '@/composables/environment' import useEthers from '@/composables/ethers' diff --git a/apps/web/src/interfaces/User.ts b/apps/web/src/interfaces/User.ts deleted file mode 100644 index 6bb3b7d18..000000000 --- a/apps/web/src/interfaces/User.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Pool, ProviderString } from '@casimir/types' - -export interface User { - id: string - accounts: Record - primaryAccount: string - balance?: string - stake?: string - rewards?: string - pools?: Pool[] - address: string -} \ No newline at end of file diff --git a/apps/web/src/interfaces/index.ts b/apps/web/src/interfaces/index.ts deleted file mode 100644 index 5c4e0b664..000000000 --- a/apps/web/src/interfaces/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { BrowserProviders } from './BrowserProviders' -import { EthersProvider } from './EthersProvider' -import { MessageInit } from './MessageInit' -import { ReadyOrStakeString } from './ReadyOrStakeString' -import { TransactionInit } from './TransactionInit' -import { User } from './User' - -export type { - BrowserProviders, - EthersProvider, - MessageInit, - ReadyOrStakeString, - TransactionInit, - User, -} \ No newline at end of file diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index 4ff7eea8f..cd241d548 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -21,5 +21,5 @@ "./node_modules/@types" ] }, - "include": ["./src/**/*.ts", "./src/**/*.vue"] + "include": ["./src/**/*.ts", "./src/**/*.vue", "../../common/types/src/interfaces/BrowserProviders.ts", "../../common/types/src/interfaces/EthersProvider.ts", "../../common/types/src/interfaces/MessageInit.ts", "../../common/types/src/interfaces/TransactionInit.ts", "../../common/types/src/interfaces/UserWithProviders.ts"] } diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index 2b0172daf..339fe16ff 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -1,13 +1,13 @@ import vue from '@vitejs/plugin-vue' -import { UserConfig } from 'vite' +import { defineConfig } from 'vite' import { fileURLToPath } from 'url' import * as path from 'path' import NodeGlobalsPolyfillPlugin from '@esbuild-plugins/node-globals-polyfill' import inject from '@rollup/plugin-inject' import nodePolyFills from 'rollup-plugin-node-polyfills' -const config: UserConfig = { - server: { port: 3000 }, +export default defineConfig({ + server: { port: 3001 }, plugins: [ vue({ include: [/\.vue$/] }), nodePolyFills(), @@ -53,6 +53,4 @@ const config: UserConfig = { ] }, envPrefix: 'PUBLIC_' -} as UserConfig - -export default config \ No newline at end of file +}) \ No newline at end of file diff --git a/common/data/package.json b/common/data/package.json index 44a8199d3..2d875f1e2 100644 --- a/common/data/package.json +++ b/common/data/package.json @@ -6,8 +6,8 @@ "build": "echo '@casimir/data build not specified. Disregard this warning and any listed errors above if @casimir/types is not needed for the current project build.' && exit 0", "clean": "ts-node --transpile-only scripts/clean.ts", "configure:python": "poetry install && poetry run ipython kernel install --user --name=casimir-data", - "dev": "ts-node --transpile-only scripts/postgres.ts --tables \"$npm_config_tables\"", - "watch": "ts-node-dev --watch src --respawn --transpile-only scripts/postgres.ts --tables \"$npm_config_tables\"", + "dev": "ts-node --transpile-only scripts/dev.ts --tables \"$npm_config_tables\"", + "watch": "ts-node-dev --watch src --respawn --transpile-only scripts/dev.ts --tables \"$npm_config_tables\"", "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { diff --git a/common/data/scripts/clean.ts b/common/data/scripts/clean.ts index afc0c7d8b..77eb0624b 100644 --- a/common/data/scripts/clean.ts +++ b/common/data/scripts/clean.ts @@ -4,22 +4,9 @@ import { run } from '@casimir/helpers' const resourcePath = './scripts' /** - * Clean Docker containers, Postgres data, and SQL schema files. + * Clean up resources */ void async function () { - console.log(`Cleaning up Docker containers, Postgres data, and SQL schema files from ${resourcePath}/.out`) - - /** Stop postgres database */ - const stackName = 'casimir-data' - const containerName = `${stackName}-postgres-1` - const container = await run(`docker ps -q --filter name=${containerName}`) - if (container) { - await run(`docker compose -p ${stackName} -f ${resourcePath}/docker-compose.yaml down`) - } - - /** Clear output directory for pgdata and sql */ - const outDir = `${resourcePath}/.out` - await run(`npx rimraf ${outDir}`) - - console.log('🐘 Database resources cleaned') + await run(`rm -rf ${resourcePath}/.out`) + await run(`docker compose -p casimir-data -f ${resourcePath}/docker-compose.yaml down`) }() \ No newline at end of file diff --git a/common/data/scripts/postgres.ts b/common/data/scripts/dev.ts similarity index 92% rename from common/data/scripts/postgres.ts rename to common/data/scripts/dev.ts index 73009c2fb..709bc740c 100644 --- a/common/data/scripts/postgres.ts +++ b/common/data/scripts/dev.ts @@ -1,6 +1,6 @@ import minimist from 'minimist' import fs from 'fs' -import { run } from '@casimir/helpers' +import { run, runSync } from '@casimir/helpers' import { JsonSchema, Schema, accountSchema, nonceSchema, userSchema } from '@casimir/data' /** Resource path from package caller */ @@ -48,9 +48,9 @@ void async function () { if (!container) { /** Start local database */ await run(`docker compose -p ${stackName} -f ${resourcePath}/docker-compose.yaml up -d`) - console.log('🐘 Database started') + console.log('🐘 Database resources started') } else { await run(`docker exec ${containerName} psql -U postgres -d postgres -f /docker-entrypoint-initdb.d/schema.sql`) - console.log('🐘 Database synced') + console.log('🐘 Database resources synced') } }() \ No newline at end of file diff --git a/common/data/src/providers/postgres.ts b/common/data/src/providers/postgres.ts index 6273e7165..7375d9287 100644 --- a/common/data/src/providers/postgres.ts +++ b/common/data/src/providers/postgres.ts @@ -17,7 +17,7 @@ export class Postgres { */ constructor(config?: PoolConfig) { this.pool = new Pool(config) - process.on('exit', () => this.close()) + process.on('SIGINT', () => this.close()) } /** diff --git a/common/helpers/src/index.ts b/common/helpers/src/index.ts index 00d821082..bbe260176 100644 --- a/common/helpers/src/index.ts +++ b/common/helpers/src/index.ts @@ -1,4 +1,4 @@ -import { spawn, execSync } from 'child_process' +import { exec, execSync } from 'child_process' import { fromIni } from '@aws-sdk/credential-providers' import { SecretsManagerClient, GetSecretValueCommand } from '@aws-sdk/client-secrets-manager' import { ethers } from 'ethers' @@ -95,17 +95,16 @@ export function kebabCase(string: string): string { } /** - * Run any shell command with a spawned child process and return a promise - * @param fullCommand - The full command to run + * Run any shell command in a child process and return a promise + * @param command - The full command to run * @returns A promise that resolves when the command exits */ -export async function run(fullCommand: string) { - const [command, ...args] = fullCommand.split(' ') - const child = spawn(command, args) +export async function run(command: string) { + const child = exec(command) let data = '' return new Promise((resolve, reject) => { child.on('error', reject) - child.stdout.on('data', chunk => { + child.stdout?.on('data', chunk => { process.stdout.write(chunk.toString()) data += chunk.toString() }) @@ -114,25 +113,34 @@ export async function run(fullCommand: string) { } /** - * Retry run any shell command with a spawned child process and return a promise - * @param fullCommand - The full command to run + * Retry run any shell command in a child process and return a promise + * @param command - The full command to run * @param retriesLeft - Number of retries left (default: 5) * @returns A promise that resolves when the command exits */ -export async function retryRun(fullCommand: string, retriesLeft: number | undefined = 25): Promise { +export async function runRetry(command: string, retriesLeft: number | undefined = 25): Promise { if (retriesLeft === 0) { throw new Error('Command failed after maximum retries') } try { - return await run(fullCommand) + return await run(command) } catch (error) { await new Promise(resolve => setTimeout(resolve, 5000)) - console.log('Retrying command', fullCommand) - return await retryRun(fullCommand, retriesLeft - 1) + console.log('Retrying command', command) + return await runRetry(command, retriesLeft - 1) } } +/** + * Run any shell command synchronously in a child process + * @param command - The full command to run + * @returns The output of the command + */ +export function runSync(command: string) { + return execSync(command).toString() +} + /** * Retry a fetch request. * @param {RequestInfo} info - URL string or request object @@ -140,25 +148,25 @@ export async function retryRun(fullCommand: string, retriesLeft: number | undefi * @param {number | undefined} retriesLeft - Number of retries left (default: 5) * @returns {Promise} Response * @example - * const response = await retryFetch('https://example.com') + * const response = await fetchRetry('https://example.com') */ -export async function retryFetch(info: RequestInfo, init?: RequestInit, retriesLeft: number | undefined = 25): Promise { +export async function fetchRetry(info: RequestInfo, init?: RequestInit, retriesLeft: number | undefined = 25): Promise { if (retriesLeft === 0) { throw new Error('API request failed after maximum retries') } try { - const response = await fetch(info, init) + const response = await fetch(info, init) if (response.status !== 200) { await new Promise(resolve => setTimeout(resolve, 5000)) console.log('Retrying fetch request to', info, init) - return await retryFetch(info, init || {}, retriesLeft - 1) + return await fetchRetry(info, init || {}, retriesLeft - 1) } return response } catch (error) { await new Promise(resolve => setTimeout(resolve, 5000)) console.log('Retrying fetch request to', info, init) - return await retryFetch(info, init || {}, retriesLeft - 1) + return await fetchRetry(info, init || {}, retriesLeft - 1) } } diff --git a/common/types/src/index.ts b/common/types/src/index.ts index 9ec414c04..265e388f3 100644 --- a/common/types/src/index.ts +++ b/common/types/src/index.ts @@ -1,37 +1,45 @@ import { Account } from './interfaces/Account' import { AddAccountOptions } from './interfaces/AddAccountOptions' import { BalanceSnapshot } from './interfaces/BalanceSnapshot' +import { BrowserProviders } from './interfaces/BrowserProviders' import { ContractArgs } from './interfaces/ContractArgs' import { ContractConfig } from './interfaces/ContractConfig' import { Currency } from './interfaces/Currency' import { DeploymentConfig } from './interfaces/DeploymentConfig' +import { EthersProvider } from './interfaces/EthersProvider' import { Event } from './interfaces/Event' import { LoginCredentials } from './interfaces/LoginCredentials' +import { MessageInit } from './interfaces/MessageInit' import { Operator } from './interfaces/Operator' import { Pool } from './interfaces/Pool' import { ProviderString } from './interfaces/ProviderString' import { RemoveAccountOptions } from './interfaces/RemoveAccountOptions' +import { TransactionInit } from './interfaces/TransactionInit' import { User } from './interfaces/User' -import { UserWithAccounts } from './interfaces/UserWithAccounts' import { UserAddedSuccess } from './interfaces/UserAddedSuccess' +import { UserWithAccounts } from './interfaces/UserWithAccounts' import { Validator } from './interfaces/Validator' export type { Account, AddAccountOptions, BalanceSnapshot, + BrowserProviders, ContractArgs, ContractConfig, Currency, DeploymentConfig, + EthersProvider, Event, LoginCredentials, + MessageInit, Operator, Pool, ProviderString, RemoveAccountOptions, + TransactionInit, User, - UserWithAccounts, UserAddedSuccess, + UserWithAccounts, Validator, } diff --git a/common/types/src/interfaces/Account.ts b/common/types/src/interfaces/Account.ts index 0aa5eda72..90230131b 100644 --- a/common/types/src/interfaces/Account.ts +++ b/common/types/src/interfaces/Account.ts @@ -1,4 +1,7 @@ -import { BalanceSnapshot, Currency, Pool, ProviderString } from '@casimir/types' +import { BalanceSnapshot } from './BalanceSnapshot' +import { ProviderString } from './ProviderString' +import { Currency } from './Currency' +import { Pool } from './Pool' export interface Account { /** Unique ID (only keeping the latest of each distinct address/currency pair per User to avoid double counting) */ diff --git a/apps/web/src/interfaces/BrowserProviders.ts b/common/types/src/interfaces/BrowserProviders.ts similarity index 69% rename from apps/web/src/interfaces/BrowserProviders.ts rename to common/types/src/interfaces/BrowserProviders.ts index 8acc95133..b4ad3e934 100644 --- a/apps/web/src/interfaces/BrowserProviders.ts +++ b/common/types/src/interfaces/BrowserProviders.ts @@ -1,4 +1,4 @@ -import { EthersProvider } from '@/interfaces/EthersProvider' +import { EthersProvider } from './EthersProvider' export interface BrowserProviders { MetaMask?: EthersProvider diff --git a/apps/web/src/interfaces/EthersProvider.ts b/common/types/src/interfaces/EthersProvider.ts similarity index 100% rename from apps/web/src/interfaces/EthersProvider.ts rename to common/types/src/interfaces/EthersProvider.ts diff --git a/common/types/src/interfaces/LoginCredentials.ts b/common/types/src/interfaces/LoginCredentials.ts index 4367bb404..355b7c1ca 100644 --- a/common/types/src/interfaces/LoginCredentials.ts +++ b/common/types/src/interfaces/LoginCredentials.ts @@ -1,5 +1,5 @@ -import { Currency } from '@casimir/types' -import { ProviderString } from '@casimir/types' +import { Currency } from './Currency' +import { ProviderString } from './ProviderString' export interface LoginCredentials { address: string diff --git a/apps/web/src/interfaces/MessageInit.ts b/common/types/src/interfaces/MessageInit.ts similarity index 56% rename from apps/web/src/interfaces/MessageInit.ts rename to common/types/src/interfaces/MessageInit.ts index ace0fda3b..c4f42e2eb 100644 --- a/apps/web/src/interfaces/MessageInit.ts +++ b/common/types/src/interfaces/MessageInit.ts @@ -1,4 +1,5 @@ -import { Currency, ProviderString } from '@casimir/types' +import { ProviderString } from './ProviderString' +import { Currency } from './Currency' export interface MessageInit { message: string; diff --git a/common/types/src/interfaces/ProviderString.ts b/common/types/src/interfaces/ProviderString.ts index 0ad9d364d..8081c8c8f 100644 --- a/common/types/src/interfaces/ProviderString.ts +++ b/common/types/src/interfaces/ProviderString.ts @@ -1,4 +1,4 @@ -import { BrowserProviders } from '@/interfaces/index' +import { BrowserProviders } from './BrowserProviders' export type ProviderString = | keyof BrowserProviders | 'IoPay' @@ -6,4 +6,4 @@ export type ProviderString = | 'Trezor' | 'WalletConnect' | 'Phantom' - | '' + | '' \ No newline at end of file diff --git a/apps/web/src/interfaces/TransactionInit.ts b/common/types/src/interfaces/TransactionInit.ts similarity index 83% rename from apps/web/src/interfaces/TransactionInit.ts rename to common/types/src/interfaces/TransactionInit.ts index 84cd916f0..ca2e65fdf 100644 --- a/apps/web/src/interfaces/TransactionInit.ts +++ b/common/types/src/interfaces/TransactionInit.ts @@ -1,6 +1,6 @@ import ethers from 'ethers' -import { ProviderString } from '@casimir/types' -import { Currency } from '@casimir/types' +import { ProviderString } from './ProviderString' +import { Currency } from './Currency' export interface TransactionInit extends ethers.providers.TransactionRequest { /** The transaction sender's address */ diff --git a/common/types/src/interfaces/User.ts b/common/types/src/interfaces/User.ts index d0692f1f2..1c9b5dc1c 100644 --- a/common/types/src/interfaces/User.ts +++ b/common/types/src/interfaces/User.ts @@ -1,5 +1,3 @@ -import { Account } from '@casimir/types' - export interface User { /** Unique ID (and essential for auth verification) */ address: string diff --git a/common/types/src/interfaces/UserWithAccounts.ts b/common/types/src/interfaces/UserWithAccounts.ts index 7527f3eea..35dd784ab 100644 --- a/common/types/src/interfaces/UserWithAccounts.ts +++ b/common/types/src/interfaces/UserWithAccounts.ts @@ -1,4 +1,4 @@ -import { Account } from '@casimir/types' +import { Account } from './Account' export interface UserWithAccounts { /** Unique ID (and essential for auth verification) */ diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 0eddfd657..66552a052 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -44,14 +44,6 @@ uint256 stakeRatioSum Sum of scaled rewards to stake ratios (intial value required) -### pendingFeesReserved - -```solidity -uint256 pendingFeesReserved -``` - -Total pending fees reserved - ### ethFeePercent ```solidity @@ -306,6 +298,20 @@ Get the manager buffered (execution) stake | ---- | ---- | ----------- | | stake | uint256 | The manager buffered (execution) stake | +### getPendingStake + +```solidity +function getPendingStake() public view returns (uint256 stake) +``` + +Get the manager pending (consensus) stake + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| stake | uint256 | The manager pending (consensus) stake | + ### getActiveStake ```solidity @@ -340,6 +346,34 @@ Get the total user stake for a given user address | ---- | ---- | ----------- | | userStake | uint256 | The total user stake | +### getReservedFees + +```solidity +function getReservedFees() public view returns (uint256) +``` + +Get the manager reserved fees + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | reservedFees The manager reserved fees | + +### getSweptBalance + +```solidity +function getSweptBalance() public view returns (uint256 balance) +``` + +Get the manager swept balance + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| balance | uint256 | The manager swept balance | + ### getFeePercent ```solidity @@ -416,13 +450,13 @@ Get the pending withdrawal queue function getValidatorPublicKeys() external view returns (bytes[]) ``` -Get staked validator public keys +Get validator public keys #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes[] | A list of active validator public keys | +| [0] | bytes[] | A list of pending and active validator public keys | ### getExitingValidatorCount diff --git a/contracts/ethereum/functions/API-request-source.js b/contracts/ethereum/functions/API-request-source.js index dfc9e5435..42b6a0a52 100644 --- a/contracts/ethereum/functions/API-request-source.js +++ b/contracts/ethereum/functions/API-request-source.js @@ -1,5 +1,33 @@ // Arguments can be provided when a request is initated on-chain and used in the request source code as shown below +function repeat(str, num) { + if (str.length === 0 || num <= 1) { + if (num === 1) { + return str + } + + return '' + } + + let result = '' + let pattern = str + + while (num > 0) { + if (num & 1) { + result += pattern + } + + num >>= 1 + pattern += pattern + } + + return result +} + +function lpad(obj, str, num) { + return repeat(str, num - obj.length) + obj +} + const managerAddress = "0x07e05700cb4e946ba50244e27f01805354cd8ef0" // We want to get a string (not bytes) array of length of the number of validators // See PoR Address List @@ -22,27 +50,24 @@ const getPublicKeys = await Functions.makeHttpRequest({ const { result } = getPublicKeys.data -// Remove the '0x' prefix -let raw = result.slice(2); - -// Fetch the number of keys from the start of the data -let numKeys = parseInt(raw.slice(0, 64), 16); + // Convert the hex string to a byte array. + const bytes = new BigUint64Array(result.slice(2)) -// Initial offset is 32 bytes (or 64 characters), multiplied by 2 for hex -let offset = 64 * 2; + console.log('Bytes', bytes) -let publicKeys = []; + // Create a new array to store the decoded values. + const publicKeys = [] -for (let i = 0; i < numKeys; i++) { - // Extract each public key - let publicKey = raw.slice(offset, offset + 128); - publicKeys.push('0x' + publicKey); + // Iterate over the byte array. + for (let i = 0; i < bytes.length; i++) { + // Convert each byte in the byte array to a string. + const publicKey = bytes[i].toString('hex') - // Move the offset to the next key - offset += 128; + // Push the converted string to the new array. + publicKeys.push('0x' + publicKey) } -console.log(publicKeys); +console.log('PKs', publicKeys) // To make an HTTP request, use the Functions.makeHttpRequest function // Functions.makeHttpRequest function parameters: diff --git a/contracts/ethereum/hardhat.config.ts b/contracts/ethereum/hardhat.config.ts index 51941fc00..eed667828 100644 --- a/contracts/ethereum/hardhat.config.ts +++ b/contracts/ethereum/hardhat.config.ts @@ -132,7 +132,6 @@ if (process.env.LOCAL_TUNNEL) { } process.on('SIGINT', () => { tunnel.close() - process.exit(0) }) } ) diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 3e4283dbb..9c3638486 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -81,11 +81,18 @@ void async function () { /** Fulfill functions request */ if (ranUpkeepBefore) { - const nextActiveBalanceAmount = round(parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) + rewardAmount) + const nextActiveBalanceAmount = round( + parseFloat( + ethers.utils.formatEther( + (await manager.getActiveStake()).add((await manager.getPendingPoolIds()).length * 32) + ) + ) + rewardAmount + ) const nextSweptRewardsAmount = 0 const nextSweptExitsAmount = 0 - const nextDepositedCount = 0 + const nextDepositedCount = (await manager.getPendingPoolIds()).length const nextExitedCount = 0 + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveBalanceAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } @@ -98,11 +105,18 @@ void async function () { /** Fulfill functions request */ if (ranUpkeepAfter) { - const nextActiveBalanceAmount = round(parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) - rewardAmount) + const nextActiveBalanceAmount = round( + parseFloat( + ethers.utils.formatEther( + (await manager.getActiveStake()).add((await manager.getPendingPoolIds()).length * 32) + ) + ) - rewardAmount + ) const nextSweptRewardsAmount = rewardAmount const nextSweptExitsAmount = 0 - const nextDepositedCount = 0 + const nextDepositedCount = (await manager.getPendingPoolIds()).length const nextExitedCount = 0 + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveBalanceAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } @@ -123,18 +137,5 @@ void async function () { for await (const event of on(manager as unknown as EventEmitter, 'PoolDepositInitiated')) { const [ id, details ] = event console.log(`Pool ${id} initiated at block number ${details.blockNumber}`) - - /** Perform upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, keeper }) - - /** Fulfill functions request */ - if (ranUpkeep) { - const nextActiveBalanceAmount = parseFloat(ethers.utils.formatEther(await manager.getActiveStake())) + 32 - const nextSweptRewardsAmount = 0 - const nextSweptExitsAmount = 0 - const nextDepositedCount = 1 - const nextExitedCount = 0 - await fulfillFunctionsRequest({ upkeep, keeper, nextActiveBalanceAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) - } } }() \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 82c0b8708..b22a5a1f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -58,6 +58,19 @@ "vue-tsc": "^0.34.7" } }, + "apps/landing/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "apps/web": { "name": "@casimir/web", "dependencies": { @@ -90,11 +103,17 @@ "vue-tsc": "^0.34.7" } }, - "common/core": { - "name": "@casimir/core", - "extraneous": true, - "dependencies": { - "ethers": "^5.7.2" + "apps/web/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" } }, "common/data": { @@ -110,10 +129,43 @@ "ts-node-dev": "^2.0.0" } }, + "common/data/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "common/data/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "common/data/node_modules/rimraf": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.0.tgz", - "integrity": "sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", "dev": true, "dependencies": { "glob": "^9.2.0" @@ -128,19 +180,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "common/hardhat": { - "name": "@casimir/hardhat", - "extraneous": true, - "devDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.6", - "@typechain/ethers-v5": "^10.1.0", - "@typechain/hardhat": "^6.1.2", - "@types/node": "^17.0.38", - "esbuild": "^0.15.9", - "hardhat": "^2.12.2", - "typechain": "^8.1.0" - } - }, "common/helpers": { "name": "@casimir/helpers", "dependencies": { @@ -274,12 +313,24 @@ "constructs": "^10.0.0" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { @@ -287,9 +338,9 @@ } }, "node_modules/@aws-cdk/asset-awscli-v1": { - "version": "2.2.106", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.106.tgz", - "integrity": "sha512-iZHFZJL7gdM2xw0qFqOww4eojxeyhHsaIuUgFrPo0vl7/0LhZzXBDJPnL5yGBWPWOs2tEaYvjkxYrpoLcpnCKg==" + "version": "2.2.176", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.176.tgz", + "integrity": "sha512-rAJ2KO0SK9uC9Wv6vAS1V2Eg88dK9nlojhm/HrEBWDsIPWcxvvT9EACkElrNXK9X6CF10i6W4UApCROERF1qjg==" }, "node_modules/@aws-cdk/asset-kubectl-v20": { "version": "2.1.1", @@ -297,9 +348,9 @@ "integrity": "sha512-U1ntiX8XiMRRRH5J1IdC+1t5CE89015cwyt5U63Cpk0GnMlN5+h9WsWMlKlPXZR4rdq/m806JRlBMRpBUB2Dhw==" }, "node_modules/@aws-cdk/asset-node-proxy-agent-v5": { - "version": "2.0.85", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.85.tgz", - "integrity": "sha512-o+k40Gw+h6MqzOe1eU3X+P3S9DAR1IPwxHKS999KQJNkvSGJHg5RVV1bW6EibQwA9ndqXvkym3LrXtIH9KP+Hg==" + "version": "2.0.147", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.147.tgz", + "integrity": "sha512-CnRj0KQwF6bpoGl2kABRqSdkf9gyj6IdEcuReaWbExPGYKKk+Pc0aGr32SwcPftP2Z8754g3Msw+tBhfE3IYdg==" }, "node_modules/@aws-cdk/aws-glue-alpha": { "version": "2.33.0-alpha.0", @@ -390,102 +441,102 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@aws-sdk/abort-controller": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.290.0.tgz", - "integrity": "sha512-Q4AqucQnhcsauH6tDf1bSRuOW/Ejwjs1qHPLlvknwX1IoxZettP3lXz9LLd8KZnEMFQLHPmBTbFIW+Ivpzl+vw==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.329.0.tgz", + "integrity": "sha512-hzrjPNQcJoSPe0oS20V5i98oiEZSM3mKNiR6P3xHTHTPI/F23lyjGZ+/CSkCmJbSWfGZ5sHZZcU6AWuS7xBdTw==", "dependencies": { - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.291.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.291.0.tgz", - "integrity": "sha512-98fHg7KGVt67/UvD2VoFHctnasMbPyXrK+lt8G2H+YjXnqolgHMzODqjuR13xoFB0gETX5e8XVFg5VkoyPPPIw==", + "version": "3.332.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.332.0.tgz", + "integrity": "sha512-o2G3+w0Qm+jd5fnmG6+FF5KRu90PIv2Kd0mmMJIFmACVd+VtuWqsk85capX21YLcxizKe+okqaaD8/9vV7nvfw==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.290.0", - "@aws-sdk/config-resolver": "3.290.0", - "@aws-sdk/credential-provider-node": "3.290.0", - "@aws-sdk/fetch-http-handler": "3.290.0", - "@aws-sdk/hash-node": "3.290.0", - "@aws-sdk/invalid-dependency": "3.290.0", - "@aws-sdk/middleware-content-length": "3.290.0", - "@aws-sdk/middleware-endpoint": "3.290.0", - "@aws-sdk/middleware-host-header": "3.290.0", - "@aws-sdk/middleware-logger": "3.290.0", - "@aws-sdk/middleware-recursion-detection": "3.290.0", - "@aws-sdk/middleware-retry": "3.290.0", - "@aws-sdk/middleware-serde": "3.290.0", - "@aws-sdk/middleware-signing": "3.290.0", - "@aws-sdk/middleware-stack": "3.290.0", - "@aws-sdk/middleware-user-agent": "3.290.0", - "@aws-sdk/node-config-provider": "3.290.0", - "@aws-sdk/node-http-handler": "3.290.0", - "@aws-sdk/protocol-http": "3.290.0", - "@aws-sdk/smithy-client": "3.290.0", - "@aws-sdk/types": "3.290.0", - "@aws-sdk/url-parser": "3.290.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.290.0", - "@aws-sdk/util-defaults-mode-node": "3.290.0", - "@aws-sdk/util-endpoints": "3.290.0", - "@aws-sdk/util-retry": "3.290.0", - "@aws-sdk/util-user-agent-browser": "3.290.0", - "@aws-sdk/util-user-agent-node": "3.290.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" + "@aws-sdk/client-sts": "3.332.0", + "@aws-sdk/config-resolver": "3.329.0", + "@aws-sdk/credential-provider-node": "3.332.0", + "@aws-sdk/fetch-http-handler": "3.329.0", + "@aws-sdk/hash-node": "3.329.0", + "@aws-sdk/invalid-dependency": "3.329.0", + "@aws-sdk/middleware-content-length": "3.329.0", + "@aws-sdk/middleware-endpoint": "3.329.0", + "@aws-sdk/middleware-host-header": "3.329.0", + "@aws-sdk/middleware-logger": "3.329.0", + "@aws-sdk/middleware-recursion-detection": "3.329.0", + "@aws-sdk/middleware-retry": "3.329.0", + "@aws-sdk/middleware-serde": "3.329.0", + "@aws-sdk/middleware-signing": "3.329.0", + "@aws-sdk/middleware-stack": "3.329.0", + "@aws-sdk/middleware-user-agent": "3.332.0", + "@aws-sdk/node-config-provider": "3.329.0", + "@aws-sdk/node-http-handler": "3.329.0", + "@aws-sdk/protocol-http": "3.329.0", + "@aws-sdk/smithy-client": "3.329.0", + "@aws-sdk/types": "3.329.0", + "@aws-sdk/url-parser": "3.329.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.329.0", + "@aws-sdk/util-defaults-mode-node": "3.329.0", + "@aws-sdk/util-endpoints": "3.332.0", + "@aws-sdk/util-retry": "3.329.0", + "@aws-sdk/util-user-agent-browser": "3.329.0", + "@aws-sdk/util-user-agent-node": "3.329.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.290.0.tgz", - "integrity": "sha512-CI87rdygImLmMcOQ/goRN2l0ABKaz/XCgEPag4p+7W9/0/eGK4B9WblWNhC2oRFa82nwV8+Scan5oLuzcI2oHQ==", + "version": "3.332.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.332.0.tgz", + "integrity": "sha512-xn8Ft+y+XggryvvPnKSEYhuidxWMMAXTfM4Dk1HAbzrpyAYRIuvYApt0a9nWa9DNM6Oi0yhcVvmsJW0/R+tvcA==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.290.0", - "@aws-sdk/config-resolver": "3.290.0", - "@aws-sdk/credential-provider-node": "3.290.0", - "@aws-sdk/fetch-http-handler": "3.290.0", - "@aws-sdk/hash-node": "3.290.0", - "@aws-sdk/invalid-dependency": "3.290.0", - "@aws-sdk/middleware-content-length": "3.290.0", - "@aws-sdk/middleware-endpoint": "3.290.0", - "@aws-sdk/middleware-host-header": "3.290.0", - "@aws-sdk/middleware-logger": "3.290.0", - "@aws-sdk/middleware-recursion-detection": "3.290.0", - "@aws-sdk/middleware-retry": "3.290.0", - "@aws-sdk/middleware-serde": "3.290.0", - "@aws-sdk/middleware-signing": "3.290.0", - "@aws-sdk/middleware-stack": "3.290.0", - "@aws-sdk/middleware-user-agent": "3.290.0", - "@aws-sdk/node-config-provider": "3.290.0", - "@aws-sdk/node-http-handler": "3.290.0", - "@aws-sdk/protocol-http": "3.290.0", - "@aws-sdk/smithy-client": "3.290.0", - "@aws-sdk/types": "3.290.0", - "@aws-sdk/url-parser": "3.290.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.290.0", - "@aws-sdk/util-defaults-mode-node": "3.290.0", - "@aws-sdk/util-endpoints": "3.290.0", - "@aws-sdk/util-retry": "3.290.0", - "@aws-sdk/util-user-agent-browser": "3.290.0", - "@aws-sdk/util-user-agent-node": "3.290.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1", + "@aws-sdk/client-sts": "3.332.0", + "@aws-sdk/config-resolver": "3.329.0", + "@aws-sdk/credential-provider-node": "3.332.0", + "@aws-sdk/fetch-http-handler": "3.329.0", + "@aws-sdk/hash-node": "3.329.0", + "@aws-sdk/invalid-dependency": "3.329.0", + "@aws-sdk/middleware-content-length": "3.329.0", + "@aws-sdk/middleware-endpoint": "3.329.0", + "@aws-sdk/middleware-host-header": "3.329.0", + "@aws-sdk/middleware-logger": "3.329.0", + "@aws-sdk/middleware-recursion-detection": "3.329.0", + "@aws-sdk/middleware-retry": "3.329.0", + "@aws-sdk/middleware-serde": "3.329.0", + "@aws-sdk/middleware-signing": "3.329.0", + "@aws-sdk/middleware-stack": "3.329.0", + "@aws-sdk/middleware-user-agent": "3.332.0", + "@aws-sdk/node-config-provider": "3.329.0", + "@aws-sdk/node-http-handler": "3.329.0", + "@aws-sdk/protocol-http": "3.329.0", + "@aws-sdk/smithy-client": "3.329.0", + "@aws-sdk/types": "3.329.0", + "@aws-sdk/url-parser": "3.329.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.329.0", + "@aws-sdk/util-defaults-mode-node": "3.329.0", + "@aws-sdk/util-endpoints": "3.332.0", + "@aws-sdk/util-retry": "3.329.0", + "@aws-sdk/util-user-agent-browser": "3.329.0", + "@aws-sdk/util-user-agent-node": "3.329.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0", "uuid": "^8.3.2" }, "engines": { @@ -493,425 +544,420 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.290.0.tgz", - "integrity": "sha512-FUFAbptuJSRKnzBgFJqXxusSG7PzECSqX0FnMh2vxCVu2PifaAE4stiMW8Myj8ABQAbfIrAWM+17upcrfmudoA==", + "version": "3.332.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.332.0.tgz", + "integrity": "sha512-4q1Nko8M6YVANdEiLYvdv1qb00j4xN4ppE/6d4xpGp7DxHYlm0GA762h0/TR2dun+2I+SMnwj4Fv6BxOmzBaEw==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.290.0", - "@aws-sdk/fetch-http-handler": "3.290.0", - "@aws-sdk/hash-node": "3.290.0", - "@aws-sdk/invalid-dependency": "3.290.0", - "@aws-sdk/middleware-content-length": "3.290.0", - "@aws-sdk/middleware-endpoint": "3.290.0", - "@aws-sdk/middleware-host-header": "3.290.0", - "@aws-sdk/middleware-logger": "3.290.0", - "@aws-sdk/middleware-recursion-detection": "3.290.0", - "@aws-sdk/middleware-retry": "3.290.0", - "@aws-sdk/middleware-serde": "3.290.0", - "@aws-sdk/middleware-stack": "3.290.0", - "@aws-sdk/middleware-user-agent": "3.290.0", - "@aws-sdk/node-config-provider": "3.290.0", - "@aws-sdk/node-http-handler": "3.290.0", - "@aws-sdk/protocol-http": "3.290.0", - "@aws-sdk/smithy-client": "3.290.0", - "@aws-sdk/types": "3.290.0", - "@aws-sdk/url-parser": "3.290.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.290.0", - "@aws-sdk/util-defaults-mode-node": "3.290.0", - "@aws-sdk/util-endpoints": "3.290.0", - "@aws-sdk/util-retry": "3.290.0", - "@aws-sdk/util-user-agent-browser": "3.290.0", - "@aws-sdk/util-user-agent-node": "3.290.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" + "@aws-sdk/config-resolver": "3.329.0", + "@aws-sdk/fetch-http-handler": "3.329.0", + "@aws-sdk/hash-node": "3.329.0", + "@aws-sdk/invalid-dependency": "3.329.0", + "@aws-sdk/middleware-content-length": "3.329.0", + "@aws-sdk/middleware-endpoint": "3.329.0", + "@aws-sdk/middleware-host-header": "3.329.0", + "@aws-sdk/middleware-logger": "3.329.0", + "@aws-sdk/middleware-recursion-detection": "3.329.0", + "@aws-sdk/middleware-retry": "3.329.0", + "@aws-sdk/middleware-serde": "3.329.0", + "@aws-sdk/middleware-stack": "3.329.0", + "@aws-sdk/middleware-user-agent": "3.332.0", + "@aws-sdk/node-config-provider": "3.329.0", + "@aws-sdk/node-http-handler": "3.329.0", + "@aws-sdk/protocol-http": "3.329.0", + "@aws-sdk/smithy-client": "3.329.0", + "@aws-sdk/types": "3.329.0", + "@aws-sdk/url-parser": "3.329.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.329.0", + "@aws-sdk/util-defaults-mode-node": "3.329.0", + "@aws-sdk/util-endpoints": "3.332.0", + "@aws-sdk/util-retry": "3.329.0", + "@aws-sdk/util-user-agent-browser": "3.329.0", + "@aws-sdk/util-user-agent-node": "3.329.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.290.0.tgz", - "integrity": "sha512-/+OSYCjyf2TjA57beWLBjG05yPwWlpqK4gO3GwpVqfygaRh6g5jS0CBVQs+z+xc7gmI0weC/nhc+BXR9qcJJAA==", + "version": "3.332.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.332.0.tgz", + "integrity": "sha512-tz8k8Yqm4TScIfit0Tum2zWAq1md+gZKr747CSixd4Zwcp7Vwh75cRoL7Rz1ZHSEn1Yo983MWREevVez3SubLw==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.290.0", - "@aws-sdk/fetch-http-handler": "3.290.0", - "@aws-sdk/hash-node": "3.290.0", - "@aws-sdk/invalid-dependency": "3.290.0", - "@aws-sdk/middleware-content-length": "3.290.0", - "@aws-sdk/middleware-endpoint": "3.290.0", - "@aws-sdk/middleware-host-header": "3.290.0", - "@aws-sdk/middleware-logger": "3.290.0", - "@aws-sdk/middleware-recursion-detection": "3.290.0", - "@aws-sdk/middleware-retry": "3.290.0", - "@aws-sdk/middleware-serde": "3.290.0", - "@aws-sdk/middleware-stack": "3.290.0", - "@aws-sdk/middleware-user-agent": "3.290.0", - "@aws-sdk/node-config-provider": "3.290.0", - "@aws-sdk/node-http-handler": "3.290.0", - "@aws-sdk/protocol-http": "3.290.0", - "@aws-sdk/smithy-client": "3.290.0", - "@aws-sdk/types": "3.290.0", - "@aws-sdk/url-parser": "3.290.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.290.0", - "@aws-sdk/util-defaults-mode-node": "3.290.0", - "@aws-sdk/util-endpoints": "3.290.0", - "@aws-sdk/util-retry": "3.290.0", - "@aws-sdk/util-user-agent-browser": "3.290.0", - "@aws-sdk/util-user-agent-node": "3.290.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" + "@aws-sdk/config-resolver": "3.329.0", + "@aws-sdk/fetch-http-handler": "3.329.0", + "@aws-sdk/hash-node": "3.329.0", + "@aws-sdk/invalid-dependency": "3.329.0", + "@aws-sdk/middleware-content-length": "3.329.0", + "@aws-sdk/middleware-endpoint": "3.329.0", + "@aws-sdk/middleware-host-header": "3.329.0", + "@aws-sdk/middleware-logger": "3.329.0", + "@aws-sdk/middleware-recursion-detection": "3.329.0", + "@aws-sdk/middleware-retry": "3.329.0", + "@aws-sdk/middleware-serde": "3.329.0", + "@aws-sdk/middleware-stack": "3.329.0", + "@aws-sdk/middleware-user-agent": "3.332.0", + "@aws-sdk/node-config-provider": "3.329.0", + "@aws-sdk/node-http-handler": "3.329.0", + "@aws-sdk/protocol-http": "3.329.0", + "@aws-sdk/smithy-client": "3.329.0", + "@aws-sdk/types": "3.329.0", + "@aws-sdk/url-parser": "3.329.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.329.0", + "@aws-sdk/util-defaults-mode-node": "3.329.0", + "@aws-sdk/util-endpoints": "3.332.0", + "@aws-sdk/util-retry": "3.329.0", + "@aws-sdk/util-user-agent-browser": "3.329.0", + "@aws-sdk/util-user-agent-node": "3.329.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.290.0.tgz", - "integrity": "sha512-E2X/7tZLziKLgi/owYoUL5gcorGJrbM2tANJdJmaqVUPhPvoY4wU8P91pGPKon9nQj0RQexre5ClZawYD6lTzA==", + "version": "3.332.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.332.0.tgz", + "integrity": "sha512-uVobnXIzMcEhwBDyk6iOt36N/TRNI8hwq7MQugjYGj7Inma9g4vnR09hXJ24HxyKCoVUoIgMbEguQ43+/+uvDQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.290.0", - "@aws-sdk/credential-provider-node": "3.290.0", - "@aws-sdk/fetch-http-handler": "3.290.0", - "@aws-sdk/hash-node": "3.290.0", - "@aws-sdk/invalid-dependency": "3.290.0", - "@aws-sdk/middleware-content-length": "3.290.0", - "@aws-sdk/middleware-endpoint": "3.290.0", - "@aws-sdk/middleware-host-header": "3.290.0", - "@aws-sdk/middleware-logger": "3.290.0", - "@aws-sdk/middleware-recursion-detection": "3.290.0", - "@aws-sdk/middleware-retry": "3.290.0", - "@aws-sdk/middleware-sdk-sts": "3.290.0", - "@aws-sdk/middleware-serde": "3.290.0", - "@aws-sdk/middleware-signing": "3.290.0", - "@aws-sdk/middleware-stack": "3.290.0", - "@aws-sdk/middleware-user-agent": "3.290.0", - "@aws-sdk/node-config-provider": "3.290.0", - "@aws-sdk/node-http-handler": "3.290.0", - "@aws-sdk/protocol-http": "3.290.0", - "@aws-sdk/smithy-client": "3.290.0", - "@aws-sdk/types": "3.290.0", - "@aws-sdk/url-parser": "3.290.0", - "@aws-sdk/util-base64": "3.208.0", - "@aws-sdk/util-body-length-browser": "3.188.0", - "@aws-sdk/util-body-length-node": "3.208.0", - "@aws-sdk/util-defaults-mode-browser": "3.290.0", - "@aws-sdk/util-defaults-mode-node": "3.290.0", - "@aws-sdk/util-endpoints": "3.290.0", - "@aws-sdk/util-retry": "3.290.0", - "@aws-sdk/util-user-agent-browser": "3.290.0", - "@aws-sdk/util-user-agent-node": "3.290.0", - "@aws-sdk/util-utf8": "3.254.0", + "@aws-sdk/config-resolver": "3.329.0", + "@aws-sdk/credential-provider-node": "3.332.0", + "@aws-sdk/fetch-http-handler": "3.329.0", + "@aws-sdk/hash-node": "3.329.0", + "@aws-sdk/invalid-dependency": "3.329.0", + "@aws-sdk/middleware-content-length": "3.329.0", + "@aws-sdk/middleware-endpoint": "3.329.0", + "@aws-sdk/middleware-host-header": "3.329.0", + "@aws-sdk/middleware-logger": "3.329.0", + "@aws-sdk/middleware-recursion-detection": "3.329.0", + "@aws-sdk/middleware-retry": "3.329.0", + "@aws-sdk/middleware-sdk-sts": "3.329.0", + "@aws-sdk/middleware-serde": "3.329.0", + "@aws-sdk/middleware-signing": "3.329.0", + "@aws-sdk/middleware-stack": "3.329.0", + "@aws-sdk/middleware-user-agent": "3.332.0", + "@aws-sdk/node-config-provider": "3.329.0", + "@aws-sdk/node-http-handler": "3.329.0", + "@aws-sdk/protocol-http": "3.329.0", + "@aws-sdk/smithy-client": "3.329.0", + "@aws-sdk/types": "3.329.0", + "@aws-sdk/url-parser": "3.329.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-body-length-browser": "3.310.0", + "@aws-sdk/util-body-length-node": "3.310.0", + "@aws-sdk/util-defaults-mode-browser": "3.329.0", + "@aws-sdk/util-defaults-mode-node": "3.329.0", + "@aws-sdk/util-endpoints": "3.332.0", + "@aws-sdk/util-retry": "3.329.0", + "@aws-sdk/util-user-agent-browser": "3.329.0", + "@aws-sdk/util-user-agent-node": "3.329.0", + "@aws-sdk/util-utf8": "3.310.0", "fast-xml-parser": "4.1.2", - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/config-resolver": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.290.0.tgz", - "integrity": "sha512-Ovskri6IR4iBK0+3ttgjPSgOUEC+fd5tqRN5JlPCCZ9VwqwF/z26yYC4fAPaMUAJwPVRFeYYzQoszXGoxPyG7g==", - "dependencies": { - "@aws-sdk/signature-v4": "3.290.0", - "@aws-sdk/types": "3.290.0", - "@aws-sdk/util-config-provider": "3.208.0", - "@aws-sdk/util-middleware": "3.290.0", - "tslib": "^2.3.1" + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.329.0.tgz", + "integrity": "sha512-Oj6eiT3q+Jn685yvUrfRi8PhB3fb81hasJqdrsEivA8IP8qAgnVUTJzXsh8O2UX8UM2MF6A1gTgToSgneJuw2Q==", + "dependencies": { + "@aws-sdk/types": "3.329.0", + "@aws-sdk/util-config-provider": "3.310.0", + "@aws-sdk/util-middleware": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.291.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.291.0.tgz", - "integrity": "sha512-MlosV+2Dh/CAamfN2oV+YFh7/3ZrhrfFxu6Fty3DcwIoVQh4K0Mwt/d2IpFa/+dMk+y56ijtaFKupT5Tk4IpBQ==", + "version": "3.332.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.332.0.tgz", + "integrity": "sha512-FJI936QVSFd49PWOgTlW7e8rKO/6Y8sMnkvTJ/APQ1K8em+jWkaAMFBl15NrpOo/jlZCzhkkQDatDHAlbSUXGw==", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.291.0", - "@aws-sdk/property-provider": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/client-cognito-identity": "3.332.0", + "@aws-sdk/property-provider": "3.329.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.290.0.tgz", - "integrity": "sha512-gWsllElBm4DWZcc42Zb6sxaw77KBf6cY9iEezbVzVbJioqR9hIr1Pq3Nx30z1Q+1KiHSnt/Wl9cYYHOoNw2DnQ==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.329.0.tgz", + "integrity": "sha512-B4orC9hMt9hG82vAR0TAnQqjk6cFDbO2S14RdzUj2n2NPlGWW4Blkv3NTo86K0lq011VRhtqaLcuTwn5EJD5Sg==", "dependencies": { - "@aws-sdk/property-provider": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.329.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-imds": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.290.0.tgz", - "integrity": "sha512-PkYEs7zzUVWnhkR9TlU1ORDcCnkD7qoqR1loXXSZc+EIOX9M7f+sXGLtCXVl9wV1Ekx3a5Tjud+aQcOJjjFePA==", - "dependencies": { - "@aws-sdk/node-config-provider": "3.290.0", - "@aws-sdk/property-provider": "3.290.0", - "@aws-sdk/types": "3.290.0", - "@aws-sdk/url-parser": "3.290.0", - "tslib": "^2.3.1" + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.329.0.tgz", + "integrity": "sha512-ggPlnd7QROPTid0CwT01TYYGvstRRTpzTGsQ/B31wkh30IrRXE81W3S4xrOYuqQD3u0RnflSxnvhs+EayJEYjg==", + "dependencies": { + "@aws-sdk/node-config-provider": "3.329.0", + "@aws-sdk/property-provider": "3.329.0", + "@aws-sdk/types": "3.329.0", + "@aws-sdk/url-parser": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.290.0.tgz", - "integrity": "sha512-n3OGvkvNgMS6Kb2fuFrmNeCI8CP7DGOsEvcfYPMiXsQWx9hHAh/XIv7ksD3TL5Mn8Dr0NHmB6uY5WgUZDatqfw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.290.0", - "@aws-sdk/credential-provider-imds": "3.290.0", - "@aws-sdk/credential-provider-process": "3.290.0", - "@aws-sdk/credential-provider-sso": "3.290.0", - "@aws-sdk/credential-provider-web-identity": "3.290.0", - "@aws-sdk/property-provider": "3.290.0", - "@aws-sdk/shared-ini-file-loader": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "version": "3.332.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.332.0.tgz", + "integrity": "sha512-DTW6d6rcqizPVyvcIrwvxecQ7e5GONtVc5Wyf0RTfqf41sDOVZYmn6G+zEFSpBLW0975uZbJS0lyLWtJe2VujQ==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.329.0", + "@aws-sdk/credential-provider-imds": "3.329.0", + "@aws-sdk/credential-provider-process": "3.329.0", + "@aws-sdk/credential-provider-sso": "3.332.0", + "@aws-sdk/credential-provider-web-identity": "3.329.0", + "@aws-sdk/property-provider": "3.329.0", + "@aws-sdk/shared-ini-file-loader": "3.329.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.290.0.tgz", - "integrity": "sha512-snLmeD7yAYq1x7lngCTM1VGmHYCZ4iUW5JRG9XPr7Npl7VWVdnNqaf5XBYEANgaFoWxjN3dNyDPg05+5Ew6QCA==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.290.0", - "@aws-sdk/credential-provider-imds": "3.290.0", - "@aws-sdk/credential-provider-ini": "3.290.0", - "@aws-sdk/credential-provider-process": "3.290.0", - "@aws-sdk/credential-provider-sso": "3.290.0", - "@aws-sdk/credential-provider-web-identity": "3.290.0", - "@aws-sdk/property-provider": "3.290.0", - "@aws-sdk/shared-ini-file-loader": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "version": "3.332.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.332.0.tgz", + "integrity": "sha512-KkBayS9k4WyJTvC86ngeRM+RmWxNCS1BHvudkR6PLXfnsNPDzxySDVY0UgxVhbNYDYsO561fXZt9ccpKyVWjgg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.329.0", + "@aws-sdk/credential-provider-imds": "3.329.0", + "@aws-sdk/credential-provider-ini": "3.332.0", + "@aws-sdk/credential-provider-process": "3.329.0", + "@aws-sdk/credential-provider-sso": "3.332.0", + "@aws-sdk/credential-provider-web-identity": "3.329.0", + "@aws-sdk/property-provider": "3.329.0", + "@aws-sdk/shared-ini-file-loader": "3.329.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.290.0.tgz", - "integrity": "sha512-PNnWDYSaE8dMepH59cyrXs45Ucdmzdnyuhcn/fVwQ0Nc7FzESxw1G7SgJZhYF4tMRDiepu6lbFEN0QXsTIM8Iw==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.329.0.tgz", + "integrity": "sha512-5oO220qoFc2pMdZDQa6XN/mVhp669I3+LqMbbscGtX/UgLJPSOb7YzPld9Wjv12L5rf+sD3G1PF3LZXO0vKLFA==", "dependencies": { - "@aws-sdk/property-provider": "3.290.0", - "@aws-sdk/shared-ini-file-loader": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.329.0", + "@aws-sdk/shared-ini-file-loader": "3.329.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.290.0.tgz", - "integrity": "sha512-tX5Ez3EiMrXDx6Vsn2gMq7ga3y4iyPneenCNToRUlmZrhF61DhMfA22gRwdwuP8hlFKXY4LRg51pBfJeq0ga8w==", - "dependencies": { - "@aws-sdk/client-sso": "3.290.0", - "@aws-sdk/property-provider": "3.290.0", - "@aws-sdk/shared-ini-file-loader": "3.290.0", - "@aws-sdk/token-providers": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "version": "3.332.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.332.0.tgz", + "integrity": "sha512-SaKXl48af3n6LRitcaEqbeg1YDXwQ0A5QziC1xQyYPraEIj3IZ/GyTjx04Lo2jxNYHuEOE8u4aTw1+IK1GDKbg==", + "dependencies": { + "@aws-sdk/client-sso": "3.332.0", + "@aws-sdk/property-provider": "3.329.0", + "@aws-sdk/shared-ini-file-loader": "3.329.0", + "@aws-sdk/token-providers": "3.332.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.290.0.tgz", - "integrity": "sha512-Apv6AnYtb5LTUreDVsqlXFNgiU0TQAZ8sfPg23pGrBGZvZU3KfDhF9n5j0i9Uca44O+/vB7UvbbvNAZS200vsQ==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.329.0.tgz", + "integrity": "sha512-lcEibZD7AlutCacpQ6DyNUqElZJDq+ylaIo5a8MH9jGh7Pg2WpDg0Sy+B6FbGCkVn4eIjdHxeX54JM245nhESg==", "dependencies": { - "@aws-sdk/property-provider": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.329.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.291.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.291.0.tgz", - "integrity": "sha512-odTsJEHPzEnm9CtydfZda0K0mvtM9tOkAXIPtRPug2UL1kudL4j4QsJ5WhjOJV/g140n471W+0eVZ0R6vIgFAg==", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.291.0", - "@aws-sdk/client-sso": "3.290.0", - "@aws-sdk/client-sts": "3.290.0", - "@aws-sdk/credential-provider-cognito-identity": "3.291.0", - "@aws-sdk/credential-provider-env": "3.290.0", - "@aws-sdk/credential-provider-imds": "3.290.0", - "@aws-sdk/credential-provider-ini": "3.290.0", - "@aws-sdk/credential-provider-node": "3.290.0", - "@aws-sdk/credential-provider-process": "3.290.0", - "@aws-sdk/credential-provider-sso": "3.290.0", - "@aws-sdk/credential-provider-web-identity": "3.290.0", - "@aws-sdk/property-provider": "3.290.0", - "@aws-sdk/shared-ini-file-loader": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "version": "3.332.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.332.0.tgz", + "integrity": "sha512-UZM8hCJqBBI4yEopVnfQ7HgUCuiYuWJziPFovQpbwvZKadibzo332/n6e5IsQbJxPjymqFLgTn3PQds/+1FOlQ==", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.332.0", + "@aws-sdk/client-sso": "3.332.0", + "@aws-sdk/client-sts": "3.332.0", + "@aws-sdk/credential-provider-cognito-identity": "3.332.0", + "@aws-sdk/credential-provider-env": "3.329.0", + "@aws-sdk/credential-provider-imds": "3.329.0", + "@aws-sdk/credential-provider-ini": "3.332.0", + "@aws-sdk/credential-provider-node": "3.332.0", + "@aws-sdk/credential-provider-process": "3.329.0", + "@aws-sdk/credential-provider-sso": "3.332.0", + "@aws-sdk/credential-provider-web-identity": "3.329.0", + "@aws-sdk/property-provider": "3.329.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/fetch-http-handler": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.290.0.tgz", - "integrity": "sha512-hehbIxcqyJeiUBTbbP3C4tmY2p9UIh7bnLTKhocqaUcdEXQwlIRiQlnnA+TrQ5Uyoe+W3fAmv25tq08rB9ddhw==", - "dependencies": { - "@aws-sdk/protocol-http": "3.290.0", - "@aws-sdk/querystring-builder": "3.290.0", - "@aws-sdk/types": "3.290.0", - "@aws-sdk/util-base64": "3.208.0", - "tslib": "^2.3.1" + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.329.0.tgz", + "integrity": "sha512-9jfIeJhYCcTX4ScXOueRTB3S/tVce0bRsKxKDP0PnTxnGYOwKXoM9lAPmiYItzYmQ/+QzjTI8xfkA9Usz2SK/Q==", + "dependencies": { + "@aws-sdk/protocol-http": "3.329.0", + "@aws-sdk/querystring-builder": "3.329.0", + "@aws-sdk/types": "3.329.0", + "@aws-sdk/util-base64": "3.310.0", + "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/hash-node": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.290.0.tgz", - "integrity": "sha512-ayqJBOPoMa3H3eUhZHPu9ikNjoydu3nxj+R6tp8nMrKfFYDUu0XCdkpB0Wk/EBpMyWA2ZeyyfgXEUtQkqkAWBA==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.329.0.tgz", + "integrity": "sha512-6RmnWXNWpi7yAs0oRDQlkMn2wfXOStr/8kTCgiAiqrk1KopGSBkC2veKiKRSfv02FTd1yV/ISqYNIRqW1VLyxg==", "dependencies": { - "@aws-sdk/types": "3.290.0", - "@aws-sdk/util-buffer-from": "3.208.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.329.0", + "@aws-sdk/util-buffer-from": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/invalid-dependency": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.290.0.tgz", - "integrity": "sha512-plJpEJ+PPTrpaMfg5KKsAfdXUi6iUZTc/PgP0/CPqCe3kuiWb1xb2GeTxOL5InzfBffVdHWeTanYu9+V0MIxVw==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.329.0.tgz", + "integrity": "sha512-UXynGusDxN/HxLma5ByJ7u+XnuMd47NbHOjJgYsaAjb1CVZT7hEPXOB+mcZ+Ku7To5SCOKu2QbRn7m4bGespBg==", "dependencies": { - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/is-array-buffer": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz", - "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.310.0.tgz", + "integrity": "sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-content-length": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.290.0.tgz", - "integrity": "sha512-9I+vnGSe/S0U98ZRCbOAdQngYfO7kYvXb5gjjX08XUQDfbB+ooIM1VdKngHhzUCTAs48z/43PzpBCjGJvGjB9w==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.329.0.tgz", + "integrity": "sha512-7kCd+CvY/4KbyXB0uyL7jCwPjMi2yERMALFdEH9dsUciwmxIQT6eSc4aF6wImC4UrbafaqmXvvHErABKMVBTKA==", "dependencies": { - "@aws-sdk/protocol-http": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.329.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-endpoint": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.290.0.tgz", - "integrity": "sha512-A7wIujIHHoQaQaqjlRynqoZ3S4S8ExYDReXUBwf4Dzx0wZ5A50owLMY9MKFyd9uukirZs8mDnPPYZuwUI4wR7w==", - "dependencies": { - "@aws-sdk/middleware-serde": "3.290.0", - "@aws-sdk/protocol-http": "3.290.0", - "@aws-sdk/signature-v4": "3.290.0", - "@aws-sdk/types": "3.290.0", - "@aws-sdk/url-parser": "3.290.0", - "@aws-sdk/util-config-provider": "3.208.0", - "@aws-sdk/util-middleware": "3.290.0", - "tslib": "^2.3.1" + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.329.0.tgz", + "integrity": "sha512-hdJRoNdCM0BT4W+rrtee+kfFRgGPGXQDgtbIQlf/FuuuYz2sdef7/SYWr0mxuncnVBW5WkYSPP8h6q07whSKbg==", + "dependencies": { + "@aws-sdk/middleware-serde": "3.329.0", + "@aws-sdk/types": "3.329.0", + "@aws-sdk/url-parser": "3.329.0", + "@aws-sdk/util-middleware": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.290.0.tgz", - "integrity": "sha512-j1ss8pjSJyG0aB+X0VPYgTfoieB8m5c+PrWw85JRM/qgbQeurkyD3d/F00V1hkZI42gygOaPlmYMik3kQnmITw==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.329.0.tgz", + "integrity": "sha512-JrHeUdTIpTCfXDo9JpbAbZTS1x4mt63CCytJRq0mpWp+FlP9hjckBcNxWdR/wSKEzP9pDRnTri638BOwWH7O8w==", "dependencies": { - "@aws-sdk/protocol-http": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.329.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.290.0.tgz", - "integrity": "sha512-wJOK31t/Y/Km6B5ULF/k2RmQB/6MXSN/hMuCiYsLMapFT+86mBlY8cXytYXtLS8afRKpuNy29EY+O6ovfjz6Ig==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.329.0.tgz", + "integrity": "sha512-lKeeTXsYC1NiwmxrXsZepcwNXPoQxTNNbeD1qaCELPGK2cJlrGoeAP2YRWzpwO2kNZWrDLaGAPT/EUEhqw+d1w==", "dependencies": { - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.290.0.tgz", - "integrity": "sha512-m8Y7SE3NfVTyGubiRhueyHF7uqC5dCbD1bSLgVjvrSjO2yEL0Dv9QR1ad7a+p5ilS+Fq3RnOu1VeujfTHy0qRQ==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.329.0.tgz", + "integrity": "sha512-0/TYOJwrj1Z8s+Y7thibD23hggBq/K/01NwPk32CwWG/G+1vWozs5DefknEl++w0vuV+39pkY4KHI8m/+wOCpg==", "dependencies": { - "@aws-sdk/protocol-http": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.329.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-retry": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.290.0.tgz", - "integrity": "sha512-mvXvYd/3L/f5ZcnFI1Q2hwk0OtzKMmkDfWW1BcoVzK0XHf2aeehbs7xgI92ICEi/5Ali0IG5krv5LqfgO154Sw==", - "dependencies": { - "@aws-sdk/protocol-http": "3.290.0", - "@aws-sdk/service-error-classification": "3.290.0", - "@aws-sdk/types": "3.290.0", - "@aws-sdk/util-middleware": "3.290.0", - "@aws-sdk/util-retry": "3.290.0", - "tslib": "^2.3.1", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.329.0.tgz", + "integrity": "sha512-cB3D7GlhHUcHGOlygOYxD9cPhwsTYEAMcohK38An8+RHNp6VQEWezzLFCmHVKUSeCQ+wkjZfPA40jOG0rbjSgQ==", + "dependencies": { + "@aws-sdk/protocol-http": "3.329.0", + "@aws-sdk/service-error-classification": "3.329.0", + "@aws-sdk/types": "3.329.0", + "@aws-sdk/util-middleware": "3.329.0", + "@aws-sdk/util-retry": "3.329.0", + "tslib": "^2.5.0", "uuid": "^8.3.2" }, "engines": { @@ -919,407 +965,405 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.290.0.tgz", - "integrity": "sha512-NaYnDhFtmz/e9jNBNeY10A4AldCvjF46ZfeIWoBUsk/4qDlSP9kaCjTufEjNf/zMTtYzGiP/FUtLS7T6tfXdoQ==", - "dependencies": { - "@aws-sdk/middleware-signing": "3.290.0", - "@aws-sdk/property-provider": "3.290.0", - "@aws-sdk/protocol-http": "3.290.0", - "@aws-sdk/signature-v4": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.329.0.tgz", + "integrity": "sha512-bqtZuhkH8pANb2Gb4FEM1p27o+BoDBmVhEWm8sWH+APsyOor3jc6eUG2GxkfoO6D5tGNIuyCC/GuvW9XDIe4Kg==", + "dependencies": { + "@aws-sdk/middleware-signing": "3.329.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-serde": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.290.0.tgz", - "integrity": "sha512-lZCKlfJzosi3cVx02RKRTVvbAijHTfd16EiSyKRsQOF2rCu7Qt4LzygIlqUonCeHG6eSqOMMf7LAJ22IHafBbw==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.329.0.tgz", + "integrity": "sha512-tvM9NdPuRPCozPjTGNOeYZeLlyx3BcEyajrkRorCRf1YzG/mXdB6I1stote7i4q1doFtYTz0sYL8bqW3LUPn9A==", "dependencies": { - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.290.0.tgz", - "integrity": "sha512-mEJZQrbXkOTI+BdFlpAd1CleVJL8B7qayANMNj9nrZqvZ7HzVDLEkNaJqFz9JFizYTfZC2ZjtATPrSiYDvFEfg==", - "dependencies": { - "@aws-sdk/property-provider": "3.290.0", - "@aws-sdk/protocol-http": "3.290.0", - "@aws-sdk/signature-v4": "3.290.0", - "@aws-sdk/types": "3.290.0", - "@aws-sdk/util-middleware": "3.290.0", - "tslib": "^2.3.1" + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.329.0.tgz", + "integrity": "sha512-bL1nI+EUcF5B1ipwDXxiKL+Uw02Mbt/TNX54PbzunBGZIyO6DZG/H+M3U296bYbvPlwlZhp26O830g6K7VEWsA==", + "dependencies": { + "@aws-sdk/property-provider": "3.329.0", + "@aws-sdk/protocol-http": "3.329.0", + "@aws-sdk/signature-v4": "3.329.0", + "@aws-sdk/types": "3.329.0", + "@aws-sdk/util-middleware": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-stack": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.290.0.tgz", - "integrity": "sha512-25iC/7oAokRfxixGkDjBSIAkNwtx2kcO+xMoDczFus9UrlOr2pBY0IXbPn6bB56q2zwsBTHcmMTn0H7FJSIQmw==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.329.0.tgz", + "integrity": "sha512-2huFLhJ45td2nuiIOjpc9JKJbFNn5CYmw9U8YDITTcydpteRN62CzCpeqroDvF89VOLWxh0ZFtuLCGUr7liSWQ==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.290.0.tgz", - "integrity": "sha512-ZR49PPra3LtqZBmXAtV8YrUSrkVG0hPBICE8cma/wMwbKGHa0G+Xu4pOZP0oQXs5XeGu1cs/Nx3AOJ2fgaMjhQ==", + "version": "3.332.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.332.0.tgz", + "integrity": "sha512-rSL1xP4QmcMOsunN1p5ZDR9GT3vvoSCnYa4iPvMSjP8Jx7l4ff/aVctwfZkMs/up12+68Jqwj4TvtaCvCFXdUA==", "dependencies": { - "@aws-sdk/protocol-http": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.329.0", + "@aws-sdk/types": "3.329.0", + "@aws-sdk/util-endpoints": "3.332.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/node-config-provider": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.290.0.tgz", - "integrity": "sha512-dQLnyCy5iT7Q5Ot2JOciNH9WkaixWwmEnvW6nBa6febzAYZVy78sfJOOP1EZ7ClG1aIhrsAN7/7wPebpn/Peiw==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.329.0.tgz", + "integrity": "sha512-hg9rGNlkzh8aeR/sQbijrkFx2BIO53j4Z6qDxPNWwSGpl05jri1VHxHx2HZMwgbY6Zy/DSguETN/BL8vdFqyLg==", "dependencies": { - "@aws-sdk/property-provider": "3.290.0", - "@aws-sdk/shared-ini-file-loader": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.329.0", + "@aws-sdk/shared-ini-file-loader": "3.329.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/node-http-handler": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.290.0.tgz", - "integrity": "sha512-HfzuzdpAJpO/ob9DQ3aEB/WmPCS5vZOic9T4TtSCmRd5e3+xdMtK/MQUizp8XkbUGBat7jPmcV13Gy4YmwfAuw==", - "dependencies": { - "@aws-sdk/abort-controller": "3.290.0", - "@aws-sdk/protocol-http": "3.290.0", - "@aws-sdk/querystring-builder": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.329.0.tgz", + "integrity": "sha512-OrjaHjU2ZTPfoHa5DruRvTIbeHH/cc0wvh4ml+FwDpWaPaBpOhLiluhZ3anqX1l5QjrXNiQnL8FxSM5OV/zVCA==", + "dependencies": { + "@aws-sdk/abort-controller": "3.329.0", + "@aws-sdk/protocol-http": "3.329.0", + "@aws-sdk/querystring-builder": "3.329.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/property-provider": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.290.0.tgz", - "integrity": "sha512-2Zrh6/KecmiZ/cKVaeDtHRAfyOnAEfwJsgxfFugs3RxjJtYr0AbYJTF+mYp3f8Xc7DCjdxR055axo9TCTBSrwg==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.329.0.tgz", + "integrity": "sha512-1cHLTV6yyMGaMSWWDW/p4vTkJ1cc5BOEO+A0eHuAcoSOk+LDe9IKhUG3/ZOvvYKQYcqIj5jjGSni/noXNCl/qw==", "dependencies": { - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/protocol-http": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.290.0.tgz", - "integrity": "sha512-3VHbfmo7vaA/0ugJedjwyK85MT+OKQanz7ktUnAONH5KdG2/gPpa9ZSTyfK9kCVFin93YzC3pznZgr6oNYgGgg==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.329.0.tgz", + "integrity": "sha512-0rLEHY6QTHTUUcVxzGbPUSmCKlXWplxT/fcYRh0bcc5MBK4naKfcQft1O6Ajp8uqs/9YPZ7XCVCn90pDeJfeaw==", "dependencies": { - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/querystring-builder": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.290.0.tgz", - "integrity": "sha512-7q8x8ux1RCUxUolqxsXfSbCObyMzvSwfJb9GgZ8rDi2U61l8W760a9ejHzizfQJvdldRSwFqmynkRAqYbvKixg==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.329.0.tgz", + "integrity": "sha512-UWgMKkS5trliaDJG4nPv3onu8Y0aBuwRo7RdIgggguOiU8pU6pq1I113nH2FBNWy+Me1bwf+bcviJh0pCo6bEg==", "dependencies": { - "@aws-sdk/types": "3.290.0", - "@aws-sdk/util-uri-escape": "3.201.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.329.0", + "@aws-sdk/util-uri-escape": "3.310.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/querystring-parser": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.290.0.tgz", - "integrity": "sha512-8QPDihJKSFYFphxUl5+FfXMQowhAoHuDeoqd1ce3byL0bm7k8emcGfiYD6QGxuDlpno+F4O1/Mz+e+cwNCdPVA==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.329.0.tgz", + "integrity": "sha512-9mkK+FB7snJ2G7H3CqtprDwYIRhzm6jEezffCwUWrC+lbqHBbErbhE9IeU/MKxILmf0RbC2riXEY1MHGspjRrQ==", "dependencies": { - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/service-error-classification": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.290.0.tgz", - "integrity": "sha512-QP+QgL5Gm6RKl4KGwTRyG1kw0SxBbcmp/a/yhywVHmRI0/+4VsL+cooTqtjFr3xVmKoCX+/JZZ8P96VGFvRSZA==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.329.0.tgz", + "integrity": "sha512-TSNr0flOcCLe71aPp7MjblKNGsmxpTU4xR5772MDX9Cz9GUTNZCPFtvrcqd+wzEPP/AC7XwNXe8KjoXooZImUQ==", "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/shared-ini-file-loader": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.290.0.tgz", - "integrity": "sha512-kvLW5rwr4lwHdwkYnoHYpFVfWwZYwQO44eRnkrDnyvvhZTcCH3rBLApu6uvomnL+Ep4bEJ1anDKt3WywlGg5Qw==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.329.0.tgz", + "integrity": "sha512-e0hyd75fbjMd4aCoRwpP2/HR+0oScwogErVArIkq3F42c/hyNCQP3sph4JImuXIjuo6HNnpKpf20CEPPhNna8A==", "dependencies": { - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/signature-v4": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.290.0.tgz", - "integrity": "sha512-SUMflc8b8PC0ITV3AdYBSlTcn4oFjumBAPNNXBLKIpifQ1l7ZufFIulDPlqeouXTDwsuCVINAwE0DbItDe/7Qw==", - "dependencies": { - "@aws-sdk/is-array-buffer": "3.201.0", - "@aws-sdk/types": "3.290.0", - "@aws-sdk/util-hex-encoding": "3.201.0", - "@aws-sdk/util-middleware": "3.290.0", - "@aws-sdk/util-uri-escape": "3.201.0", - "@aws-sdk/util-utf8": "3.254.0", - "tslib": "^2.3.1" + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.329.0.tgz", + "integrity": "sha512-9EnLoyOD5nFtCRAp+QRllDgQASCfY7jLHVhwht7jzwE80wE65Z9Ym5Z/mwTd4IyTz/xXfCvcE2VwClsBt0Ybdw==", + "dependencies": { + "@aws-sdk/is-array-buffer": "3.310.0", + "@aws-sdk/types": "3.329.0", + "@aws-sdk/util-hex-encoding": "3.310.0", + "@aws-sdk/util-middleware": "3.329.0", + "@aws-sdk/util-uri-escape": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/smithy-client": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.290.0.tgz", - "integrity": "sha512-MDa+BJqM1FP2HYugVAscufoLJuapEdUTZPoyERVGfUEznKfKH33QXRoeqW1wzUNyhcxFONHLnXp1aYFBtnLx7g==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.329.0.tgz", + "integrity": "sha512-7E0fGpBKxwFqHHAOqNbgNsHSEmCZLuvmU9yvG9DXKVzrS4P48O/PfOro123WpcFZs3STyOVgH8wjUPftHAVKmg==", "dependencies": { - "@aws-sdk/middleware-stack": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-stack": "3.329.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.290.0.tgz", - "integrity": "sha512-fc5y8WH7RVwoaUaEdK3cRanxgHShZKAPZ0rCtHjoLURF8IjZIrn3AaZqV8YTgAAmIKNVC+argpj1G+suqXEB/Q==", - "dependencies": { - "@aws-sdk/client-sso-oidc": "3.290.0", - "@aws-sdk/property-provider": "3.290.0", - "@aws-sdk/shared-ini-file-loader": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "version": "3.332.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.332.0.tgz", + "integrity": "sha512-fccbg6OSl0l658pxl2p1MoU9gEePo5B361+JNaN0zfRMu7c5HBXCpdl4djlFxAHjltrX9f1+BKqfGHYgI3h8SQ==", + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.332.0", + "@aws-sdk/property-provider": "3.329.0", + "@aws-sdk/shared-ini-file-loader": "3.329.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/types": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.290.0.tgz", - "integrity": "sha512-uQLD9tLv8Q87CwrSB/taUoQ8wkGeFb1Gygc+kt5oClfMFP9HYzu944kW/1R7/J5LtBLT1QFYccd4gz6eOUNlsw==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.329.0.tgz", + "integrity": "sha512-wFBW4yciDfzQBSFmWNaEvHShnSGLMxSu9Lls6EUf6xDMavxSB36bsrVRX6CyAo/W0NeIIyEOW1LclGPgJV1okg==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/url-parser": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.290.0.tgz", - "integrity": "sha512-19EAlyH4LyNMbAROE6KSuhFKhOwl67kciDavPjS8gFiHr6slon3oqXfz10+uzKf/pJKuY6qOpkUb9h7LnF4bFQ==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.329.0.tgz", + "integrity": "sha512-/VcfL7vNJKJGSjYYHVQF3bYCDFs4fSzB7j5qeVDwRdWr870gE7O1Dar+sLWBRKFF3AX+4VzplqzUfpu9t44JVA==", "dependencies": { - "@aws-sdk/querystring-parser": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/querystring-parser": "3.329.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-base64": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz", - "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.310.0.tgz", + "integrity": "sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg==", "dependencies": { - "@aws-sdk/util-buffer-from": "3.208.0", - "tslib": "^2.3.1" + "@aws-sdk/util-buffer-from": "3.310.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-body-length-browser": { - "version": "3.188.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz", - "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.310.0.tgz", + "integrity": "sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-body-length-node": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz", - "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.310.0.tgz", + "integrity": "sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-buffer-from": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz", - "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.310.0.tgz", + "integrity": "sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw==", "dependencies": { - "@aws-sdk/is-array-buffer": "3.201.0", - "tslib": "^2.3.1" + "@aws-sdk/is-array-buffer": "3.310.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-config-provider": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz", - "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.310.0.tgz", + "integrity": "sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-defaults-mode-browser": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.290.0.tgz", - "integrity": "sha512-8Mt6/OA465uw1wSA/LCCd+6IjeIUTAbg2GiqfSBCBMNJNuqPwPXuWVjg6kBd1eEChyEtAuoLTygMefaBywg4HQ==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.329.0.tgz", + "integrity": "sha512-2iSiy/pzX3OXMhtSxtAzOiEFr3viQEFnYOTeZuiheuyS+cea2L79F6SlZ1110b/nOIU/UOrxxtz83HVad8YFMQ==", "dependencies": { - "@aws-sdk/property-provider": "3.290.0", - "@aws-sdk/types": "3.290.0", + "@aws-sdk/property-provider": "3.329.0", + "@aws-sdk/types": "3.329.0", "bowser": "^2.11.0", - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">= 10.0.0" } }, "node_modules/@aws-sdk/util-defaults-mode-node": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.290.0.tgz", - "integrity": "sha512-9c0jS7w1aZxfKkFXlTjp80QaKYKnutMmlsfP+/YXN9+s3yvwFcnsENMTNg5YVvkZa9e+Rhw/ySxVKTEJ7n/SOA==", - "dependencies": { - "@aws-sdk/config-resolver": "3.290.0", - "@aws-sdk/credential-provider-imds": "3.290.0", - "@aws-sdk/node-config-provider": "3.290.0", - "@aws-sdk/property-provider": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.329.0.tgz", + "integrity": "sha512-7A6C7YKjkZtmKtH29isYEtOCbhd7IcXPP8lftN8WAWlLOiZE4gV7PHveagUj7QserJzgRKGwwTQbBj53n18HYg==", + "dependencies": { + "@aws-sdk/config-resolver": "3.329.0", + "@aws-sdk/credential-provider-imds": "3.329.0", + "@aws-sdk/node-config-provider": "3.329.0", + "@aws-sdk/property-provider": "3.329.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">= 10.0.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.290.0.tgz", - "integrity": "sha512-nDdSyWdxYEPE84qABQKasIFhm6oWjhiyM92g8zsHTqzrn67a4caA72FTL6cztgJOEd5GWvHn6r1BnRVhkG68Qw==", + "version": "3.332.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.332.0.tgz", + "integrity": "sha512-nQx7AiOroMU2hj6h+umWOSZ+WECwxupaxFUK/PPKGW6NY/VdQE6LluYnXOtF5awlr8w1nPksT0Lq05PZutMDLA==", "dependencies": { - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-hex-encoding": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz", - "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.310.0.tgz", + "integrity": "sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.208.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz", - "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-middleware": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.290.0.tgz", - "integrity": "sha512-lXGM9YSqwZgCeEPltc++jiGyZ/FLuh62IjrWSIVSL/FvkL6D8KSKNBd7Ab/KDDu5jt4iP5UZ4k3SGVk6monUZg==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.329.0.tgz", + "integrity": "sha512-RhBOBaxzkTUghi4MSqr8S5qeeBCjgJ0XPJ6jIYkVkj1saCmqkuZCgl3zFaYdyhdxxPV6nflkFer+1HUoqT+Fqw==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-retry": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.290.0.tgz", - "integrity": "sha512-UjyUEguu2upaBvDJkeSUQPE4ryBTA7JhPyl6M7XA6rFSRtU5+1NI8KknSNw46buviNit0Yu0E6TzxNQyS70hKA==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.329.0.tgz", + "integrity": "sha512-+3VQ9HZLinysnmryUs9Xjt1YVh4TYYHLt30ilu4iUnIHFQoamdzIbRCWseSVFPCxGroen9M9qmAleAsytHEKuA==", "dependencies": { - "@aws-sdk/service-error-classification": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/service-error-classification": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@aws-sdk/util-uri-escape": { - "version": "3.201.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz", - "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.310.0.tgz", + "integrity": "sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.290.0.tgz", - "integrity": "sha512-I+B5ooKRYQ9jHcdg7TOf20LlTfcBUlCJQ2AAqI1ukmJqal22OD1CtC1E+/XbplpU5mxRs4s2UQbxNaPA0yIrBA==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.329.0.tgz", + "integrity": "sha512-8hLSmMCl8aw2++0Zuba8ELq8FkK6/VNyx470St201IpMn2GMbQMDl/rLolRKiTgji6wc+T3pOTidkJkz8/cIXA==", "dependencies": { - "@aws-sdk/types": "3.290.0", + "@aws-sdk/types": "3.329.0", "bowser": "^2.11.0", - "tslib": "^2.3.1" + "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.290.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.290.0.tgz", - "integrity": "sha512-7juKgEMqpa0il6jZmiBKGDJslM4UIKX1bvhlqkSvvPfV3zFdfi0V2xavh68GfelWduBBkYLGRjsLunqzw64f8A==", + "version": "3.329.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.329.0.tgz", + "integrity": "sha512-C50Zaeodc0+psEP+L4WpElrH8epuLWJPVN4hDOTORcM0cSoU2o025Ost9mbcU7UdoHNxF9vitLnzORGN9SHolg==", "dependencies": { - "@aws-sdk/node-config-provider": "3.290.0", - "@aws-sdk/types": "3.290.0", - "tslib": "^2.3.1" + "@aws-sdk/node-config-provider": "3.329.0", + "@aws-sdk/types": "3.329.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" @@ -1334,12 +1378,12 @@ } }, "node_modules/@aws-sdk/util-utf8": { - "version": "3.254.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz", - "integrity": "sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw==", + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.310.0.tgz", + "integrity": "sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA==", "dependencies": { - "@aws-sdk/util-buffer-from": "3.208.0", - "tslib": "^2.3.1" + "@aws-sdk/util-buffer-from": "3.310.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" @@ -1354,9 +1398,9 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dependencies": { "@babel/highlight": "^7.18.6" }, @@ -1365,28 +1409,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "version": "7.21.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", + "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", - "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", + "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.3", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helpers": "^7.21.5", + "@babel/parser": "^7.21.8", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.3", - "@babel/types": "^7.21.3", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -1415,11 +1459,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", + "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", "dependencies": { - "@babel/types": "^7.21.3", + "@babel/types": "^7.21.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -1428,26 +1472,13 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", + "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", + "@babel/compat-data": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" @@ -1492,9 +1523,9 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", + "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", "engines": { "node": ">=6.9.0" } @@ -1523,48 +1554,48 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.21.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1582,9 +1613,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", "engines": { "node": ">=6.9.0" } @@ -1606,13 +1637,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", "dependencies": { "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1696,9 +1727,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", + "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1767,12 +1798,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", + "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1869,12 +1900,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", + "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -1884,11 +1915,11 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.0.tgz", - "integrity": "sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz", + "integrity": "sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==", "dependencies": { - "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-module-imports": "^7.21.4", "@babel/helper-plugin-utils": "^7.20.2", "babel-plugin-polyfill-corejs2": "^0.3.3", "babel-plugin-polyfill-corejs3": "^0.6.0", @@ -1911,9 +1942,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -1935,18 +1966,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", + "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-environment-visitor": "^7.18.9", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1963,11 +1994,11 @@ } }, "node_modules/@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-string-parser": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, @@ -1989,6 +2020,10 @@ "resolved": "common/data", "link": true }, + "node_modules/@casimir/dkg": { + "resolved": "services/dkg", + "link": true + }, "node_modules/@casimir/ethereum": { "resolved": "contracts/ethereum", "link": true @@ -1997,18 +2032,10 @@ "resolved": "common/helpers", "link": true }, - "node_modules/@casimir/keys": { - "resolved": "services/keys", - "link": true - }, "node_modules/@casimir/landing": { "resolved": "apps/landing", "link": true }, - "node_modules/@casimir/oracle": { - "resolved": "services/oracle", - "link": true - }, "node_modules/@casimir/speculos": { "resolved": "common/speculos", "link": true @@ -2045,6 +2072,32 @@ "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.3.3.tgz", "integrity": "sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g==" }, + "node_modules/@chainsafe/as-sha256": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", + "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==", + "dev": true + }, + "node_modules/@chainsafe/persistent-merkle-tree": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", + "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", + "dev": true, + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1" + } + }, + "node_modules/@chainsafe/ssz": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", + "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", + "dev": true, + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1", + "@chainsafe/persistent-merkle-tree": "^0.4.2", + "case": "^1.6.3" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -2136,9 +2189,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.11.tgz", - "integrity": "sha512-QnK4d/zhVTuV4/pRM4HUjcsbl43POALU2zvBynmrrqZt9LPcLA3x1fTZPBg2RRguBQnJcnU059yKr+bydkntjg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", "cpu": [ "arm64" ], @@ -2152,9 +2205,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.11.tgz", - "integrity": "sha512-3PL3HKtsDIXGQcSCKtWD/dy+mgc4p2Tvo2qKgKHj9Yf+eniwFnuoQ0OUhlSfAEpKAFzF9N21Nwgnap6zy3L3MQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", "cpu": [ "x64" ], @@ -2168,9 +2221,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.11.tgz", - "integrity": "sha512-pJ950bNKgzhkGNO3Z9TeHzIFtEyC2GDQL3wxkMApDEghYx5Qers84UTNc1bAxWbRkuJOgmOha5V0WUeh8G+YGw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", "cpu": [ "arm64" ], @@ -2184,9 +2237,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.11.tgz", - "integrity": "sha512-iB0dQkIHXyczK3BZtzw1tqegf0F0Ab5texX2TvMQjiJIWXAfM4FQl7D909YfXWnB92OQz4ivBYQ2RlxBJrMJOw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", "cpu": [ "x64" ], @@ -2200,9 +2253,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.11.tgz", - "integrity": "sha512-7EFzUADmI1jCHeDRGKgbnF5sDIceZsQGapoO6dmw7r/ZBEKX7CCDnIz8m9yEclzr7mFsd+DyasHzpjfJnmBB1Q==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", "cpu": [ "arm64" ], @@ -2216,9 +2269,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.11.tgz", - "integrity": "sha512-iPgenptC8i8pdvkHQvXJFzc1eVMR7W2lBPrTE6GbhR54sLcF42mk3zBOjKPOodezzuAz/KSu8CPyFSjcBMkE9g==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", "cpu": [ "x64" ], @@ -2232,9 +2285,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.11.tgz", - "integrity": "sha512-M9iK/d4lgZH0U5M1R2p2gqhPV/7JPJcRz+8O8GBKVgqndTzydQ7B2XGDbxtbvFkvIs53uXTobOhv+RyaqhUiMg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", "cpu": [ "arm" ], @@ -2248,9 +2301,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.11.tgz", - "integrity": "sha512-Qxth3gsWWGKz2/qG2d5DsW/57SeA2AmpSMhdg9TSB5Svn2KDob3qxfQSkdnWjSd42kqoxIPy3EJFs+6w1+6Qjg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", "cpu": [ "arm64" ], @@ -2264,9 +2317,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.11.tgz", - "integrity": "sha512-dB1nGaVWtUlb/rRDHmuDQhfqazWE0LMro/AIbT2lWM3CDMHJNpLckH+gCddQyhhcLac2OYw69ikUMO34JLt3wA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", "cpu": [ "ia32" ], @@ -2296,9 +2349,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.11.tgz", - "integrity": "sha512-cGeGNdQxqY8qJwlYH1BP6rjIIiEcrM05H7k3tR7WxOLmD1ZxRMd6/QIOWMb8mD2s2YJFNRuNQ+wjMhgEL2oCEw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", "cpu": [ "mips64el" ], @@ -2312,9 +2365,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.11.tgz", - "integrity": "sha512-BdlziJQPW/bNe0E8eYsHB40mYOluS+jULPCjlWiHzDgr+ZBRXPtgMV1nkLEGdpjrwgmtkZHEGEPaKdS/8faLDA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", "cpu": [ "ppc64" ], @@ -2328,9 +2381,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.11.tgz", - "integrity": "sha512-MDLwQbtF+83oJCI1Cixn68Et/ME6gelmhssPebC40RdJaect+IM+l7o/CuG0ZlDs6tZTEIoxUe53H3GmMn8oMA==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", "cpu": [ "riscv64" ], @@ -2344,9 +2397,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.11.tgz", - "integrity": "sha512-4N5EMESvws0Ozr2J94VoUD8HIRi7X0uvUv4c0wpTHZyZY9qpaaN7THjosdiW56irQ4qnJ6Lsc+i+5zGWnyqWqQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", "cpu": [ "s390x" ], @@ -2360,9 +2413,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.11.tgz", - "integrity": "sha512-rM/v8UlluxpytFSmVdbCe1yyKQd/e+FmIJE2oPJvbBo+D0XVWi1y/NQ4iTNx+436WmDHQBjVLrbnAQLQ6U7wlw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", "cpu": [ "x64" ], @@ -2376,9 +2429,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.11.tgz", - "integrity": "sha512-4WaAhuz5f91h3/g43VBGdto1Q+X7VEZfpcWGtOFXnggEuLvjV+cP6DyLRU15IjiU9fKLLk41OoJfBFN5DhPvag==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", "cpu": [ "x64" ], @@ -2392,9 +2445,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.11.tgz", - "integrity": "sha512-UBj135Nx4FpnvtE+C8TWGp98oUgBcmNmdYgl5ToKc0mBHxVVqVE7FUS5/ELMImOp205qDAittL6Ezhasc2Ev/w==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", "cpu": [ "x64" ], @@ -2408,9 +2461,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.11.tgz", - "integrity": "sha512-1/gxTifDC9aXbV2xOfCbOceh5AlIidUrPsMpivgzo8P8zUtczlq1ncFpeN1ZyQJ9lVs2hILy1PG5KPp+w8QPPg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", "cpu": [ "x64" ], @@ -2424,9 +2477,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.11.tgz", - "integrity": "sha512-vtSfyx5yRdpiOW9yp6Ax0zyNOv9HjOAw8WaZg3dF5djEHKKm3UnoohftVvIJtRh0Ec7Hso0RIdTqZvPXJ7FdvQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", "cpu": [ "arm64" ], @@ -2440,9 +2493,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.11.tgz", - "integrity": "sha512-GFPSLEGQr4wHFTiIUJQrnJKZhZjjq4Sphf+mM76nQR6WkQn73vm7IsacmBRPkALfpOCHsopSvLgqdd4iUW2mYw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", "cpu": [ "ia32" ], @@ -2456,9 +2509,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.11.tgz", - "integrity": "sha512-N9vXqLP3eRL8BqSy8yn4Y98cZI2pZ8fyuHx6lKjiG2WABpT2l01TXdzq5Ma2ZUBzfB7tx5dXVhge8X9u0S70ZQ==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", "cpu": [ "x64" ], @@ -2472,9 +2525,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz", - "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" @@ -2487,23 +2540,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", - "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", - "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.0", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -2519,9 +2572,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", - "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", + "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2563,6 +2616,24 @@ "chai": "^4.3.4" } }, + "node_modules/@ethereumjs/common": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", + "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.1" + } + }, + "node_modules/@ethereumjs/tx": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", + "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", + "dependencies": { + "@ethereumjs/common": "^2.5.0", + "ethereumjs-util": "^7.1.2" + } + }, "node_modules/@ethersproject/abi": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", @@ -2862,6 +2933,11 @@ "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==" + }, "node_modules/@ethersproject/keccak256": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", @@ -2988,6 +3064,26 @@ "ws": "7.4.6" } }, + "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==", + "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/@ethersproject/random": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", @@ -3568,26 +3664,6 @@ } } }, - "node_modules/@jest/reporters/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "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/@jest/schemas": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", @@ -3670,6 +3746,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@jest/types": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", @@ -3688,14 +3770,15 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { "node": ">=6.0.0" } }, @@ -3716,19 +3799,24 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, "node_modules/@jspm/core": { "version": "2.0.0-beta.24", "resolved": "https://registry.npmjs.org/@jspm/core/-/core-2.0.0-beta.24.tgz", @@ -3741,19 +3829,19 @@ "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" }, "node_modules/@ledgerhq/cryptoassets": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/cryptoassets/-/cryptoassets-9.0.0.tgz", - "integrity": "sha512-/C8NtrjXPR1O5YmhK2+hq1M8e25Qum2+GGv8G/xOpGKp15Vpbdqgnn8KlnDQJl7kB1eBx/ZrNwXcEJBavRyTPw==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/cryptoassets/-/cryptoassets-9.5.0.tgz", + "integrity": "sha512-xa5GesMmVYz2QlDCjnOgPaUwPzTjUx1tBv2tU8rdk69ep9chyzefPE3e5sO9BgQukcZhFu20oHZ+h7kIgaqALw==", "dependencies": { "invariant": "2" } }, "node_modules/@ledgerhq/devices": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-8.0.0.tgz", - "integrity": "sha512-gSnRT0KPca+LIpaC6D/WZQjOAlSI5uCvK1dmxXtKhODLAj735rX5Z3SnGnLUavRCHNbUi44FzgvloF5BKTkh7A==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@ledgerhq/devices/-/devices-8.0.2.tgz", + "integrity": "sha512-Qnc9hgGae4YNr/4NUU/5l3xGc5fx6t2k1su6ASu4wsV/p49xmaU/iBO6PtFHqb3QCwsrkieXASU932Ac2WTw0g==", "dependencies": { - "@ledgerhq/errors": "^6.12.3", + "@ledgerhq/errors": "^6.12.5", "@ledgerhq/logs": "^6.10.1", "rxjs": "6", "semver": "^7.3.5" @@ -3775,10 +3863,48 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "node_modules/@ledgerhq/domain-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@ledgerhq/domain-service/-/domain-service-1.1.1.tgz", + "integrity": "sha512-OYWebz0mO1s0JE2vTmu+qWrMGgRL0ngAuvs20BJhXujVY2dw7Gpls5o3wvSMUU96eutepT467u57abiHZN7WvQ==", + "dependencies": { + "@ledgerhq/cryptoassets": "^9.5.0", + "@ledgerhq/errors": "^6.12.5", + "@ledgerhq/logs": "^6.10.1", + "@ledgerhq/types-live": "^6.34.0", + "axios": "^1.3.4", + "eip55": "^2.1.0", + "react": "^17.0.2", + "react-dom": "^17.0.2" + } + }, + "node_modules/@ledgerhq/domain-service/node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@ledgerhq/domain-service/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==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@ledgerhq/errors": { - "version": "6.12.3", - "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.12.3.tgz", - "integrity": "sha512-djiMSgB/7hnK3aLR/c5ZMMivxjcI7o2+y3VKcsZZpydPoVf9+FXqeJPRfOwmJ0JxbQ//LinUfWpIfHew8LkaVw==" + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/@ledgerhq/errors/-/errors-6.12.5.tgz", + "integrity": "sha512-wQlDyKD2lG4hiFmSPvWfuzhbH8wxWG4ugesM17HdZgxUt8g0SluwaBfFJ7Nx0Ym44VIhbsGMUzyBp0hHyCkVqA==" }, "node_modules/@ledgerhq/hw-app-btc": { "version": "9.1.3", @@ -3800,57 +3926,73 @@ } }, "node_modules/@ledgerhq/hw-app-eth": { - "version": "6.32.0", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-app-eth/-/hw-app-eth-6.32.0.tgz", - "integrity": "sha512-3s3rKyGKSkfk2unHWZUoZg99qUfRykFwbradVZGV7BcqnC0xoYuQsR15PAF7F6vvWXnnch1KzkrOwjjyiLuung==", + "version": "6.33.3", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-app-eth/-/hw-app-eth-6.33.3.tgz", + "integrity": "sha512-GyR9hhIF3bq70ZGIb9bEgjjzDfYaDwH4YyMLZMDfXt9OT9H7FhM6cU6vRoxpPLbniODgKFExETyAkNTDFz9Y/w==", "dependencies": { "@ethersproject/abi": "^5.5.0", "@ethersproject/rlp": "^5.5.0", - "@ledgerhq/cryptoassets": "^9.0.0", - "@ledgerhq/errors": "^6.12.3", - "@ledgerhq/hw-transport": "^6.28.1", - "@ledgerhq/hw-transport-mocker": "^6.27.12", + "@ledgerhq/cryptoassets": "^9.5.0", + "@ledgerhq/domain-service": "^1.1.1", + "@ledgerhq/errors": "^6.12.5", + "@ledgerhq/hw-transport": "^6.28.3", + "@ledgerhq/hw-transport-mocker": "^6.27.14", "@ledgerhq/logs": "^6.10.1", - "axios": "^0.26.1", + "axios": "^1.3.4", "bignumber.js": "^9.1.0", "crypto-js": "^4.1.1" } }, "node_modules/@ledgerhq/hw-app-eth/node_modules/axios": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", - "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "dependencies": { - "follow-redirects": "^1.14.8" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@ledgerhq/hw-app-eth/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==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, "node_modules/@ledgerhq/hw-transport": { - "version": "6.28.1", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.28.1.tgz", - "integrity": "sha512-RaZe+abn0zBIz82cE9tp7Y7aZkHWWbEaE2yJpfxT8AhFz3fx+BU0kLYzuRN9fmA7vKueNJ1MTVUCY+Ex9/CHSQ==", + "version": "6.28.3", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport/-/hw-transport-6.28.3.tgz", + "integrity": "sha512-YFPh9n51V4TfPZov7iAUbtez0cyNEVR1+49RG8tYvmsmk8ihvya2rR90U8KO2MnrT2jR4k2rlgQ3IcZJO9dBcw==", "dependencies": { - "@ledgerhq/devices": "^8.0.0", - "@ledgerhq/errors": "^6.12.3", + "@ledgerhq/devices": "^8.0.2", + "@ledgerhq/errors": "^6.12.5", "events": "^3.3.0" } }, "node_modules/@ledgerhq/hw-transport-mocker": { - "version": "6.27.12", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-mocker/-/hw-transport-mocker-6.27.12.tgz", - "integrity": "sha512-sJu4gJibdxR2qvsrqhCG474g5KhD5Acnfgtb7jdFrMeHbIEgb+XMeNzBGICPdNByUKW1lLgWN/lV1yJyCcCJ8A==", + "version": "6.27.14", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-mocker/-/hw-transport-mocker-6.27.14.tgz", + "integrity": "sha512-wEpI+BX5cqOW/fHqBdawDX/TYo9EAnDx1/LCo9ljnuz8IanomF8oceUe2y/FJWSLUxXoHMTIIbhk3SZjGLmY9A==", "dependencies": { - "@ledgerhq/hw-transport": "^6.28.1", + "@ledgerhq/hw-transport": "^6.28.3", "@ledgerhq/logs": "^6.10.1" } }, "node_modules/@ledgerhq/hw-transport-webusb": { - "version": "6.27.12", - "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-webusb/-/hw-transport-webusb-6.27.12.tgz", - "integrity": "sha512-U96UWLZIurD9ifHlm77PAgBbvDCe99DAJk64O2SdR41WRF3WaRq/pjrzCq2UvvammdCd1p7nS4zbhlse0wZplg==", + "version": "6.27.14", + "resolved": "https://registry.npmjs.org/@ledgerhq/hw-transport-webusb/-/hw-transport-webusb-6.27.14.tgz", + "integrity": "sha512-uSpjyiR0FhNXNtXxWqbmatyfCPcjeyADm8E+czuCCM7Wwf0S05AeD+2qLiEa0U1DspBZvz65WgkhPfeSmUsbZA==", "dependencies": { - "@ledgerhq/devices": "^8.0.0", - "@ledgerhq/errors": "^6.12.3", - "@ledgerhq/hw-transport": "^6.28.1", + "@ledgerhq/devices": "^8.0.2", + "@ledgerhq/errors": "^6.12.5", + "@ledgerhq/hw-transport": "^6.28.3", "@ledgerhq/logs": "^6.10.1" } }, @@ -3859,6 +4001,31 @@ "resolved": "https://registry.npmjs.org/@ledgerhq/logs/-/logs-6.10.1.tgz", "integrity": "sha512-z+ILK8Q3y+nfUl43ctCPuR4Y2bIxk/ooCQFwZxhtci1EhAtMDzMAx2W25qx8G1PPL9UUOdnUax19+F0OjXoj4w==" }, + "node_modules/@ledgerhq/types-live": { + "version": "6.34.0", + "resolved": "https://registry.npmjs.org/@ledgerhq/types-live/-/types-live-6.34.0.tgz", + "integrity": "sha512-xJmAq3s4A4TeWXLvjIEfIoyO/Za/t0P811pIG+1BFdpowUdCXhszaImiwqPCPHKTMAFjzstg6ZSb111KqpN01A==", + "dependencies": { + "bignumber.js": "^9.1.0", + "rxjs": "6" + } + }, + "node_modules/@ledgerhq/types-live/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@ledgerhq/types-live/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "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", @@ -3875,26 +4042,65 @@ "node": ">=12.0.0" } }, + "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dev": true, + "dependencies": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + }, + "node_modules/@metamask/eth-sig-util/node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "dev": true + }, "node_modules/@metamask/safe-event-emitter": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@metamask/safe-event-emitter/-/safe-event-emitter-2.0.0.tgz", "integrity": "sha512-/kSXhY692qiV1MXu6EeOZvg5nECLclxNXcKCxJ3cXQgYuRymRHpdx/t7JXfsK+JLjwA1e1c1/SBrlQYpusC29Q==" }, - "node_modules/@noble/ed25519": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.3.tgz", - "integrity": "sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==", + "node_modules/@noble/curves": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.0.0.tgz", + "integrity": "sha512-2upgEu0iLiDVDZkNLeFV2+ht0BAVgQnEmCk6JsOch9Rp8xfkMCbvbAZlA2pBHQc73dbl+vFOXfqkf4uemdn0bw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } - ] + ], + "dependencies": { + "@noble/hashes": "1.3.0" + } }, "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==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.0.tgz", + "integrity": "sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==", "funding": [ { "type": "individual", @@ -3906,6 +4112,7 @@ "version": "1.7.1", "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "dev": true, "funding": [ { "type": "individual", @@ -3949,57 +4156,36 @@ } }, "node_modules/@nomicfoundation/ethereumjs-block": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz", - "integrity": "sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz", + "integrity": "sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "ethereum-cryptography": "0.1.3" + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "ethereum-cryptography": "0.1.3", + "ethers": "^5.7.1" }, "engines": { "node": ">=14" } }, - "node_modules/@nomicfoundation/ethereumjs-block/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/@nomicfoundation/ethereumjs-blockchain": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz", - "integrity": "sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz", + "integrity": "sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-ethash": "^2.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-ethash": "3.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", "abstract-level": "^1.0.3", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", @@ -4011,48 +4197,25 @@ "node": ">=14" } }, - "node_modules/@nomicfoundation/ethereumjs-blockchain/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/@nomicfoundation/ethereumjs-common": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz", - "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz", + "integrity": "sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-util": "9.0.1", "crc-32": "^1.2.0" } }, "node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz", - "integrity": "sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz", + "integrity": "sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", "abstract-level": "^1.0.3", "bigint-crypto-utils": "^3.0.23", "ethereum-cryptography": "0.1.3" @@ -4061,39 +4224,16 @@ "node": ">=14" } }, - "node_modules/@nomicfoundation/ethereumjs-ethash/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/@nomicfoundation/ethereumjs-evm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz", - "integrity": "sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz", + "integrity": "sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "@types/async-eventemitter": "^0.2.1", - "async-eventemitter": "^0.2.4", + "@ethersproject/providers": "^5.7.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", "mcl-wasm": "^0.7.1", @@ -4103,33 +4243,10 @@ "node": ">=14" } }, - "node_modules/@nomicfoundation/ethereumjs-evm/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/@nomicfoundation/ethereumjs-rlp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz", - "integrity": "sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz", + "integrity": "sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ==", "dev": true, "bin": { "rlp": "bin/rlp" @@ -4139,51 +4256,28 @@ } }, "node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz", - "integrity": "sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz", + "integrity": "sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", - "functional-red-black-tree": "^1.0.1" - } - }, - "node_modules/@nomicfoundation/ethereumjs-statemanager/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" + "ethers": "^5.7.1", + "js-sdsl": "^4.1.4" } }, "node_modules/@nomicfoundation/ethereumjs-trie": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz", - "integrity": "sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz", + "integrity": "sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "@types/readable-stream": "^2.3.13", "ethereum-cryptography": "0.1.3", "readable-stream": "^3.6.0" }, @@ -4191,123 +4285,87 @@ "node": ">=14" } }, - "node_modules/@nomicfoundation/ethereumjs-trie/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==", + "node_modules/@nomicfoundation/ethereumjs-trie/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==", "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" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/@nomicfoundation/ethereumjs-tx": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz", - "integrity": "sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz", + "integrity": "sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@chainsafe/ssz": "^0.9.2", + "@ethersproject/providers": "^5.7.2", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", "ethereum-cryptography": "0.1.3" }, "engines": { "node": ">=14" } }, - "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==", - "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/@nomicfoundation/ethereumjs-util": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz", - "integrity": "sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz", + "integrity": "sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "^4.0.0-beta.2", + "@chainsafe/ssz": "^0.10.0", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", "ethereum-cryptography": "0.1.3" }, "engines": { "node": ">=14" } }, - "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==", + "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/persistent-merkle-tree": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", + "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", "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" + "@chainsafe/as-sha256": "^0.3.1" + } + }, + "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/ssz": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", + "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", + "dev": true, + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1", + "@chainsafe/persistent-merkle-tree": "^0.5.0" } }, "node_modules/@nomicfoundation/ethereumjs-vm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz", - "integrity": "sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-evm": "^1.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "@types/async-eventemitter": "^0.2.1", - "async-eventemitter": "^0.2.4", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz", + "integrity": "sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ==", + "dev": true, + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-blockchain": "7.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-evm": "2.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-statemanager": "2.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", - "functional-red-black-tree": "^1.0.1", "mcl-wasm": "^0.7.1", "rustbn.js": "~0.2.0" }, @@ -4315,29 +4373,6 @@ "node": ">=14" } }, - "node_modules/@nomicfoundation/ethereumjs-vm/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/@nomicfoundation/hardhat-network-helpers": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz", @@ -4350,45 +4385,6 @@ "hardhat": "^2.9.5" } }, - "node_modules/@nomicfoundation/hardhat-network-helpers/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/@nomicfoundation/hardhat-network-helpers/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@nomicfoundation/solidity-analyzer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", @@ -4571,9 +4567,9 @@ } }, "node_modules/@nomiclabs/hardhat-ethers": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.2.tgz", - "integrity": "sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz", + "integrity": "sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==", "dev": true, "peerDependencies": { "ethers": "^5.0.0", @@ -4764,18 +4760,18 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz", - "integrity": "sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-17.2.0.tgz", + "integrity": "sha512-MazrFNx4plbLsGl+LFesMo96eIXkFgEtaKbnNpdh4aQ0VM10aoylFsTYP1AEjkeoRNZiiPe3T6Gl2Hr8dJWdlQ==", "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz", - "integrity": "sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.0.tgz", + "integrity": "sha512-5T4iXjJdYCVA1rdWS1C+uZV9AvtZY9QgTG74kFiSFVj94dZXowyi/YK8f4SGjZaL69jZthGlBaDKRdCMCF9log==", "dev": true, "dependencies": { - "@octokit/types": "^9.0.0" + "@octokit/types": "^9.2.2" }, "engines": { "node": ">= 14" @@ -4794,12 +4790,12 @@ } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz", - "integrity": "sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.1.0.tgz", + "integrity": "sha512-SWwz/hc47GaKJR6BlJI4WIVRodbAFRvrR0QRPSoPMs7krb7anYPML3psg+ThEz/kcwOdSNh/oA8qThi/Wvs4Fw==", "dev": true, "dependencies": { - "@octokit/types": "^9.0.0", + "@octokit/types": "^9.2.2", "deprecation": "^2.3.1" }, "engines": { @@ -4840,26 +4836,6 @@ "node": ">= 14" } }, - "node_modules/@octokit/request/node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/@octokit/rest": { "version": "19.0.7", "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz", @@ -4876,23 +4852,23 @@ } }, "node_modules/@octokit/types": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz", - "integrity": "sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.2.tgz", + "integrity": "sha512-9BjDxjgQIvCjNWZsbqyH5QC2Yni16oaE6xL+8SUBMzcYPF4TGQBXGA97Cl3KceK9mwiNMb1mOYCz6FbCCLEL+g==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^16.0.0" + "@octokit/openapi-types": "^17.1.2" } }, "node_modules/@openzeppelin/contracts": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.2.tgz", - "integrity": "sha512-kEUOgPQszC0fSYWpbh2kT94ltOJwj1qfT2DWo+zVttmGmf97JZ99LspePNaeeaLhCImaHVeBbjaQFZQn7+Zc5g==" + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.3.tgz", + "integrity": "sha512-bQHV8R9Me8IaJoJ2vPG4rXcL7seB7YVuskr4f+f5RyOStSZetwzkWtoqDMl5erkBJy0lDRUnIR2WIkPiC0GJlg==" }, "node_modules/@openzeppelin/contracts-upgradeable": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.2.tgz", - "integrity": "sha512-zIggnBwemUmmt9IS73qxi+tumALxCY4QEs3zLCII78k0Gfse2hAOdAkuAeLUzvWUpneMUfFE5sGHzEUSTvn4Ag==" + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.3.tgz", + "integrity": "sha512-SXDRl7HKpl2WDoJpn7CK/M9U4Z8gNXDHHChAKh0Iz+Wew3wu6CmFYBeie3je8V0GSXZAIYYwUktSrnW/kwVPtg==" }, "node_modules/@openzeppelin/contracts-v0.7": { "name": "@openzeppelin/contracts", @@ -4901,14 +4877,16 @@ "integrity": "sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA==" }, "node_modules/@openzeppelin/hardhat-upgrades": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.22.1.tgz", - "integrity": "sha512-MdoitCTLl4zwMU8MeE/bCj+7JMWBEvd38XqJkw36PkJrXlbv6FedDVCPoumMAhpmtymm0nTwTYYklYG+L6WiiQ==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.26.0.tgz", + "integrity": "sha512-ggCvdIf7A9QcMedCaswecgt3N7hacx3qYOn+4bNPqMAwslo/SJ9vN4AhV0VWkDcY4CqFFou3RFQmDWNeLMBX9A==", "dev": true, "dependencies": { - "@openzeppelin/upgrades-core": "^1.20.0", + "@openzeppelin/upgrades-core": "^1.26.2", "chalk": "^4.1.0", "debug": "^4.1.1", + "defender-base-client": "^1.44.0", + "platform-deploy-client": "^0.6.0", "proper-lockfile": "^4.1.1" }, "bin": { @@ -4927,9 +4905,9 @@ } }, "node_modules/@openzeppelin/upgrades-core": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.24.1.tgz", - "integrity": "sha512-QhdIQDUykJ3vQauB6CheV7vk4zgn0e1iY+IDg7r1KqpA1m2bqIGjQCpzidW33K4bZc9zdJSPx2/Z6Um5KxCB7A==", + "version": "1.26.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.26.2.tgz", + "integrity": "sha512-TJORrgyun5qflPos/47P3j61gDw+7W+tEirSBOYRxfVL1WGjX1n8iaLrijPIqzyeS1MKguN1nckAMspQ4SKrxw==", "dev": true, "dependencies": { "cbor": "^8.0.0", @@ -4941,45 +4919,6 @@ "solidity-ast": "^0.4.15" } }, - "node_modules/@openzeppelin/upgrades-core/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/@openzeppelin/upgrades-core/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@panva/asn1.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", @@ -4989,9 +4928,9 @@ } }, "node_modules/@pnpm/config.env-replace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.0.0.tgz", - "integrity": "sha512-ZVPVDi1E8oeXlYqkGRtX0CkzLTwE2zt62bjWaWKaAvI8NZqHzlMvGeSNDpW+JB3+aKanYb4UETJOF1/CxGPemA==", + "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, "engines": { "node": ">=12.22.0" @@ -5009,13 +4948,19 @@ "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 + }, "node_modules/@pnpm/npm-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.1.0.tgz", - "integrity": "sha512-Oe6ntvgsMTE3hDIqy6sajqHF+MnzJrOF06qC2QSiUEybLL7cp6tjoKUa32gpd9+KPVl4QyMs3E3nsXrx/Vdnlw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.0.tgz", + "integrity": "sha512-roLI1ul/GwzwcfcVpZYPdrgW2W/drLriObl1h+yLF5syc8/5ULWw2ALbCHUWF+4YltIqA3xFSbG4IwyJz37e9g==", "dev": true, "dependencies": { - "@pnpm/config.env-replace": "^1.0.0", + "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", "config-chain": "^1.1.11" }, @@ -5143,6 +5088,18 @@ "@scure/base": "~1.1.0" } }, + "node_modules/@scure/bip32/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==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, "node_modules/@scure/bip39": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", @@ -5159,6 +5116,18 @@ "@scure/base": "~1.1.0" } }, + "node_modules/@scure/bip39/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==", + "dev": true, + "funding": [ + { + "type": "individual", + "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", @@ -5325,21 +5294,21 @@ } }, "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.1.0.tgz", + "integrity": "sha512-w1qd368vtrwttm1PRJWPW1QHlbmHrVDGs1eBH/jZvRPUFS4MNXV9Q33EQdjOdeAxZ7O8+3wM7zxztm2nfUSyKw==", "dev": true, "dependencies": { - "@sinonjs/commons": "^2.0.0" + "@sinonjs/commons": "^3.0.0" } }, "node_modules/@solana/buffer-layout": { @@ -5354,21 +5323,20 @@ } }, "node_modules/@solana/web3.js": { - "version": "1.73.3", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.73.3.tgz", - "integrity": "sha512-vHRMo589XEIpoujpE2sZZ1aMZvfA1ImKfNxobzEFyMb+H5j6mRRUXfdgWD0qJ0sm11e5BcBC7HPeRXJB+7f3Lg==", + "version": "1.76.0", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.76.0.tgz", + "integrity": "sha512-aJtF/nTs+9St+KtTK/wgVJ+SinfjYzn+3w1ygYIPw8ST6LH+qHBn8XkodgDTwlv/xzNkaVz1kkUDOZ8BPXyZWA==", "dependencies": { "@babel/runtime": "^7.12.5", - "@noble/ed25519": "^1.7.0", - "@noble/hashes": "^1.1.2", - "@noble/secp256k1": "^1.6.3", + "@noble/curves": "^1.0.0", + "@noble/hashes": "^1.3.0", "@solana/buffer-layout": "^4.0.0", "agentkeepalive": "^4.2.1", "bigint-buffer": "^1.1.5", "bn.js": "^5.0.0", "borsh": "^0.7.0", "bs58": "^4.0.1", - "buffer": "6.0.1", + "buffer": "6.0.3", "fast-stable-stringify": "^1.0.0", "jayson": "^3.4.4", "node-fetch": "^2.6.7", @@ -5376,48 +5344,6 @@ "superstruct": "^0.14.2" } }, - "node_modules/@solana/web3.js/node_modules/buffer": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz", - "integrity": "sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/@solana/web3.js/node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", @@ -5438,14 +5364,24 @@ "node": ">= 6" } }, - "node_modules/@trezor/blockchain-link": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.1.8.tgz", - "integrity": "sha512-U42+SMUTyMoxm92wETtpIkrWH2SqkG42qq9F55KHMfu1Lt6rkrxhcDjnvmgcvTjmr9qxGmKe0vPtB/l3qH0aGQ==", + "node_modules/@trezor/analytics": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@trezor/analytics/-/analytics-1.0.2.tgz", + "integrity": "sha512-9T+2j/X+TRrzrvHM0bNDS1mO/Rkq/6LGqtaTOC59PJtTOjDLGpP4fiKVCjLNtVg8qQBpXlBlqH89BCPV1q8ftQ==", "dependencies": { - "@trezor/utils": "^9.0.6", - "@trezor/utxo-lib": "^1.0.4", - "@types/web": "^0.0.91", + "@trezor/utils": "9.0.8" + } + }, + "node_modules/@trezor/blockchain-link": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link/-/blockchain-link-2.1.12.tgz", + "integrity": "sha512-X5YHAI4w9XjuivNO2J30K9wyuiUH/p9DM2lrsjudJ3sImxA0EX9ypLIY67lVYSmUzutL64KGcbdWPgw7f0AtuA==", + "dependencies": { + "@trezor/blockchain-link-types": "1.0.2", + "@trezor/blockchain-link-utils": "1.0.3", + "@trezor/utils": "9.0.8", + "@trezor/utxo-lib": "1.0.6", + "@types/web": "^0.0.99", "bignumber.js": "^9.1.1", "events": "^3.3.0", "ripple-lib": "^1.10.1", @@ -5453,6 +5389,20 @@ "ws": "7.5.9" } }, + "node_modules/@trezor/blockchain-link-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-types/-/blockchain-link-types-1.0.2.tgz", + "integrity": "sha512-ON3A2Anu5k3BkMFtG0LWO48ZxikyWgSORqQ12ki3KDbTbqZV5BwAZTeFchUq8cv1kDlqkG7AtMV2nY9G3KfYOA==" + }, + "node_modules/@trezor/blockchain-link-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@trezor/blockchain-link-utils/-/blockchain-link-utils-1.0.3.tgz", + "integrity": "sha512-/mti1QY8n053P11wQwnQyBAASS+nNVBKu2kSZo8KAESwdnFGcnZwH0okXHTlUQZFud5ppg9EYJk9mpk0jf91tQ==", + "dependencies": { + "@trezor/utils": "9.0.8", + "bignumber.js": "^9.1.1" + } + }, "node_modules/@trezor/blockchain-link/node_modules/socks-proxy-agent": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", @@ -5487,64 +5437,90 @@ } }, "node_modules/@trezor/connect": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.0.7.tgz", - "integrity": "sha512-y0QYSlhC2lXeBbVT2Oezpi1GRdvHykCviPOCCkhGemQ4gAmqSDp/aniNbKoR/ZAyiibVTZLo0jvPbHXosM9zjQ==", - "dependencies": { - "@trezor/blockchain-link": "^2.1.8", - "@trezor/connect-common": "0.0.12", - "@trezor/transport": "^1.1.8", - "@trezor/utils": "^9.0.6", - "@trezor/utxo-lib": "^1.0.4", + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@trezor/connect/-/connect-9.0.10.tgz", + "integrity": "sha512-0QtbBotukjL9klPeetfnmg4cJbmfP/RXjqc5XGRhsvHlqxOIBD+un3NLAD5MCeiSetdF0BSf2aCrHod77SRUgg==", + "dependencies": { + "@trezor/blockchain-link": "2.1.12", + "@trezor/connect-analytics": "1.0.1", + "@trezor/connect-common": "0.0.15", + "@trezor/transport": "1.1.11", + "@trezor/utils": "9.0.8", + "@trezor/utxo-lib": "1.0.6", "bignumber.js": "^9.1.1", "blakejs": "^1.2.1", - "bowser": "^2.11.0", "cross-fetch": "^3.1.5", "events": "^3.3.0", - "parse-uri": "1.0.7", "randombytes": "2.1.0", "tslib": "2.5.0" } }, + "node_modules/@trezor/connect-analytics": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@trezor/connect-analytics/-/connect-analytics-1.0.1.tgz", + "integrity": "sha512-GZYplHNX6Ok7TOH6hMmclwAzTs8m7WDxyzwjImKumVGC0wCRK9gG0k62Pfo/LGjW5LC+hXzz9Mh1B61NveySig==", + "dependencies": { + "@trezor/analytics": "1.0.2" + } + }, "node_modules/@trezor/connect-common": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.0.12.tgz", - "integrity": "sha512-u7hrcS3eBHzR6b2dYD1PBPYw5vWaKT5eLoEL+ykPv2DeJsq0AgdRTNQom9tTUonyHoxGdnjQuaEO2Y4j2hZeng==" + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/@trezor/connect-common/-/connect-common-0.0.15.tgz", + "integrity": "sha512-dv+oBc1HhSvdd8+92999H72dkkuITSHPJSL1vhXvzVctlEBGvB87Y6dlEaMd+7JrLmsFBNo21gX+AU1Qc9kB7g==", + "dependencies": { + "@trezor/env-utils": "1.0.1" + } }, "node_modules/@trezor/connect-web": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@trezor/connect-web/-/connect-web-9.0.7.tgz", - "integrity": "sha512-SVlA0h9evC12bmuO1ksz7Q3tBLNsw1QhxhkZBrZ6giS8gmC/2NkL1MlzKlVp7TCjnQu5gbP6vDRahUoZZoiUmg==", + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@trezor/connect-web/-/connect-web-9.0.10.tgz", + "integrity": "sha512-G7YZw5ERYVCgwIXBV3LgGTG4VtlLrcBJg8r5GY3eK4jBjU5YWRRg8eO+8yfAbym/u0HSCkfl4CUI5spBHrd8ag==", "dependencies": { - "@trezor/connect": "9.0.7", - "@trezor/utils": "^9.0.6", + "@trezor/connect": "9.0.10", + "@trezor/utils": "9.0.8", "events": "^3.3.0" } }, + "node_modules/@trezor/connect/node_modules/cross-fetch": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", + "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", + "dependencies": { + "node-fetch": "^2.6.11" + } + }, + "node_modules/@trezor/env-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.0.1.tgz", + "integrity": "sha512-ZGiGrJmWqqBz+WMU/Ry1tge93baqLsbu16vcweooYv/ZkJObqSy9VNkHd2601K2Mygbk7zv6YJOkHgNgu8CwJA==", + "dependencies": { + "ua-parser-js": "^1.0.34" + } + }, "node_modules/@trezor/transport": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.1.8.tgz", - "integrity": "sha512-Q5X0vTaZQu21PqaHL1Dnm6TVSsuK1mweMWRo2PDioDErSDlQrTMt/81gUV+HHZq/ej2m4C6YHx74pTlo2zJkfQ==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@trezor/transport/-/transport-1.1.11.tgz", + "integrity": "sha512-KHWPAiODA92H7PW7s/za/NfPjoiYftu4V/5ZiKrrkhZmHjrXp7b/e0tHLOP/u1zukysJba8+enNKj0RvLoftAg==", "dependencies": { - "@trezor/utils": "^9.0.6", + "@trezor/utils": "9.0.8", "bytebuffer": "^5.0.1", "json-stable-stringify": "^1.0.2", "long": "^4.0.0", - "prettier": "2.8.4", - "protobufjs": "^6.11.3" + "prettier": "2.8.7", + "protobufjs": "6.11.3" } }, "node_modules/@trezor/utils": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.0.6.tgz", - "integrity": "sha512-ZrZDMa1DzcfptBTdIPd7jLJGd03EVbocCSa92o64Qb6FMGSUh+t8Y+9Yy6rBPN1GTOsJxVQmcj3leKrtJMgwVQ==" + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@trezor/utils/-/utils-9.0.8.tgz", + "integrity": "sha512-XsX+VXP2UxanYo+LbY7zcjeIumEWFs5lArTAfK1fdWTIdiV8Od2htNO+D9lnCytvuu04LeJx7RihxinsQQVDvA==" }, "node_modules/@trezor/utxo-lib": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-1.0.4.tgz", - "integrity": "sha512-n4Xj2YIpqRKaZiDZww0mcY0c2ZN+SDygR3dAJkUb7O/2FykxCS28z3QHIjfbdzMwquywbkxDeiErcdrHw3GIvg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@trezor/utxo-lib/-/utxo-lib-1.0.6.tgz", + "integrity": "sha512-aozw+Xg/LABJxnsKCA/NNnahYETlF8fNGgdNQb04vTI3kUd2L9hD/oT1wCl7L65A3WmL/oh3twCzK07cJJOR2Q==", "dependencies": { - "@trezor/utils": "^9.0.6", + "@trezor/utils": "9.0.8", "bchaddrjs": "^0.5.2", "bech32": "^2.0.0", "bip66": "^1.1.5", @@ -5553,7 +5529,7 @@ "blakejs": "^1.2.1", "bn.js": "^5.2.1", "bs58": "^5.0.0", - "bs58check": "^2.1.2", + "bs58check": "^3.0.1", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "int64-buffer": "^1.0.1", @@ -5582,6 +5558,15 @@ "base-x": "^4.0.0" } }, + "node_modules/@trezor/utxo-lib/node_modules/bs58check": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-3.0.1.tgz", + "integrity": "sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ==", + "dependencies": { + "@noble/hashes": "^1.2.0", + "bs58": "^5.0.0" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -5601,15 +5586,15 @@ "dev": true }, "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==", "dev": true }, "node_modules/@typechain/ethers-v5": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.0.tgz", - "integrity": "sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz", + "integrity": "sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==", "dev": true, "dependencies": { "lodash": "^4.17.15", @@ -5617,7 +5602,6 @@ }, "peerDependencies": { "@ethersproject/abi": "^5.0.0", - "@ethersproject/bytes": "^5.0.0", "@ethersproject/providers": "^5.0.0", "ethers": "^5.1.3", "typechain": "^8.1.1", @@ -5625,9 +5609,9 @@ } }, "node_modules/@typechain/hardhat": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.5.tgz", - "integrity": "sha512-lg7LW4qDZpxFMknp3Xool61Fg6Lays8F8TXdFGBG+MxyYcYU5795P1U2XdStuzGq9S2Dzdgh+1jGww9wvZ6r4Q==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.6.tgz", + "integrity": "sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA==", "dev": true, "dependencies": { "fs-extra": "^9.1.0" @@ -5635,7 +5619,7 @@ "peerDependencies": { "@ethersproject/abi": "^5.4.7", "@ethersproject/providers": "^5.4.7", - "@typechain/ethers-v5": "^10.2.0", + "@typechain/ethers-v5": "^10.2.1", "ethers": "^5.4.7", "hardhat": "^2.9.9", "typechain": "^8.1.1" @@ -5677,12 +5661,6 @@ "node": ">= 10.0.0" } }, - "node_modules/@types/async-eventemitter": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", - "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", - "dev": true - }, "node_modules/@types/babel__core": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", @@ -5716,9 +5694,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.5.tgz", + "integrity": "sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==", "dev": true, "dependencies": { "@babel/types": "^7.3.0" @@ -5753,9 +5731,9 @@ } }, "node_modules/@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", "dev": true }, "node_modules/@types/connect": { @@ -5793,13 +5771,14 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", "dependencies": { "@types/node": "*", "@types/qs": "*", - "@types/range-parser": "*" + "@types/range-parser": "*", + "@types/send": "*" } }, "node_modules/@types/fs-extra": { @@ -5827,9 +5806,9 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" }, "node_modules/@types/http-proxy": { - "version": "1.17.10", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.10.tgz", - "integrity": "sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==", + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", "dev": true, "dependencies": { "@types/node": "*" @@ -5860,9 +5839,9 @@ } }, "node_modules/@types/jest": { - "version": "29.4.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.4.2.tgz", - "integrity": "sha512-bbne90W7is+m88ezmZrLiTpp41tIoTdvPC5t3gLoNgu/6qbGdWTC2JWqPWQRJn2Q7rVYTr8aTWqOjhGJDXyvAQ==", + "version": "29.5.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.1.tgz", + "integrity": "sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -5910,9 +5889,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.14.191", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", - "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ==" + "version": "4.14.194", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", + "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==" }, "node_modules/@types/long": { "version": "4.0.2", @@ -5926,9 +5905,9 @@ "dev": true }, "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/minimist": { "version": "1.2.2", @@ -5988,6 +5967,22 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, + "node_modules/@types/readable-stream": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", + "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "safe-buffer": "~5.1.1" + } + }, + "node_modules/@types/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/@types/responselike": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", @@ -6005,11 +6000,20 @@ } }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, "node_modules/@types/serve-static": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", @@ -6028,6 +6032,15 @@ "source-map": "^0.6.0" } }, + "node_modules/@types/source-map-support/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -6047,14 +6060,14 @@ "dev": true }, "node_modules/@types/web": { - "version": "0.0.91", - "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.91.tgz", - "integrity": "sha512-KIw/1SNDyzPMpN7JiS2TTmiKXUhg4vkV2b8ozgQV0aw82dZr1chPXyunxVbUjSHaDrLxQbD+xpVk+CXiVkakHg==" + "version": "0.0.99", + "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.99.tgz", + "integrity": "sha512-xMz3tOvtkZzc7RpQrDNiLe5sfMmP+fz8bOxHIZ/U8qXyvzDX4L4Ss1HCjor/O9DSelba+1iXK1VM7lruX28hiQ==" }, "node_modules/@types/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz", - "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/which/-/which-3.0.0.tgz", + "integrity": "sha512-ASCxdbsrwNfSMXALlC3Decif9rwDMu+80KGp5zI2RLRotfMsTv7fHL8W8VDp24wymzDyIFudhUeSCugrgRFfHQ==", "dev": true }, "node_modules/@types/ws": { @@ -6066,9 +6079,9 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.22", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz", - "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -6081,15 +6094,15 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.55.0.tgz", - "integrity": "sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz", + "integrity": "sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.55.0", - "@typescript-eslint/type-utils": "5.55.0", - "@typescript-eslint/utils": "5.55.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/type-utils": "5.59.6", + "@typescript-eslint/utils": "5.59.6", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -6115,14 +6128,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.55.0.tgz", - "integrity": "sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.6.tgz", + "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.55.0", - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/typescript-estree": "5.55.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", "debug": "^4.3.4" }, "engines": { @@ -6142,13 +6155,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz", - "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", + "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/visitor-keys": "5.55.0" + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6159,13 +6172,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.55.0.tgz", - "integrity": "sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz", + "integrity": "sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.55.0", - "@typescript-eslint/utils": "5.55.0", + "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/utils": "5.59.6", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -6186,9 +6199,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz", - "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.6.tgz", + "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6199,13 +6212,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz", - "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", + "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/visitor-keys": "5.55.0", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -6226,17 +6239,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.55.0.tgz", - "integrity": "sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.6.tgz", + "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.55.0", - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/typescript-estree": "5.55.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -6252,12 +6265,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz", - "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", + "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.55.0", + "@typescript-eslint/types": "5.59.6", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -6375,49 +6388,60 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz", - "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.2.tgz", + "integrity": "sha512-CKZWo1dzsQYTNTft7whzjL0HsrEpMfiK7pjZ2WFE3bC1NA7caUjWioHSK+49y/LK7Bsm4poJZzAMnvZMQ7OTeg==", "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/shared": "3.2.47", + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.2", "estree-walker": "^2.0.2", - "source-map": "^0.6.1" + "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-dom": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", - "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.2.tgz", + "integrity": "sha512-6gS3auANuKXLw0XH6QxkWqyPYPunziS2xb6VRenM3JY7gVfZcJvkCBHkb5RuNY1FCbBO3lkIi0CdXUCW1c7SXw==", "dependencies": { - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47" + "@vue/compiler-core": "3.3.2", + "@vue/shared": "3.3.2" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", - "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", - "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/compiler-dom": "3.2.47", - "@vue/compiler-ssr": "3.2.47", - "@vue/reactivity-transform": "3.2.47", - "@vue/shared": "3.2.47", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.2.tgz", + "integrity": "sha512-jG4jQy28H4BqzEKsQqqW65BZgmo3vzdLHTBjF+35RwtDdlFE+Fk1VWJYUnDMMqkFBo6Ye1ltSKVOMPgkzYj7SQ==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.2", + "@vue/compiler-dom": "3.3.2", + "@vue/compiler-ssr": "3.3.2", + "@vue/reactivity-transform": "3.3.2", + "@vue/shared": "3.3.2", "estree-walker": "^2.0.2", - "magic-string": "^0.25.7", + "magic-string": "^0.30.0", "postcss": "^8.1.10", - "source-map": "^0.6.1" + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", - "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.2.tgz", + "integrity": "sha512-K8OfY5FQtZaSOJHHe8xhEfIfLrefL/Y9frv4k4NsyQL3+0lRKxr9QuJhfdBDjkl7Fhz8CzKh63mULvmOfx3l2w==", "dependencies": { - "@vue/compiler-dom": "3.2.47", - "@vue/shared": "3.2.47" + "@vue/compiler-dom": "3.3.2", + "@vue/shared": "3.3.2" } }, "node_modules/@vue/devtools-api": { @@ -6444,60 +6468,71 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz", - "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.2.tgz", + "integrity": "sha512-yX8C4uTgg2Tdj+512EEMnMKbLveoITl7YdQX35AYgx8vBvQGszKiiCN46g4RY6/deeo/5DLbeUUGxCq1qWMf5g==", "dependencies": { - "@vue/shared": "3.2.47" + "@vue/shared": "3.3.2" } }, "node_modules/@vue/reactivity-transform": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", - "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.2.tgz", + "integrity": "sha512-iu2WaQvlJHdnONrsyv4ibIEnSsuKF+aHFngGj/y1lwpHQtalpVhKg9wsKMoiKXS9zPNjG9mNKzJS9vudvjzvyg==", "dependencies": { - "@babel/parser": "^7.16.4", - "@vue/compiler-core": "3.2.47", - "@vue/shared": "3.2.47", + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.2", + "@vue/shared": "3.3.2", "estree-walker": "^2.0.2", - "magic-string": "^0.25.7" + "magic-string": "^0.30.0" + } + }, + "node_modules/@vue/reactivity-transform/node_modules/magic-string": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.0.tgz", + "integrity": "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" } }, "node_modules/@vue/runtime-core": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz", - "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.2.tgz", + "integrity": "sha512-qSl95qj0BvKfcsO+hICqFEoLhJn6++HtsPxmTkkadFbuhe3uQfJ8HmQwvEr7xbxBd2rcJB6XOJg7nWAn/ymC5A==", "dependencies": { - "@vue/reactivity": "3.2.47", - "@vue/shared": "3.2.47" + "@vue/reactivity": "3.3.2", + "@vue/shared": "3.3.2" } }, "node_modules/@vue/runtime-dom": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", - "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.2.tgz", + "integrity": "sha512-+drStsJT+0mtgHdarT7cXZReCcTFfm6ptxMrz0kAW5hms6UNBd8Q1pi4JKlncAhu+Ld/TevsSp7pqAZxBBoGng==", "dependencies": { - "@vue/runtime-core": "3.2.47", - "@vue/shared": "3.2.47", - "csstype": "^2.6.8" + "@vue/runtime-core": "3.3.2", + "@vue/shared": "3.3.2", + "csstype": "^3.1.1" } }, "node_modules/@vue/server-renderer": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz", - "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.2.tgz", + "integrity": "sha512-QCwh6OGwJg6GDLE0fbQhRTR6tnU+XDJ1iCsTYHXBiezCXAhqMygFRij7BiLF4ytvvHcg5kX9joX5R5vP85++wg==", "dependencies": { - "@vue/compiler-ssr": "3.2.47", - "@vue/shared": "3.2.47" + "@vue/compiler-ssr": "3.3.2", + "@vue/shared": "3.3.2" }, "peerDependencies": { - "vue": "3.2.47" + "vue": "3.3.2" } }, "node_modules/@vue/shared": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz", - "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.2.tgz", + "integrity": "sha512-0rFu3h8JbclbnvvKrs7Fe5FNGV9/5X2rPD7KmOzhLSUAiQH5//Hq437Gv0fR5Mev3u/nbtvmLl8XgwCU20/ZfQ==" }, "node_modules/@walletconnect/browser-utils": { "version": "1.8.0", @@ -6546,11 +6581,6 @@ "tslib": "1.14.1" } }, - "node_modules/@walletconnect/crypto/node_modules/aes-js": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" - }, "node_modules/@walletconnect/crypto/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -6620,9 +6650,9 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@walletconnect/jsonrpc-utils": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.6.tgz", - "integrity": "sha512-snp0tfkjPiDLQp/jrBewI+9SM33GPV4+Gjgldod6XQ7rFyQ5FZjnBxUkY4xWH0+arNxzQSi6v5iDXjCjSaorpg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.7.tgz", + "integrity": "sha512-zJziApzUF/Il4VcwabnaU+0yo1QI4eUkYX99zmCVTHJvZOf2l0zjADf/OpKqWyeNFC3Io56Z/8uJHVtcNVvyFA==", "dependencies": { "@walletconnect/environment": "^1.0.1", "@walletconnect/jsonrpc-types": "^1.0.2", @@ -6685,26 +6715,6 @@ "ws": "7.5.3" } }, - "node_modules/@walletconnect/socket-transport/node_modules/ws": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", - "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/@walletconnect/types": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@walletconnect/types/-/types-1.8.0.tgz", @@ -6792,6 +6802,37 @@ "node": ">=12" } }, + "node_modules/abstract-level/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "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" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/abstract-leveldown": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", + "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", + "dependencies": { + "xtend": "~4.0.0" + } + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -6846,7 +6887,7 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-node/node_modules/acorn-walk": { + "node_modules/acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", @@ -6854,15 +6895,6 @@ "node": ">=0.4.0" } }, - "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==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/adm-zip": { "version": "0.4.16", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", @@ -6873,9 +6905,9 @@ } }, "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": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" }, "node_modules/agent-base": { "version": "6.0.2", @@ -6929,6 +6961,64 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/amazon-cognito-identity-js": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.2.0.tgz", + "integrity": "sha512-9Fxrp9+MtLdsJvqOwSaE3ll+pneICeuE3pwj2yDkiyGNWuHx97b8bVLR2bOgfDmDJnY0Hq8QoeXtwdM4aaXJjg==", + "dev": true, + "dependencies": { + "@aws-crypto/sha256-js": "1.2.2", + "buffer": "4.9.2", + "fast-base64-decode": "^1.0.0", + "isomorphic-unfetch": "^3.0.0", + "js-cookie": "^2.2.1" + } + }, + "node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/sha256-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz", + "integrity": "sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==", + "dev": true, + "dependencies": { + "@aws-crypto/util": "^1.2.2", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" + } + }, + "node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/util": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-1.2.2.tgz", + "integrity": "sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==", + "dev": true, + "dependencies": { + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/amazon-cognito-identity-js/node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/amazon-cognito-identity-js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/amazon-cognito-identity-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -7007,7 +7097,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -7016,7 +7105,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -7027,6 +7115,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -7041,9 +7135,9 @@ } }, "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true }, "node_modules/argparse": { @@ -7185,7 +7279,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, "engines": { "node": ">=8" } @@ -7287,9 +7380,9 @@ } }, "node_modules/aws-cdk": { - "version": "2.69.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.69.0.tgz", - "integrity": "sha512-wsocwG6gFpPq4WZhLc77khuD35qtDuSphV4kquirlPE7wBmXh7XKoC60sRJvz8IHjv5dvqygaoNL4HH2fLonaQ==", + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.79.1.tgz", + "integrity": "sha512-N6intzdRFqrHC+O3Apty34RiTev2+bzvRtUbehVd5IyAmTvLsgE/jlhPUIJV2POSAK+bKOV+ZWEp9qMOj1hq8A==", "dev": true, "bin": { "cdk": "bin/cdk" @@ -7302,9 +7395,9 @@ } }, "node_modules/aws-cdk-lib": { - "version": "2.69.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.69.0.tgz", - "integrity": "sha512-VIwgMMpc8iHCZTmt1PuMdj20f0lTY8SI6Pltx7jvhYxyzvg04Dd0YAryBUuutj/khE3typJwiFzLlL7yoNo5AA==", + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.79.1.tgz", + "integrity": "sha512-iOPT9hbpP7z9otAzAgSr3HksjZe/QQXdyE7P1A4EESAzmLktOGfzzHydJqU1wfE9BbgK4ioCS0dJ3EaCCtWGpg==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -7314,20 +7407,22 @@ "minimatch", "punycode", "semver", + "table", "yaml" ], "dependencies": { - "@aws-cdk/asset-awscli-v1": "^2.2.97", + "@aws-cdk/asset-awscli-v1": "^2.2.165", "@aws-cdk/asset-kubectl-v20": "^2.1.1", - "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.77", + "@aws-cdk/asset-node-proxy-agent-v5": "^2.0.139", "@balena/dockerignore": "^1.0.2", "case": "1.6.3", - "fs-extra": "^9.1.0", + "fs-extra": "^11.1.1", "ignore": "^5.2.4", "jsonschema": "^1.4.1", "minimatch": "^3.1.2", "punycode": "^2.3.0", - "semver": "^7.3.8", + "semver": "^7.5.0", + "table": "^6.8.1", "yaml": "1.10.2" }, "engines": { @@ -7342,12 +7437,49 @@ "inBundle": true, "license": "Apache-2.0" }, - "node_modules/aws-cdk-lib/node_modules/at-least-node": { - "version": "1.0.0", + "node_modules/aws-cdk-lib/node_modules/ajv": { + "version": "8.12.0", "inBundle": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">= 4.0.0" + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/astral-regex": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, "node_modules/aws-cdk-lib/node_modules/balanced-match": { @@ -7372,27 +7504,52 @@ "node": ">= 0.8.0" } }, - "node_modules/aws-cdk-lib/node_modules/concat-map": { - "version": "0.0.1", + "node_modules/aws-cdk-lib/node_modules/color-convert": { + "version": "2.0.1", "inBundle": true, - "license": "MIT" - }, - "node_modules/aws-cdk-lib/node_modules/fs-extra": { - "version": "9.1.0", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/aws-cdk-lib/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/concat-map": { + "version": "0.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/emoji-regex": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fast-deep-equal": { + "version": "3.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/aws-cdk-lib/node_modules/fs-extra": { + "version": "11.1.1", "inBundle": true, "license": "MIT", "dependencies": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=14.14" } }, "node_modules/aws-cdk-lib/node_modules/graceful-fs": { - "version": "4.2.10", + "version": "4.2.11", "inBundle": true, "license": "ISC" }, @@ -7404,6 +7561,19 @@ "node": ">= 4" } }, + "node_modules/aws-cdk-lib/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/json-schema-traverse": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, "node_modules/aws-cdk-lib/node_modules/jsonfile": { "version": "6.1.0", "inBundle": true, @@ -7423,6 +7593,11 @@ "node": "*" } }, + "node_modules/aws-cdk-lib/node_modules/lodash.truncate": { + "version": "4.4.2", + "inBundle": true, + "license": "MIT" + }, "node_modules/aws-cdk-lib/node_modules/lru-cache": { "version": "6.0.0", "inBundle": true, @@ -7453,8 +7628,16 @@ "node": ">=6" } }, + "node_modules/aws-cdk-lib/node_modules/require-from-string": { + "version": "2.0.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/aws-cdk-lib/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.0", "inBundle": true, "license": "ISC", "dependencies": { @@ -7467,6 +7650,61 @@ "node": ">=10" } }, + "node_modules/aws-cdk-lib/node_modules/slice-ansi": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/aws-cdk-lib/node_modules/string-width": { + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aws-cdk-lib/node_modules/table": { + "version": "6.8.1", + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/aws-cdk-lib/node_modules/universalify": { "version": "2.0.0", "inBundle": true, @@ -7475,6 +7713,14 @@ "node": ">= 10.0.0" } }, + "node_modules/aws-cdk-lib/node_modules/uri-js": { + "version": "4.4.1", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/aws-cdk-lib/node_modules/yallist": { "version": "4.0.0", "inBundle": true, @@ -7714,11 +7960,6 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, "node_modules/bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", @@ -7731,9 +7972,9 @@ "dev": true }, "node_modules/big-integer": { - "version": "1.6.36", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", - "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", "engines": { "node": ">=0.6" } @@ -7751,24 +7992,12 @@ } }, "node_modules/bigint-crypto-utils": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz", - "integrity": "sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==", - "dev": true, - "dependencies": { - "bigint-mod-arith": "^3.1.0" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/bigint-mod-arith": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz", - "integrity": "sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.2.2.tgz", + "integrity": "sha512-U1RbE3aX9ayCUVcIPHuPDPKcK3SFOXf93J1UK/iHlJuQB7bhagPIX06/CLpLEsDThJ7KA4Dhrnzynl+d2weTiw==", "dev": true, "engines": { - "node": ">=10.4.0" + "node": ">=14.0.0" } }, "node_modules/bignumber.js": { @@ -7796,11 +8025,6 @@ "file-uri-to-path": "1.0.0" } }, - "node_modules/bindings/node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, "node_modules/bip174": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/bip174/-/bip174-2.1.0.tgz", @@ -7885,6 +8109,20 @@ "readable-stream": "^3.4.0" } }, + "node_modules/bl/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==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/blake-hash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/blake-hash/-/blake-hash-2.0.0.tgz", @@ -7904,6 +8142,19 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" }, + "node_modules/blake-hash/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/blakejs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", @@ -7950,6 +8201,17 @@ "ms": "2.0.0" } }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -7977,19 +8239,19 @@ "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" }, "node_modules/boxen": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.2.tgz", - "integrity": "sha512-1Z4UJabXUP1/R9rLpoU3O2lEMnG3pPLAs/ZD2lF3t2q7qD5lM8rqbtnvtvm4N0wEyNlE+9yZVTVAGmd1V5jabg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.0.tgz", + "integrity": "sha512-ScG8CDo8dj7McqCZ5hz4dIBp20xj4unQ2lXIDa7ff6RcZElCpuNzutdwzKVvRikfNjm7CFAlR3HJHcoHkDOExQ==", "dev": true, "dependencies": { "ansi-align": "^3.0.1", - "camelcase": "^7.0.0", - "chalk": "^5.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", "cli-boxes": "^3.0.0", "string-width": "^5.1.2", "type-fest": "^2.13.0", "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" + "wrap-ansi": "^8.1.0" }, "engines": { "node": ">=14.16" @@ -8090,13 +8352,25 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, "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==", + "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -8159,9 +8433,9 @@ "dev": true }, "node_modules/browser-tabs-lock": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/browser-tabs-lock/-/browser-tabs-lock-1.2.15.tgz", - "integrity": "sha512-J8K9vdivK0Di+b8SBdE7EZxDr88TnATing7XoLw6+nFkXMQ6sVBh92K3NQvZlZU91AIkFRi0w3sztk5Z+vsswA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-tabs-lock/-/browser-tabs-lock-1.3.0.tgz", + "integrity": "sha512-g6nHaobTiT0eMZ7jh16YpD2kcjAp+PInbiVq3M1x6KKaEIVhT4v9oURNIpZLOZ3LQbQ3XYfNhMAb/9hzNLIWrw==", "hasInstallScript": true, "dependencies": { "lodash": ">=4.17.21" @@ -8287,6 +8561,19 @@ "safe-buffer": "^5.2.0" } }, + "node_modules/browserify-sign/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/browserify-zlib": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", @@ -8304,62 +8591,6 @@ "ieee754": "^1.1.4" } }, - "node_modules/browserify/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/browserify/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/browserify/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" - }, - "node_modules/browserify/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/browserify/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/browserify/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/browserslist": { "version": "4.21.5", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", @@ -8532,13 +8763,28 @@ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", "dev": true, "dependencies": { - "streamsearch": "^1.1.0" + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dev": true, + "dependencies": { + "streamsearch": "^1.1.0" }, "engines": { "node": ">=10.16.0" @@ -8581,9 +8827,9 @@ } }, "node_modules/cacheable-request": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.8.tgz", - "integrity": "sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==", + "version": "10.2.10", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.10.tgz", + "integrity": "sha512-v6WB+Epm/qO4Hdlio/sfUn69r5Shgh39SsE9DSd4bIezP0mblOlObI+I0kUEM7J0JFc+I7pSeMeYaOYtX1N/VQ==", "dev": true, "dependencies": { "@types/http-cache-semantics": "^4.0.1", @@ -8642,9 +8888,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001466", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001466.tgz", - "integrity": "sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==", + "version": "1.0.30001487", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001487.tgz", + "integrity": "sha512-83564Z3yWGqXsh2vaH/mhXfEM0wX+NlBCm1jYHOb97TrTWJEmPTccZgeLTPBUUb0PNVo+oomb7wkimZBIERClA==", "funding": [ { "type": "opencollective", @@ -8653,9 +8899,21 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, + "node_modules/case": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", + "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -8669,6 +8927,14 @@ "big-integer": "1.6.36" } }, + "node_modules/cashaddrjs/node_modules/big-integer": { + "version": "1.6.36", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", + "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/catering": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", @@ -8739,14 +9005,14 @@ "dev": true }, "node_modules/chart.js": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.2.1.tgz", - "integrity": "sha512-6YbpQ0nt3NovAgOzbkSSeeAQu/3za1319dPUQTXn9WcOpywM8rGKxJHrhS8V8xEkAlk8YhEfjbuAPfUyp6jIsw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.3.0.tgz", + "integrity": "sha512-ynG0E79xGfMaV2xAHdbhwiPLczxnNNnasrmPEXriXsPJGjmhOBYzFVEsB65w2qMDz+CaBJJuJD0inE/ab/h36g==", "dependencies": { "@kurkle/color": "^0.3.0" }, "engines": { - "pnpm": "^7.0.0" + "pnpm": ">=7" } }, "node_modules/check-error": { @@ -8895,16 +9161,16 @@ "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" }, "node_modules/classic-level": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", - "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", + "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", "dev": true, "hasInstallScript": true, "dependencies": { "abstract-level": "^1.0.2", "catering": "^2.1.0", "module-error": "^1.0.1", - "napi-macros": "~2.0.0", + "napi-macros": "^2.2.2", "node-gyp-build": "^4.3.0" }, "engines": { @@ -8945,9 +9211,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", "dev": true, "engines": { "node": ">=6" @@ -9083,7 +9349,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -9094,13 +9359,12 @@ "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==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "node_modules/combine-source-map": { @@ -9114,24 +9378,6 @@ "source-map": "~0.5.3" } }, - "node_modules/combine-source-map/node_modules/convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==" - }, - "node_modules/combine-source-map/node_modules/lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==" - }, - "node_modules/combine-source-map/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -9269,12 +9515,11 @@ } }, "node_modules/commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", - "dev": true, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "engines": { - "node": ">=14" + "node": ">= 10" } }, "node_modules/compare-versions": { @@ -9302,38 +9547,6 @@ "typedarray": "^0.0.6" } }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/config-chain": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", @@ -9392,11 +9605,11 @@ "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" }, "node_modules/constructs": { - "version": "10.1.278", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.1.278.tgz", - "integrity": "sha512-F1JfBAglyMTAbtrA74z1tOST9RYSETkMVZcoYCggtPTMNEZsAMnu9qFxA5Z19m75XcAWLSAts8cLNJZH27alTA==", + "version": "10.2.25", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.2.25.tgz", + "integrity": "sha512-hNhL7Lq+MZ/6QGaa5BWsuBMKmj30Wr81AjJaQfyGN5W9sZmJXAoI/ZEgRxTHCqkB6o5QB0bnlrZc2mwwnqFsSg==", "engines": { - "node": ">= 14.17.0" + "node": ">= 16.14.0" } }, "node_modules/content-disposition": { @@ -9429,10 +9642,9 @@ } }, "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==" }, "node_modules/cookie": { "version": "0.5.0", @@ -9461,9 +9673,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.29.1.tgz", - "integrity": "sha512-QmchCua884D8wWskMX8tW5ydINzd8oSJVx38lx/pVkFGqztxt73GYre3pm/hyYq8bPf+MW5In4I/uRShFDsbrA==", + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", + "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", "dependencies": { "browserslist": "^4.21.5" }, @@ -9490,9 +9702,9 @@ } }, "node_modules/cosmiconfig": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.0.tgz", - "integrity": "sha512-0tLZ9URlPGU7JsKq0DQOQ3FoRsYX8xDZ7xMiATQfaiGMz7EHowNkbU9u1coAOmnh9p/1ySpm0RB3JNWRXM5GCg==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", + "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", "dev": true, "dependencies": { "import-fresh": "^3.2.1", @@ -9564,30 +9776,12 @@ "dev": true }, "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/cross-fetch/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.6.tgz", + "integrity": "sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==", "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "node-fetch": "^2.6.7", + "whatwg-fetch": "^2.0.4" } }, "node_modules/cross-spawn": { @@ -9670,9 +9864,9 @@ } }, "node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/d": { "version": "1.0.1", @@ -9684,9 +9878,9 @@ } }, "node_modules/d3": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.2.tgz", - "integrity": "sha512-WXty7qOGSHb7HR7CfOzwN1Gw04MUOzN8qh9ZUsvwycIMb4DYMpY9xczZ6jUorGtO6bR9BPMPaueIKwiDxu9uiQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.4.tgz", + "integrity": "sha512-q2WHStdhiBtD8DMmhDPyJmXUxr6VWRngKyiJ5EfXMxPw+tqT6BhNjhJZ4w3BHsNm3QoVfZLY8Orq/qPFczwKRA==", "dependencies": { "d3-array": "3", "d3-axis": "3", @@ -9724,9 +9918,9 @@ } }, "node_modules/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.3.tgz", + "integrity": "sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ==", "dependencies": { "internmap": "1 - 2" }, @@ -9788,9 +9982,9 @@ } }, "node_modules/d3-delaunay": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", - "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", "dependencies": { "delaunator": "5" }, @@ -9842,25 +10036,6 @@ "node": ">=12" } }, - "node_modules/d3-dsv/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/d3-dsv/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/d3-ease": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", @@ -10089,12 +10264,12 @@ } }, "node_modules/data-uri-to-buffer": { - "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==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", "dev": true, "engines": { - "node": ">= 12" + "node": ">= 6" } }, "node_modules/dayjs": { @@ -10119,15 +10294,11 @@ } }, "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/decimal.js": { @@ -10201,106 +10372,274 @@ "dev": true }, "node_modules/deepmerge": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", - "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", "dev": true, "dependencies": { - "clone": "^1.0.2" + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/degenerator": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", - "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", + "node_modules/default-browser/node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", "dev": true, "dependencies": { - "ast-types": "^0.13.2", - "escodegen": "^1.8.1", - "esprima": "^4.0.0", - "vm2": "^3.9.8" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">= 6" + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/delaunator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", - "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", - "dependencies": { - "robust-predicates": "^3.0.0" + "node_modules/default-browser/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" } }, - "node_modules/delay": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", - "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "node_modules/default-browser/node_modules/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, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/default-browser/node_modules/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, "engines": { - "node": ">=0.4.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/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, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/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, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/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, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defender-base-client": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/defender-base-client/-/defender-base-client-1.44.0.tgz", + "integrity": "sha512-8ZgGA93+FlxNwG9LN1nu/Au5AyCKwAWJGNf0VLiPmh4GX/Nali/7kv72K+OtZgGxTLtKDKfgN4cnhEZwfrc8dg==", + "dev": true, + "dependencies": { + "amazon-cognito-identity-js": "^6.0.1", + "async-retry": "^1.3.3", + "axios": "^0.21.2", + "lodash": "^4.17.19", + "node-fetch": "^2.6.0" + } + }, + "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==", + "engines": { + "node": ">=10" + } + }, + "node_modules/deferred-leveldown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", + "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", + "dependencies": { + "abstract-leveldown": "~2.6.0" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/degenerator": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.4.tgz", + "integrity": "sha512-Z66uPeBfHZAHVmue3HPfyKu2Q0rC2cRxbTOsvmU/po5fvvcx27W4mIu9n0PUlQih4oUYvcG1BsbtVv8x7KDOSw==", + "dev": true, + "dependencies": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.17" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, + "node_modules/delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" } }, "node_modules/depd": { @@ -10419,9 +10758,9 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/dijkstrajs": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.2.tgz", - "integrity": "sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==" }, "node_modules/dir-glob": { "version": "3.0.1", @@ -10505,38 +10844,6 @@ "readable-stream": "^2.0.2" } }, - "node_modules/duplexer2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexer2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/dynamic-dedupe": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", @@ -10574,10 +10881,33 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, + "node_modules/eip55": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eip55/-/eip55-2.1.0.tgz", + "integrity": "sha512-jtOfFne69XvSYz58oBXqfKHk1cJwwHcAzKm9jbzOKsedKEaulMPCA4fq2UXS9NaxkdVOdbSG0kg7fM09+K4gjw==", + "dependencies": { + "keccak": "^1.3.0" + } + }, + "node_modules/eip55/node_modules/keccak": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-1.4.0.tgz", + "integrity": "sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.2.1", + "inherits": "^2.0.3", + "nan": "^2.2.1", + "safe-buffer": "^5.1.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/electron-to-chromium": { - "version": "1.4.330", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.330.tgz", - "integrity": "sha512-PqyefhybrVdjAJ45HaPLtuVaehiSw7C3ya0aad+rvmV53IVyXmYRk3pwIOb2TxTDTnmgQdn46NjMMaysx79/6Q==" + "version": "1.4.396", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.396.tgz", + "integrity": "sha512-pqKTdqp/c5vsrc0xUPYXTDBo9ixZuGY8es4ZOjjd6HD6bFYbu5QA09VoW3fkY4LF1T0zYk86lN6bZnNlBuOpdQ==" }, "node_modules/elliptic": { "version": "6.5.4", @@ -10830,9 +11160,9 @@ } }, "node_modules/esbuild": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.11.tgz", - "integrity": "sha512-pAMImyokbWDtnA/ufPxjQg0fYo2DDuzAlqwnDvbXqHLphe+m80eF++perYKVm8LeTuj2zUuFXC+xgSVxyoHUdg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", "dev": true, "hasInstallScript": true, "bin": { @@ -10842,28 +11172,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.11", - "@esbuild/android-arm64": "0.17.11", - "@esbuild/android-x64": "0.17.11", - "@esbuild/darwin-arm64": "0.17.11", - "@esbuild/darwin-x64": "0.17.11", - "@esbuild/freebsd-arm64": "0.17.11", - "@esbuild/freebsd-x64": "0.17.11", - "@esbuild/linux-arm": "0.17.11", - "@esbuild/linux-arm64": "0.17.11", - "@esbuild/linux-ia32": "0.17.11", - "@esbuild/linux-loong64": "0.17.11", - "@esbuild/linux-mips64el": "0.17.11", - "@esbuild/linux-ppc64": "0.17.11", - "@esbuild/linux-riscv64": "0.17.11", - "@esbuild/linux-s390x": "0.17.11", - "@esbuild/linux-x64": "0.17.11", - "@esbuild/netbsd-x64": "0.17.11", - "@esbuild/openbsd-x64": "0.17.11", - "@esbuild/sunos-x64": "0.17.11", - "@esbuild/win32-arm64": "0.17.11", - "@esbuild/win32-ia32": "0.17.11", - "@esbuild/win32-x64": "0.17.11" + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" } }, "node_modules/esbuild-android-64": { @@ -11123,12 +11453,12 @@ } }, "node_modules/esbuild-plugins-node-modules-polyfill": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/esbuild-plugins-node-modules-polyfill/-/esbuild-plugins-node-modules-polyfill-1.0.10.tgz", - "integrity": "sha512-PtxxvxBNmVNOm+fzcyEoNSXd1YZh1o691cTdNNWErXq9DzDqy6I4MxjLNnQ5C/XqOQwRqoX3x4cz7ouQ+6Ig1A==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/esbuild-plugins-node-modules-polyfill/-/esbuild-plugins-node-modules-polyfill-1.0.13.tgz", + "integrity": "sha512-zRy1yO9dHD8FUJteb7AQyfBSQzm9Jz9gaN6sibgow2oVOPd9PQw0GWkLTK8EqrL2TKwA8ZETX7N/fr29N3iDPQ==", "dev": true, "dependencies": { - "modern-node-polyfills": "^0.1.0" + "modern-node-polyfills": "^0.1.3" } }, "node_modules/esbuild-sunos-64": { @@ -11196,9 +11526,9 @@ } }, "node_modules/esbuild/node_modules/@esbuild/android-arm": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.11.tgz", - "integrity": "sha512-CdyX6sRVh1NzFCsf5vw3kULwlAhfy9wVt8SZlrhQ7eL2qBjGbFhRBWkkAzuZm9IIEOCKJw4DXA6R85g+qc8RDw==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", "cpu": [ "arm" ], @@ -11212,9 +11542,9 @@ } }, "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { - "version": "0.17.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.11.tgz", - "integrity": "sha512-aCWlq70Q7Nc9WDnormntGS1ar6ZFvUpqr8gXtO+HRejRYPweAFQN615PcgaSJkZjhHp61+MNLhzyVALSF2/Q0g==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", "cpu": [ "loong64" ], @@ -11325,6 +11655,16 @@ "node": ">= 0.8.0" } }, + "node_modules/escodegen/node_modules/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, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/escodegen/node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -11338,15 +11678,15 @@ } }, "node_modules/eslint": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", - "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.1", - "@eslint/js": "8.36.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.40.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -11356,9 +11696,9 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.5.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -11455,18 +11795,21 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -11474,6 +11817,9 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/estraverse": { @@ -11498,14 +11844,14 @@ } }, "node_modules/espree": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", - "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -11679,25 +12025,6 @@ "safe-event-emitter": "^1.0.1" } }, - "node_modules/eth-json-rpc-infura/node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/eth-json-rpc-middleware": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz", @@ -11729,28 +12056,6 @@ "node": ">=0.8" } }, - "node_modules/eth-json-rpc-middleware/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/eth-json-rpc-middleware/node_modules/ethereumjs-util": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", @@ -11774,25 +12079,6 @@ "safe-event-emitter": "^1.0.1" } }, - "node_modules/eth-json-rpc-middleware/node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/eth-json-rpc-middleware/node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -11866,28 +12152,6 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/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" - } - }, "node_modules/eth-sig-util/node_modules/ethereumjs-util": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", @@ -11916,15 +12180,25 @@ "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==" }, "node_modules/ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", - "dev": true, + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, "node_modules/ethereumjs-abi": { @@ -11936,11 +12210,33 @@ "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": "*" + } + }, "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/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==", + "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-account": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", @@ -11956,28 +12252,6 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/ethereumjs-account/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/ethereumjs-account/node_modules/ethereumjs-util": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", @@ -12005,49 +12279,11 @@ "merkle-patricia-tree": "^2.1.2" } }, - "node_modules/ethereumjs-block/node_modules/abstract-leveldown": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", - "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", - "dependencies": { - "xtend": "~4.0.0" - } - }, "node_modules/ethereumjs-block/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-block/node_modules/deferred-leveldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", - "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", - "dependencies": { - "abstract-leveldown": "~2.6.0" - } - }, - "node_modules/ethereumjs-block/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/ethereumjs-block/node_modules/ethereumjs-util": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", @@ -12062,549 +12298,107 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/ethereumjs-block/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/ethereumjs-block/node_modules/level-codec": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", - "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" - }, - "node_modules/ethereumjs-block/node_modules/level-errors": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", - "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", - "dependencies": { - "errno": "~0.1.1" - } - }, - "node_modules/ethereumjs-block/node_modules/level-iterator-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", - "integrity": "sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==", - "dependencies": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - } - }, - "node_modules/ethereumjs-block/node_modules/level-iterator-stream/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/ethereumjs-block/node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ethereumjs-block/node_modules/level-iterator-stream/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "node_modules/ethereumjs-block/node_modules/level-ws": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", - "integrity": "sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==", - "dependencies": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - } - }, - "node_modules/ethereumjs-block/node_modules/level-ws/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/ethereumjs-block/node_modules/level-ws/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ethereumjs-block/node_modules/level-ws/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "node_modules/ethereumjs-block/node_modules/level-ws/node_modules/xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", - "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/ethereumjs-block/node_modules/levelup": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", - "dependencies": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" - } - }, - "node_modules/ethereumjs-block/node_modules/memdown": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", - "integrity": "sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==", - "dependencies": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" - } - }, - "node_modules/ethereumjs-block/node_modules/memdown/node_modules/abstract-leveldown": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", - "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", - "dependencies": { - "xtend": "~4.0.0" - } - }, - "node_modules/ethereumjs-block/node_modules/merkle-patricia-tree": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", - "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", - "dependencies": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" - } - }, - "node_modules/ethereumjs-block/node_modules/merkle-patricia-tree/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" - }, - "node_modules/ethereumjs-block/node_modules/object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" - }, - "node_modules/ethereumjs-block/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/ethereumjs-block/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/ethereumjs-block/node_modules/semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/ethereumjs-block/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/ethereumjs-common": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz", - "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==", - "deprecated": "New package name format for new versions: @ethereumjs/common. Please update." + "node_modules/ethereumjs-common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz", + "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==", + "deprecated": "New package name format for new versions: @ethereumjs/common. Please update." }, "node_modules/ethereumjs-tx": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", "deprecated": "New package name format for new versions: @ethereumjs/tx. Please update.", - "dependencies": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" - } - }, - "node_modules/ethereumjs-tx/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-tx/node_modules/ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ==" - }, - "node_modules/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/ethereumjs-tx/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "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==", - "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/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": "*" - } - }, - "node_modules/ethereumjs-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/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/ethereumjs-vm": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", - "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", - "deprecated": "New package name format for new versions: @ethereumjs/vm. Please update.", - "dependencies": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ethereumjs-vm/node_modules/abstract-leveldown": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz", - "integrity": "sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==", - "dependencies": { - "xtend": "~4.0.0" - } - }, - "node_modules/ethereumjs-vm/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-vm/node_modules/deferred-leveldown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz", - "integrity": "sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA==", - "dependencies": { - "abstract-leveldown": "~2.6.0" - } - }, - "node_modules/ethereumjs-vm/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/ethereumjs-vm/node_modules/ethereumjs-block": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", - "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", - "deprecated": "New package name format for new versions: @ethereumjs/block. Please update.", - "dependencies": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } - }, - "node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", - "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", - "deprecated": "New package name format for new versions: @ethereumjs/tx. Please update.", - "dependencies": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" - } - }, - "node_modules/ethereumjs-vm/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/ethereumjs-vm/node_modules/level-codec": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", - "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" - }, - "node_modules/ethereumjs-vm/node_modules/level-errors": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", - "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", - "dependencies": { - "errno": "~0.1.1" - } - }, - "node_modules/ethereumjs-vm/node_modules/level-iterator-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", - "integrity": "sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==", - "dependencies": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" - } - }, - "node_modules/ethereumjs-vm/node_modules/level-iterator-stream/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/ethereumjs-vm/node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/ethereumjs-vm/node_modules/level-iterator-stream/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "node_modules/ethereumjs-vm/node_modules/level-ws": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", - "integrity": "sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==", - "dependencies": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" - } - }, - "node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "dependencies": { + "ethereum-common": "^0.0.18", + "ethereumjs-util": "^5.0.0" } }, - "node_modules/ethereumjs-vm/node_modules/level-ws/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + "node_modules/ethereumjs-tx/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-vm/node_modules/level-ws/node_modules/xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", + "node_modules/ethereumjs-tx/node_modules/ethereum-common": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", + "integrity": "sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ==" + }, + "node_modules/ethereumjs-tx/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", "dependencies": { - "object-keys": "~0.4.0" - }, - "engines": { - "node": ">=0.4" + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/ethereumjs-vm/node_modules/levelup": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", + "node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/ethereumjs-vm/node_modules/memdown": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", - "integrity": "sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==", + "node_modules/ethereumjs-vm": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", + "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", + "deprecated": "New package name format for new versions: @ethereumjs/vm. Please update.", "dependencies": { - "abstract-leveldown": "~2.7.1", + "async": "^2.1.2", + "async-eventemitter": "^0.2.2", + "ethereumjs-account": "^2.0.3", + "ethereumjs-block": "~2.2.0", + "ethereumjs-common": "^1.1.0", + "ethereumjs-util": "^6.0.0", + "fake-merkle-patricia-tree": "^1.0.1", "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" + "merkle-patricia-tree": "^2.3.2", + "rustbn.js": "~0.2.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/ethereumjs-vm/node_modules/memdown/node_modules/abstract-leveldown": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", - "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", + "node_modules/ethereumjs-vm/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": { - "xtend": "~4.0.0" + "@types/node": "*" } }, - "node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", - "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", + "node_modules/ethereumjs-vm/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-vm/node_modules/ethereumjs-block": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", + "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", + "deprecated": "New package name format for new versions: @ethereumjs/block. Please update.", "dependencies": { - "async": "^1.4.2", + "async": "^2.0.1", + "ethereumjs-common": "^1.5.0", + "ethereumjs-tx": "^2.1.1", "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" + "merkle-patricia-tree": "^2.1.2" } }, - "node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" - }, - "node_modules/ethereumjs-vm/node_modules/merkle-patricia-tree/node_modules/ethereumjs-util": { + "node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", @@ -12618,44 +12412,28 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/ethereumjs-vm/node_modules/object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" - }, - "node_modules/ethereumjs-vm/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", + "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", + "deprecated": "New package name format for new versions: @ethereumjs/tx. Please update.", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/ethereumjs-vm/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/ethereumjs-vm/node_modules/semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "bin": { - "semver": "bin/semver" + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" } }, - "node_modules/ethereumjs-vm/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/ethereumjs-vm/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==", "dependencies": { - "safe-buffer": "~5.1.0" + "@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/ethers": { @@ -12916,6 +12694,18 @@ "node": ">=4" } }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -12940,6 +12730,12 @@ "checkpoint-store": "^1.1.0" } }, + "node_modules/fast-base64-decode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", + "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==", + "dev": true + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -13091,13 +12887,9 @@ } }, "node_modules/file-uri-to-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", - "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", - "dev": true, - "engines": { - "node": ">= 6" - } + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, "node_modules/fill-range": { "version": "7.0.1", @@ -13232,6 +13024,19 @@ "node": "*" } }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/form-data-encoder": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", @@ -13298,7 +13103,6 @@ "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, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -13418,10 +13222,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/fx": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/fx/-/fx-28.0.0.tgz", + "integrity": "sha512-vKQDA9g868cZiW8ulgs2uN1yx1i7/nsS33jTMOxekk0Z03BJLffVcdW6AVD32fWb3E6RtmWWuBXBZOk8cLXFNQ==", + "dev": true, + "bin": { + "fx": "index.js" + } + }, "node_modules/ganache": { - "version": "7.7.7", - "resolved": "https://registry.npmjs.org/ganache/-/ganache-7.7.7.tgz", - "integrity": "sha512-kZUuOcgDQBtbxzs4iB3chg1iAc28s2ffdOdzyTTzo4vr9sb843w4PbWd5v1hsIqtcNjurcpLaW8XRp/cw2u++g==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/ganache/-/ganache-7.8.0.tgz", + "integrity": "sha512-IrUYvsaE/m2/NaVIZ7D/gCnsmyU/buechnH6MhUipzG1qJcZIwIp/DoP/LZUcHyhy0Bv0NKZD2pGOjpRhn7l7A==", "bundleDependencies": [ "@trufflesuite/bigint-buffer", "keccak", @@ -13432,6 +13245,7 @@ "hasShrinkwrap": true, "dependencies": { "@trufflesuite/bigint-buffer": "1.1.10", + "@trufflesuite/uws-js-unofficial": "20.10.0-unofficial.2", "@types/bn.js": "^5.1.0", "@types/lru-cache": "5.1.1", "@types/seedrandom": "3.0.1", @@ -13480,6 +13294,19 @@ "node-gyp-build-test": "build-test.js" } }, + "node_modules/ganache/node_modules/@trufflesuite/uws-js-unofficial": { + "version": "20.10.0-unofficial.2", + "resolved": "https://registry.npmjs.org/@trufflesuite/uws-js-unofficial/-/uws-js-unofficial-20.10.0-unofficial.2.tgz", + "integrity": "sha512-oQQlnS3oNeGsgS4K3KCSSavJgSb0W9D5ktZs4FacX9VbM7b+NlhjH96d6/G4fMrz+bc5MXRyco419on0X0dvRA==", + "dev": true, + "dependencies": { + "ws": "8.2.3" + }, + "optionalDependencies": { + "bufferutil": "4.0.5", + "utf-8-validate": "5.0.7" + } + }, "node_modules/ganache/node_modules/@types/bn.js": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", @@ -13998,6 +13825,12 @@ "inBundle": true, "license": "MIT" }, + "node_modules/ganache/node_modules/ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "dev": true + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -14028,12 +13861,13 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -14077,9 +13911,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.4.0.tgz", - "integrity": "sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", + "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", "dev": true, "funding": { "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" @@ -14102,10 +13936,10 @@ "node": ">= 6" } }, - "node_modules/get-uri/node_modules/data-uri-to-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", - "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "node_modules/get-uri/node_modules/file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", "dev": true, "engines": { "node": ">= 6" @@ -14139,18 +13973,19 @@ } }, "node_modules/glob": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.0.tgz", - "integrity": "sha512-EAZejC7JvnQINayvB/7BJbpZpNOJ8Lrw2OZNEvQxe0vaLn1SuwMcfV7/MNaX8L/T0wmptBFI4YMtDvSBxYDc7w==", - "dev": true, + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { "fs.realpath": "^1.0.0", - "minimatch": "^7.4.1", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -14168,30 +14003,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob/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, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.2.tgz", - "integrity": "sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/global": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", @@ -14303,9 +14114,9 @@ } }, "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==" }, "node_modules/grapheme-splitter": { "version": "1.0.4", @@ -14334,6 +14145,15 @@ "uglify-js": "^3.1.4" } }, + "node_modules/handlebars/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -14356,23 +14176,23 @@ } }, "node_modules/hardhat": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", - "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.14.0.tgz", + "integrity": "sha512-73jsInY4zZahMSVFurSK+5TNCJTXMv+vemvGia0Ac34Mm19fYp6vEPVGF3sucbumszsYxiTT2TbS8Ii2dsDSoQ==", "dev": true, "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-evm": "^1.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "@nomicfoundation/ethereumjs-vm": "^6.0.0", + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-blockchain": "7.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-evm": "2.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-statemanager": "2.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-vm": "7.0.1", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "@types/bn.js": "^5.1.0", @@ -14431,6 +14251,18 @@ } } }, + "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==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, "node_modules/hardhat/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -14487,6 +14319,18 @@ "node": ">=0.8.0" } }, + "node_modules/hardhat/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dev": true, + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, "node_modules/hardhat/node_modules/find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -14674,7 +14518,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -14732,6 +14575,19 @@ "node": ">=4" } }, + "node_modules/hash-base/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", @@ -14932,11 +14788,11 @@ "integrity": "sha512-198g3lHrs1nMr4FBfJL3cBMl89NhJat342c684JVYJPlPpjFY2RBZAzD/rpAtg8LIOGXzNjcZzIb+IQCfY4Dqw==" }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" @@ -14984,7 +14840,6 @@ "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, "engines": { "node": ">= 4" } @@ -15101,44 +14956,36 @@ "source-map": "~0.5.3" } }, - "node_modules/inline-source-map/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/inquirer": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.1.4.tgz", - "integrity": "sha512-9hiJxE5gkK/cM2d1mTEnuurGTAoHebbkX0BYl3h7iEg7FYfuNIom+nDfBCSWtvSnoSrWCeBxqqBZu26xdlJlXA==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.0.tgz", + "integrity": "sha512-WWERbVqjsTXjXub1ZW0ZHDit1dyHqy0T9XIkky9TnmKAPrjU9Jkd59nZPK0dUuM3s73GZAZu2Jo4iFU3XSPVLA==", "dev": true, "dependencies": { "ansi-escapes": "^6.0.0", - "chalk": "^5.1.2", + "chalk": "^5.2.0", "cli-cursor": "^4.0.0", "cli-width": "^4.0.0", "external-editor": "^3.0.3", "figures": "^5.0.0", "lodash": "^4.17.21", - "mute-stream": "0.0.8", + "mute-stream": "1.0.0", "ora": "^6.1.2", "run-async": "^2.4.0", - "rxjs": "^7.5.7", + "rxjs": "^7.8.0", "string-width": "^5.1.2", "strip-ansi": "^7.0.1", "through": "^2.3.6", - "wrap-ansi": "^8.0.1" + "wrap-ansi": "^8.1.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.18.0" } }, "node_modules/inquirer/node_modules/ansi-escapes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.0.0.tgz", - "integrity": "sha512-IG23inYII3dWlU2EyiAiGj6Bwal5GzsgPMwjYGvc1HPE2dgbj4ZB5ToWBKSquKw74nB3TIuOwaI6/jSULzfgrw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", + "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", "dev": true, "dependencies": { "type-fest": "^3.0.0" @@ -15233,15 +15080,18 @@ } }, "node_modules/inquirer/node_modules/type-fest": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.6.1.tgz", - "integrity": "sha512-htXWckxlT6U4+ilVgweNliPqlsVSSucbxVexRYllyMVJDtf5rTjv6kF/s+qAd4QSL1BZcnJPEJavYBPQiWuZDA==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.10.0.tgz", + "integrity": "sha512-hmAPf1datm+gt3c2mvu0sJyhFy6lTkIGf0GzyaZWxRLnabQfPUqg6tF95RPg6sLxKI7nFLGdFxBcf2/7+GXI+A==", "dev": true, "engines": { "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" + }, + "peerDependencies": { + "typescript": ">=4.7.0" } }, "node_modules/inquirer/node_modules/wrap-ansi": { @@ -15281,11 +15131,6 @@ "insert-module-globals": "bin/cmd.js" } }, - "node_modules/insert-module-globals/node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, "node_modules/int64-buffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-1.0.1.tgz", @@ -15432,27 +15277,9 @@ } }, "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "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" - } - ], - "engines": { - "node": ">=4" - } + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "node_modules/is-callable": { "version": "1.2.7", @@ -15478,9 +15305,9 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", "dependencies": { "has": "^1.0.3" }, @@ -15504,15 +15331,15 @@ } }, "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -15596,6 +15423,24 @@ "npm": ">=3" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-installed-globally": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", @@ -15882,6 +15727,21 @@ "node": ">=8" } }, + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-yarn-global": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", @@ -15902,6 +15762,16 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/isomorphic-unfetch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", + "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", + "dev": true, + "dependencies": { + "node-fetch": "^2.6.1", + "unfetch": "^4.2.0" + } + }, "node_modules/isomorphic-ws": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", @@ -15915,6 +15785,22 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, + "node_modules/issue-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "dev": true, + "dependencies": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + }, + "engines": { + "node": ">=10.13" + } + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -15977,6 +15863,15 @@ "node": ">=10" } }, + "node_modules/istanbul-lib-source-maps/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/istanbul-reports": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", @@ -16197,26 +16092,6 @@ } } }, - "node_modules/jest-config/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "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/jest-diff": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", @@ -16464,6 +16339,15 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-runner/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jest-runner/node_modules/source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", @@ -16507,26 +16391,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "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/jest-snapshot": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", @@ -16656,6 +16520,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", + "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/jose": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.6.tgz", @@ -16670,10 +16543,16 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", + "dev": true + }, "node_modules/js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", "dev": true, "funding": { "type": "opencollective", @@ -16922,6 +16801,19 @@ "node": ">=10.0.0" } }, + "node_modules/keccak/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/keyv": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", @@ -16983,17 +16875,62 @@ "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", "dev": true, "dependencies": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/level" + } + }, + "node_modules/level-codec": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", + "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" + }, + "node_modules/level-errors": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", + "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", + "dependencies": { + "errno": "~0.1.1" + } + }, + "node_modules/level-iterator-stream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", + "integrity": "sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==", + "dependencies": { + "inherits": "^2.0.1", + "level-errors": "^1.0.3", + "readable-stream": "^1.0.33", + "xtend": "^4.0.0" + } + }, + "node_modules/level-iterator-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/level-iterator-stream/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, + "node_modules/level-iterator-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, "node_modules/level-supports": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", @@ -17016,6 +16953,74 @@ "node": ">=12" } }, + "node_modules/level-ws": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", + "integrity": "sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==", + "dependencies": { + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" + } + }, + "node_modules/level-ws/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/level-ws/node_modules/object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" + }, + "node_modules/level-ws/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/level-ws/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/level-ws/node_modules/xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", + "dependencies": { + "object-keys": "~0.4.0" + }, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/levelup": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", + "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", + "dependencies": { + "deferred-leveldown": "~1.2.1", + "level-codec": "~7.0.0", + "level-errors": "~1.0.3", + "level-iterator-stream": "~1.3.0", + "prr": "~1.0.1", + "semver": "~5.4.1", + "xtend": "~4.0.0" + } + }, + "node_modules/levelup/node_modules/semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -17039,9 +17044,9 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.10.24", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.24.tgz", - "integrity": "sha512-3Dk8f5AmrcWqg+oHhmm9hwSTqpWHBdSqsHmjCJGroULFubi0+x7JEIGmRZCuL3TI8Tx39xaKqfnhsDQ4ALa/Nw==" + "version": "1.10.30", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.30.tgz", + "integrity": "sha512-PLGc+xfrQrkya/YK2/5X+bPpxRmyJBHM+xxz9krUdSgk4Vs2ZwxX5/Ow0lv3r9PDlDtNWb4u+it8MY5rZ0IyGw==" }, "node_modules/lilconfig": { "version": "2.1.0", @@ -17064,9 +17069,9 @@ "dev": true }, "node_modules/lint-staged": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.0.tgz", - "integrity": "sha512-GbyK5iWinax5Dfw5obm2g2ccUiZXNGtAS4mCbJ0Lv4rq6iEtfBSjOYdcbOtAIFtM114t0vdpViDDetjVTSd8Vw==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", + "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", "dev": true, "dependencies": { "chalk": "5.2.0", @@ -17081,7 +17086,7 @@ "object-inspect": "^1.12.3", "pidtree": "^0.6.0", "string-argv": "^0.3.1", - "yaml": "^2.2.1" + "yaml": "^2.2.2" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -17105,6 +17110,15 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/lint-staged/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, + "engines": { + "node": ">=14" + } + }, "node_modules/lint-staged/node_modules/execa": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", @@ -17129,9 +17143,9 @@ } }, "node_modules/lint-staged/node_modules/human-signals": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.0.tgz", - "integrity": "sha512-zyzVyMjpGBX2+6cDVZeFPCdtOtdsxOeseRhB9tkQ6xXmGUNrcnBzdEKPy3VPNYz+4gy1oukVOXcrJCunSyc6QQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, "engines": { "node": ">=14.18.0" @@ -17441,6 +17455,12 @@ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true }, + "node_modules/lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", + "dev": true + }, "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -17451,12 +17471,29 @@ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, - "node_modules/lodash.memoize": { + "node_modules/lodash.escaperegexp": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", "dev": true }, + "node_modules/lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -17466,9 +17503,13 @@ "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true, - "peer": true + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "dev": true }, "node_modules/log-symbols": { "version": "5.1.0", @@ -17669,6 +17710,7 @@ "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, "dependencies": { "sourcemap-codec": "^1.4.8" } @@ -17745,6 +17787,32 @@ "node": ">= 0.6" } }, + "node_modules/memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==", + "dependencies": { + "abstract-leveldown": "~2.7.1", + "functional-red-black-tree": "^1.0.1", + "immediate": "^3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" + } + }, + "node_modules/memdown/node_modules/abstract-leveldown": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", + "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", + "dependencies": { + "xtend": "~4.0.0" + } + }, + "node_modules/memdown/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/memory-level": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", @@ -17793,6 +17861,45 @@ "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", "integrity": "sha512-XrNQvUbn1DL5hKNe46Ccs+Tu3/PYOlrcZILuGUhb95oKBPjc/nmIC8D462PQkipVDGKRvwhn+QFg2cCdIvmDJA==" }, + "node_modules/merkle-patricia-tree": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", + "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", + "dependencies": { + "async": "^1.4.2", + "ethereumjs-util": "^5.0.0", + "level-ws": "0.0.0", + "levelup": "^1.2.1", + "memdown": "^1.0.0", + "readable-stream": "^2.0.0", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" + } + }, + "node_modules/merkle-patricia-tree/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" + }, + "node_modules/merkle-patricia-tree/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/merkle-patricia-tree/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dependencies": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -17911,6 +18018,15 @@ "node": "*" } }, + "node_modules/minimatch/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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -17920,9 +18036,9 @@ } }, "node_modules/minipass": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz", - "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "dev": true, "engines": { "node": ">=8" @@ -18077,6 +18193,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/mocha/node_modules/glob/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/mocha/node_modules/glob/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -18138,21 +18264,24 @@ "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==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/mocha/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==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/mocha/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -18215,17 +18344,15 @@ "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" }, "node_modules/modern-node-polyfills": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/modern-node-polyfills/-/modern-node-polyfills-0.1.0.tgz", - "integrity": "sha512-/Z9mlC56KBxjLZvdNSLqSEFw9jSav43dsUxhLYLN3bZgcSX5VFdixat+QGjb/4NxaGCwW09ABJhZA5oHFj4W4A==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/modern-node-polyfills/-/modern-node-polyfills-0.1.3.tgz", + "integrity": "sha512-/4dB85Sdkt9MjWwtpKnsNTYhh0+fqjFC4ZEgDP4B0e6kyzbGUnX4NDxTUCaVwRLVF9gcEDcRQjol8pn05B3TUQ==", "dev": true, "dependencies": { "@jspm/core": "2.0.0-beta.24", - "@rollup/plugin-inject": "^4.0.4", - "acorn": "^8.8.0", - "esbuild": "^0.14.47", - "local-pkg": "^0.4.1", - "rollup": "^2.75.7" + "@rollup/pluginutils": "^3.1.0", + "esbuild": "^0.14.54", + "local-pkg": "^0.4.3" } }, "node_modules/modern-node-polyfills/node_modules/@esbuild/linux-loong64": { @@ -18607,57 +18734,25 @@ "dependencies": { "browser-resolve": "^2.0.0", "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.2.0", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "JSONStream": "^1.0.3", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "module-deps": "bin/cmd.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/module-deps/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/module-deps/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/module-deps/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/module-deps/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.2.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "module-deps": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8.0" } }, "node_modules/module-error": { @@ -18760,10 +18855,24 @@ } }, "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } }, "node_modules/nan": { "version": "2.17.0", @@ -18776,10 +18885,15 @@ "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" }, "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==", - "dev": true, + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -18788,9 +18902,9 @@ } }, "node_modules/napi-macros": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", "dev": true }, "node_modules/natural-compare": { @@ -18885,21 +18999,22 @@ } }, "node_modules/node-fetch": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz", - "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==", - "dev": true, + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" + "whatwg-url": "^5.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "4.x || >=6.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/node-gyp-build": { @@ -18924,9 +19039,9 @@ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" }, "node_modules/nodemailer": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.1.tgz", - "integrity": "sha512-qHw7dOiU5UKNnQpXktdgQ1d3OFgRAekuvbJLcdG5dnEo/GtcTHRYM7+UfJARdOFU9WUQO8OiIamgWPmiSFHYAA==", + "version": "6.9.2", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.2.tgz", + "integrity": "sha512-4+TYaa/e1nIxQfyw/WzNPYTEZ5OvHIDEnmjs4LPmIfccPQN+2CYKmGHjWixn/chzD3bmUTu5FMfpltizMxqzdg==", "engines": { "node": ">=6.0.0" } @@ -19135,17 +19250,18 @@ } }, "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", "is-wsl": "^2.2.0" }, "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -19175,18 +19291,18 @@ } }, "node_modules/ora": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", - "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.0.tgz", + "integrity": "sha512-1/D8uRFY0ay2kgBpmAwmSA404w4OoPVhHMqRqtjvrcK/dnzcEZxMJ+V4DUbyICu8IIVRclHcOf5wlD1tMY4GUQ==", "dev": true, "dependencies": { - "bl": "^5.0.0", "chalk": "^5.0.0", "cli-cursor": "^4.0.0", "cli-spinners": "^2.6.1", "is-interactive": "^2.0.0", "is-unicode-supported": "^1.1.0", "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", "strip-ansi": "^7.0.1", "wcwidth": "^1.0.1" }, @@ -19484,14 +19600,6 @@ "protocols": "^2.0.0" } }, - "node_modules/parse-uri": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/parse-uri/-/parse-uri-1.0.7.tgz", - "integrity": "sha512-eWuZCMKNlVkXrEoANdXxbmqhu2SQO9jUMCSpdbJDObin0JxISn6e400EWsSRbr/czdKvWKkhZnMKEGUwf/Plmg==", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/parse-url": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", @@ -19554,28 +19662,37 @@ } }, "node_modules/path-scurry": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.1.tgz", - "integrity": "sha512-OW+5s+7cw6253Q4E+8qQ/u1fVvcJQCJo/VFD8pje+dbJCF1n5ZRMV2AEHbGp+5Q7jxQIYJxkHopnj6nzdGeZLA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.1.tgz", + "integrity": "sha512-UgmoiySyjFxP6tscZDgWGEAgsW5ok8W3F5CJDnnH2pozwSTGE6eH7vwTotMwATWA2r5xqdkKdxYPkwlJjAI/3g==", "dev": true, "dependencies": { - "lru-cache": "^7.14.1", - "minipass": "^4.0.2" + "lru-cache": "^9.1.1", + "minipass": "^5.0.0 || ^6.0.0" }, "engines": { - "node": ">=14" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", + "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", "dev": true, "engines": { - "node": ">=12" + "node": "14 || >=16.14" + } + }, + "node_modules/path-scurry/node_modules/minipass": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.1.tgz", + "integrity": "sha512-Tenl5QPpgozlOGBiveNYHg2f6y+VpxsXRoIHFUVJuSmTonXRAE6q9b8Mp/O46762/2AlW4ye4Nkyvx0fgWDKbw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/path-to-regexp": { @@ -19630,13 +19747,13 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/pg": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.10.0.tgz", - "integrity": "sha512-ke7o7qSTMb47iwzOSaZMfeR7xToFdkE71ifIipOAAaLIM0DYzfOAXlgFFmYUIE2BcJtvnVlGCID84ZzCegE8CQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.0.tgz", + "integrity": "sha512-meLUVPn2TWgJyLmy7el3fQQVwft4gU5NGyvV0XbD41iU9Jbg8lCH4zexhIkihDzVHJStlt6r088G6/fWeNjhXA==", "dependencies": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", - "pg-connection-string": "^2.5.0", + "pg-connection-string": "^2.6.0", "pg-pool": "^3.6.0", "pg-protocol": "^1.6.0", "pg-types": "^2.1.0", @@ -19645,6 +19762,9 @@ "engines": { "node": ">= 8.0.0" }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.0" + }, "peerDependencies": { "pg-native": ">=3.0.1" }, @@ -19654,10 +19774,16 @@ } } }, + "node_modules/pg-cloudflare": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.0.tgz", + "integrity": "sha512-tGM8/s6frwuAIyRcJ6nWcIvd3+3NmUKIs6OjviIm1HPPFEt5MzQDOTBQyhPWg/m0kCl95M6gA1JaIXtS8KovOA==", + "optional": true + }, "node_modules/pg-connection-string": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz", - "integrity": "sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.0.tgz", + "integrity": "sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==" }, "node_modules/pg-int8": { "version": "1.0.1", @@ -19732,6 +19858,15 @@ "node": ">=0.10" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", @@ -19805,6 +19940,19 @@ "node": ">=8" } }, + "node_modules/platform-deploy-client": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/platform-deploy-client/-/platform-deploy-client-0.6.0.tgz", + "integrity": "sha512-mBfnOvF2gb9acGJjlXBQ6VOAkKFRdljsNKHUVY5xKqzKP2PNh/RqCIvi5AR5NqLMrQ3XaMIwRvmwAjtGw7JhYg==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.6.3", + "axios": "^0.21.2", + "defender-base-client": "^1.44.0", + "lodash": "^4.17.19", + "node-fetch": "^2.6.0" + } + }, "node_modules/pngjs": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", @@ -19814,9 +19962,9 @@ } }, "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", "funding": [ { "type": "opencollective", @@ -19825,10 +19973,14 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -19837,9 +19989,9 @@ } }, "node_modules/postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", @@ -19847,7 +19999,7 @@ "resolve": "^1.1.7" }, "engines": { - "node": ">=10.0.0" + "node": ">=14.0.0" }, "peerDependencies": { "postcss": "^8.0.0" @@ -19873,16 +20025,16 @@ } }, "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", "dev": true, "dependencies": { "lilconfig": "^2.0.5", - "yaml": "^1.10.2" + "yaml": "^2.1.1" }, "engines": { - "node": ">= 10" + "node": ">= 14" }, "funding": { "type": "opencollective", @@ -19901,22 +20053,13 @@ } } }, - "node_modules/postcss-load-config/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/postcss-nested": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", - "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^6.0.11" }, "engines": { "node": ">=12.0" @@ -19930,9 +20073,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -19948,17 +20091,6 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -20021,9 +20153,9 @@ } }, "node_modules/prettier": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", - "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", "bin": { "prettier": "bin-prettier.js" }, @@ -20209,8 +20341,7 @@ "node_modules/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 + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/prr": { "version": "1.0.1", @@ -20270,12 +20401,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, "node_modules/pupa": { "version": "3.1.0", @@ -20293,9 +20421,9 @@ } }, "node_modules/pure-rand": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz", - "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", "dev": true, "funding": [ { @@ -20401,14 +20529,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, - "node_modules/qrcode/node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/qrcode/node_modules/emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", @@ -20478,11 +20598,6 @@ "node": ">=4" } }, - "node_modules/qrcode/node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, "node_modules/qrcode/node_modules/string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -20507,11 +20622,6 @@ "node": ">=6" } }, - "node_modules/qrcode/node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" - }, "node_modules/qrcode/node_modules/wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -20678,6 +20788,17 @@ "node": ">= 0.8" } }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -20708,6 +20829,31 @@ "node": ">=0.10.0" } }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -20723,15 +20869,6 @@ "pify": "^2.3.0" } }, - "node_modules/read-cache/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/read-only-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", @@ -20740,12 +20877,7 @@ "readable-stream": "^2.0.2" } }, - "node_modules/read-only-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/read-only-stream/node_modules/readable-stream": { + "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", @@ -20759,12 +20891,17 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/read-only-stream/node_modules/safe-buffer": { + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/read-only-stream/node_modules/string_decoder": { + "node_modules/readable-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", @@ -20772,19 +20909,6 @@ "safe-buffer": "~5.1.0" } }, - "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==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -20824,14 +20948,14 @@ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -20868,32 +20992,33 @@ } }, "node_modules/release-it": { - "version": "15.8.0", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-15.8.0.tgz", - "integrity": "sha512-eJwYY/vXefcnWn7OHlZRcQJYPSJw/fdO+29C/Re5MZE8FZReCHu+EYq3yB0Bm39/3cTVz/5I/2Fk5rtAsVFU1g==", + "version": "15.10.3", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-15.10.3.tgz", + "integrity": "sha512-OSdHOg76gwkpLbSLBK09GZQj5XWXwBP+S6v//rSoQKkjqklaCLK04Gl5NkTwNrQOHHiihs4ToesDNh2+w55k3w==", "dev": true, "dependencies": { "@iarna/toml": "2.2.5", "@octokit/rest": "19.0.7", "async-retry": "1.3.3", "chalk": "5.2.0", - "cosmiconfig": "8.1.0", - "execa": "7.0.0", + "cosmiconfig": "8.1.3", + "execa": "7.1.1", "git-url-parse": "13.1.0", - "globby": "13.1.3", + "globby": "13.1.4", "got": "12.6.0", - "inquirer": "9.1.4", + "inquirer": "9.2.0", "is-ci": "3.0.1", + "issue-parser": "6.0.0", "lodash": "4.17.21", "mime-types": "2.1.35", "new-github-release-url": "2.0.0", - "node-fetch": "3.3.0", - "open": "8.4.2", - "ora": "6.1.2", + "node-fetch": "3.3.1", + "open": "9.1.0", + "ora": "6.3.0", "os-name": "5.1.0", "promise.allsettled": "1.0.6", "proxy-agent": "5.0.0", - "semver": "7.3.8", + "semver": "7.5.0", "shelljs": "0.8.5", "update-notifier": "6.0.2", "url-join": "5.0.0", @@ -20919,10 +21044,19 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/release-it/node_modules/data-uri-to-buffer": { + "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==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/release-it/node_modules/execa": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.0.0.tgz", - "integrity": "sha512-tQbH0pH/8LHTnwTrsKWideqi6rFB/QNUawEwrn+WHyz7PX1Tuz2u7wfTvbaNBdP5JD5LVWxNo8/A8CHNZ3bV6g==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", @@ -20943,9 +21077,9 @@ } }, "node_modules/release-it/node_modules/globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", "dev": true, "dependencies": { "dir-glob": "^3.0.1", @@ -20962,9 +21096,9 @@ } }, "node_modules/release-it/node_modules/human-signals": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.0.tgz", - "integrity": "sha512-zyzVyMjpGBX2+6cDVZeFPCdtOtdsxOeseRhB9tkQ6xXmGUNrcnBzdEKPy3VPNYz+4gy1oukVOXcrJCunSyc6QQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, "engines": { "node": ">=14.18.0" @@ -20982,6 +21116,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/release-it/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, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/release-it/node_modules/mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", @@ -20994,6 +21140,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/release-it/node_modules/node-fetch": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", + "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/release-it/node_modules/npm-run-path": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", @@ -21036,6 +21200,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/release-it/node_modules/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/release-it/node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", @@ -21060,6 +21239,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/release-it/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -21091,19 +21276,6 @@ "node": ">= 6" } }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/request/node_modules/qs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", @@ -21133,22 +21305,26 @@ "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, "engines": { "node": ">=0.10.0" } }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -21195,9 +21371,9 @@ } }, "node_modules/resolve.exports": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.1.tgz", - "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, "engines": { "node": ">=10" @@ -21271,26 +21447,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "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==", - "dev": true, - "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/ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -21339,14 +21495,6 @@ "util": "^0.12.0" } }, - "node_modules/ripple-binary-codec/node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "engines": { - "node": ">=0.6" - } - }, "node_modules/ripple-binary-codec/node_modules/buffer": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", @@ -21423,6 +21571,7 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "dev": true, + "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -21517,9 +21666,9 @@ } }, "node_modules/rollup-plugin-polyfill-node/node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", "dev": true }, "node_modules/rollup-plugin-polyfill-node/node_modules/magic-string": { @@ -21588,6 +21737,21 @@ } } }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -21654,9 +21818,9 @@ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "dependencies": { "tslib": "^2.1.0" @@ -21709,6 +21873,15 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, "node_modules/scmp": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.1.0.tgz", @@ -21742,9 +21915,9 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -21930,9 +22103,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", - "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -21954,26 +22127,6 @@ "node": ">=4" } }, - "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==", - "dev": true, - "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/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -22167,26 +22320,6 @@ "rimraf": "^2.2.8" } }, - "node_modules/solc/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "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/solc/node_modules/jsonfile": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", @@ -22218,9 +22351,9 @@ } }, "node_modules/solidity-ast": { - "version": "0.4.46", - "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.46.tgz", - "integrity": "sha512-MlPZQfPhjWXqh7YxWcBGDXaPZIfMYCOHYoLEhGDWulNwEPIQQZuB7mA9eP17CU0jY/bGR4avCEUVVpvHtT2gbA==", + "version": "0.4.49", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.49.tgz", + "integrity": "sha512-Pr5sCAj1SFqzwFZw1HPKSq0PehlQNdM8GwKyAVYh2DOn7/cCK8LUKD1HeHnKtTgBW7hi9h4nnnan7hpAg5RhWQ==", "dev": true }, "node_modules/solidity-docgen": { @@ -22237,9 +22370,9 @@ } }, "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "engines": { "node": ">=0.10.0" } @@ -22261,11 +22394,20 @@ "source-map": "^0.6.0" } }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead" + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true }, "node_modules/split": { "version": "0.3.3", @@ -22288,9 +22430,9 @@ } }, "node_modules/split2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", - "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "engines": { "node": ">= 10.x" } @@ -22325,11 +22467,6 @@ "node": ">=0.10.0" } }, - "node_modules/sshpk/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -22380,6 +22517,21 @@ "node": ">= 0.8" } }, + "node_modules/stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dev": true, + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/stop-iteration-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", @@ -22401,6 +22553,19 @@ "readable-stream": "^3.5.0" } }, + "node_modules/stream-browserify/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/stream-combiner": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", @@ -22419,38 +22584,6 @@ "readable-stream": "^2.0.2" } }, - "node_modules/stream-combiner2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/stream-combiner2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/stream-combiner2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/stream-combiner2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/stream-http": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", @@ -22462,6 +22595,19 @@ "xtend": "^4.0.2" } }, + "node_modules/stream-http/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/stream-splicer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", @@ -22471,38 +22617,6 @@ "readable-stream": "^2.0.2" } }, - "node_modules/stream-splicer/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/stream-splicer/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/stream-splicer/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/stream-splicer/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -22529,9 +22643,9 @@ } }, "node_modules/string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "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, "engines": { "node": ">=0.6.19" @@ -22649,7 +22763,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -22712,6 +22825,57 @@ "minimist": "^1.1.0" } }, + "node_modules/sucrase": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", + "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/superstruct": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", @@ -22723,9 +22887,9 @@ "integrity": "sha512-r0JFBjkMIdep3Lbk3JA+MpnpuOtw4RSyrlRAbrzMcxwiYco3GFWl/daimQZ5b1forOiUODpOlXbSOljP/oyurg==" }, "node_modules/supertokens-node": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/supertokens-node/-/supertokens-node-13.1.3.tgz", - "integrity": "sha512-iVpP1tPa0nDI3zqP+qgNdJNia9OsGeLsv07u6X2k3xvMYf4oQDdFTW2gBvz0pha2kfwomWzi8G9XmZ01mCQ0Zg==", + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/supertokens-node/-/supertokens-node-13.6.0.tgz", + "integrity": "sha512-sErvcZOVUnHb5YazGTjHGKRdxlPT/as+S7t2UAA0FChCPa8p8NtVPR494VJYrXuVT1eBUqwie55BIFh7EvZJqQ==", "dependencies": { "axios": "0.21.4", "body-parser": "1.20.1", @@ -22760,11 +22924,11 @@ } }, "node_modules/supertokens-website": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/supertokens-website/-/supertokens-website-16.0.3.tgz", - "integrity": "sha512-AnBy+UyFGWD1m1Oa0GBiRUEl5jFYAurxA4CjbZk6n4YxhDKaZBUe2xW5ajp+tW4b0Lj3+e00Xqt0YLsVZrtRYw==", + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/supertokens-website/-/supertokens-website-16.0.9.tgz", + "integrity": "sha512-yt6ItCXOYkvwCioB+Pvn9I6wsx3wcYYQhWJDwd71y2JaZQnrLGnhk8WC2hITz30/w6e/UOmZ4lmxmMo68oWnJw==", "dependencies": { - "browser-tabs-lock": "^1.2.14", + "browser-tabs-lock": "^1.3.0", "supertokens-js-override": "^0.0.4" } }, @@ -23004,8 +23168,6 @@ "version": "6.8.1", "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "peer": true, "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -23054,8 +23216,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -23070,16 +23230,12 @@ "node_modules/table/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==", - "dev": true, - "peer": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "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, - "peer": true, "engines": { "node": ">=8" } @@ -23087,16 +23243,12 @@ "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", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "peer": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "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, - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -23113,8 +23265,6 @@ "version": "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, - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -23125,52 +23275,43 @@ } }, "node_modules/tailwindcss": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.2.7.tgz", - "integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", + "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", "dev": true, "dependencies": { + "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.1", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.2.12", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "lilconfig": "^2.0.6", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.0.9", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "6.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1" + "resolve": "^1.22.2", + "sucrase": "^3.32.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" }, "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "postcss": "^8.0.9" + "node": ">=14.0.0" } }, - "node_modules/tailwindcss/node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, "node_modules/tar": { "version": "4.4.19", "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", @@ -23240,26 +23381,6 @@ "node": ">=8" } }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "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/text-encoding-utf-8": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", @@ -23271,6 +23392,27 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -23285,38 +23427,6 @@ "xtend": "~4.0.1" } }, - "node_modules/through2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/through2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -23357,6 +23467,18 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -23420,6 +23542,14 @@ "node": ">=0.8" } }, + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -23435,9 +23565,9 @@ } }, "node_modules/ts-command-line-args": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.4.2.tgz", - "integrity": "sha512-mJLQQBOdyD4XI/ZWQY44PIdYde47JhV2xl380O7twPkTQ+Y5vFDHsk8LOeXKuz7dVY5aDCfAzRarNfSqtKOkQQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.0.tgz", + "integrity": "sha512-Ff7Xt04WWCjj/cmPO9eWTJX3qpBZWuPWyQYG1vnxJao+alWWYjwJBc5aYz3h5p5dE08A6AnpkgiCtP/0KXXBYw==", "dev": true, "dependencies": { "@morgan-stanley/ts-mocking-bird": "^0.6.2", @@ -23947,28 +24077,6 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "node_modules/ts-command-line-args/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "optional": true, - "peer": true, - "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/ts-command-line-args/node_modules/jest": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", @@ -24558,6 +24666,17 @@ "node": ">=10" } }, + "node_modules/ts-command-line-args/node_modules/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, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ts-command-line-args/node_modules/source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", @@ -24605,10 +24724,16 @@ "typescript": ">=3.7.0" } }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, "node_modules/ts-jest": { - "version": "29.0.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.5.tgz", - "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", + "version": "29.1.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", + "integrity": "sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -24631,7 +24756,7 @@ "@jest/types": "^29.0.0", "babel-jest": "^29.0.0", "jest": "^29.0.0", - "typescript": ">=4.3" + "typescript": ">=4.3 <6" }, "peerDependenciesMeta": { "@babel/core": { @@ -24648,6 +24773,12 @@ } } }, + "node_modules/ts-jest/node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -24725,26 +24856,6 @@ } } }, - "node_modules/ts-node-dev/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "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/ts-node-dev/node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -24757,6 +24868,21 @@ "rimraf": "bin.js" } }, + "node_modules/ts-node/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==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/tsconfig": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", @@ -24820,9 +24946,9 @@ "dev": true }, "node_modules/tsx": { - "version": "3.12.5", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-3.12.5.tgz", - "integrity": "sha512-/TLj30xF1zcN9JkoFCyROtIQUi8cRQG+AFchsg5YkWou3+RXxTZS/ffWB3nCxyZPoBqF2+8ohs07N815dNb1wQ==", + "version": "3.12.7", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-3.12.7.tgz", + "integrity": "sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==", "dev": true, "dependencies": { "@esbuild-kit/cjs-loader": "^2.4.2", @@ -24853,10 +24979,9 @@ } }, "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "dev": true + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "node_modules/tweetnacl-util": { "version": "0.15.1", @@ -24865,9 +24990,9 @@ "dev": true }, "node_modules/twilio": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/twilio/-/twilio-4.8.0.tgz", - "integrity": "sha512-jJaEyFGIiIAIfAWyq94g3uo2odTyo2opRN8hzpDHpbA4SYDfhxmm4E+Z0c7AP41HEdxzDyCwMkLNXh6fBpWRiw==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/twilio/-/twilio-4.11.0.tgz", + "integrity": "sha512-8ZTfl5+ByJ08c3ko+t9HQ0DYKn4D94GKvTl/N1IeXektaRbNZ81kYJJkdsx4XEz2p6Dv4qEx+0+SBCMwmAy79w==", "dependencies": { "axios": "^0.26.1", "dayjs": "^1.8.29", @@ -25030,16 +25155,17 @@ "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==" }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true, + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.20" } }, "node_modules/typical": { @@ -25051,6 +25177,24 @@ "node": ">=8" } }, + "node_modules/ua-parser-js": { + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", + "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, "node_modules/uglify-js": { "version": "3.17.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", @@ -25108,17 +25252,23 @@ } }, "node_modules/undici": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", - "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", + "version": "5.22.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", + "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", "dev": true, "dependencies": { "busboy": "^1.6.0" }, "engines": { - "node": ">=12.18" + "node": ">=14.0" } }, + "node_modules/unfetch": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", + "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==", + "dev": true + }, "node_modules/unique-string": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", @@ -25156,10 +25306,19 @@ "node": ">= 0.8" } }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "funding": [ { "type": "opencollective", @@ -25168,6 +25327,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -25175,7 +25338,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -25229,6 +25392,14 @@ "punycode": "^2.1.0" } }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, "node_modules/url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -25373,17 +25544,17 @@ } }, "node_modules/verify-apple-id-token/node_modules/@types/jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-c5ltxazpWabia/4UzhIoaDcIza4KViOQhdbjRlfcIGVnsE3c3brkz9Z+F/EeJIECOQP7W7US2hNE930cWWkPiw==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q==", "dependencies": { "@types/node": "*" } }, "node_modules/verify-apple-id-token/node_modules/jose": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.13.1.tgz", - "integrity": "sha512-MSJQC5vXco5Br38mzaQKiq9mwt7lwj2eXpgpRyQYNHYt2lq1PjkWa7DLXX0WVcQLE9HhMh3jPiufS7fhJf+CLQ==", + "version": "4.14.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", + "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==", "funding": { "url": "https://github.com/sponsors/panva" } @@ -25852,9 +26023,9 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, "node_modules/vm2": { - "version": "3.9.14", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.14.tgz", - "integrity": "sha512-HgvPHYHeQy8+QhzlFryvSteA4uQLBCOub02mgqdR+0bN/akRZ48TGB1v0aCv7ksyc0HXx16AZtMHKS38alc6TA==", + "version": "3.9.19", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", + "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", "dev": true, "dependencies": { "acorn": "^8.7.0", @@ -25867,16 +26038,25 @@ "node": ">=6.0" } }, + "node_modules/vm2/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==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/vue": { - "version": "3.2.47", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz", - "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.2.tgz", + "integrity": "sha512-98hJcAhyDwZoOo2flAQBSPVYG/o0HA9ivIy2ktHshjE+6/q8IMQ+kvDKQzOZTFPxvnNMcGM+zS2A00xeZMA7tA==", "dependencies": { - "@vue/compiler-dom": "3.2.47", - "@vue/compiler-sfc": "3.2.47", - "@vue/runtime-dom": "3.2.47", - "@vue/server-renderer": "3.2.47", - "@vue/shared": "3.2.47" + "@vue/compiler-dom": "3.3.2", + "@vue/compiler-sfc": "3.3.2", + "@vue/runtime-dom": "3.3.2", + "@vue/server-renderer": "3.3.2", + "@vue/shared": "3.3.2" } }, "node_modules/vue-eslint-parser": { @@ -25904,9 +26084,9 @@ } }, "node_modules/vue-eslint-parser/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -25914,6 +26094,9 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/vue-eslint-parser/node_modules/estraverse": { @@ -25926,11 +26109,11 @@ } }, "node_modules/vue-router": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", - "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.0.tgz", + "integrity": "sha512-c+usESa6ZoWsm4PPdzRSyenp5A4dsUtnDJnrI03fY1IpIihA9TK3x5ffgkFDpjhLJZewsXoKURapNLFdZjuqTg==", "dependencies": { - "@vue/devtools-api": "^6.4.5" + "@vue/devtools-api": "^6.5.0" }, "funding": { "url": "https://github.com/sponsors/posva" @@ -25982,27 +26165,27 @@ } }, "node_modules/web3": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.2.tgz", - "integrity": "sha512-92h0GdEHW9wqDICQQKyG4foZBYi0OQkyg4CRml2F7XBl/NG+fu9o6J19kzfFXzSBoA4DnJXbyRgj/RHZv5LRiw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.0.tgz", + "integrity": "sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==", "hasInstallScript": true, "dependencies": { - "web3-bzz": "1.8.2", - "web3-core": "1.8.2", - "web3-eth": "1.8.2", - "web3-eth-personal": "1.8.2", - "web3-net": "1.8.2", - "web3-shh": "1.8.2", - "web3-utils": "1.8.2" + "web3-bzz": "1.10.0", + "web3-core": "1.10.0", + "web3-eth": "1.10.0", + "web3-eth-personal": "1.10.0", + "web3-net": "1.10.0", + "web3-shh": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-bzz": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.2.tgz", - "integrity": "sha512-1EEnxjPnFnvNWw3XeeKuTR8PBxYd0+XWzvaLK7OJC/Go9O8llLGxrxICbKV+8cgIE0sDRBxiYx02X+6OhoAQ9w==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.0.tgz", + "integrity": "sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==", "hasInstallScript": true, "dependencies": { "@types/node": "^12.12.6", @@ -26138,53 +26321,53 @@ } }, "node_modules/web3-core": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.2.tgz", - "integrity": "sha512-DJTVEAYcNqxkqruJE+Rxp3CIv0y5AZMwPHQmOkz/cz+MM75SIzMTc0AUdXzGyTS8xMF8h3YWMQGgGEy8SBf1PQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.0.tgz", + "integrity": "sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==", "dependencies": { - "@types/bn.js": "^5.1.0", + "@types/bn.js": "^5.1.1", "@types/node": "^12.12.6", "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.8.2", - "web3-core-method": "1.8.2", - "web3-core-requestmanager": "1.8.2", - "web3-utils": "1.8.2" + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-requestmanager": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-helpers": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.2.tgz", - "integrity": "sha512-6B1eLlq9JFrfealZBomd1fmlq1o4A09vrCVQSa51ANoib/jllT3atZrRDr0zt1rfI7TSZTZBXdN/aTdeN99DWw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz", + "integrity": "sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g==", "dependencies": { - "web3-eth-iban": "1.8.2", - "web3-utils": "1.8.2" + "web3-eth-iban": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-method": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.2.tgz", - "integrity": "sha512-1qnr5mw5wVyULzLOrk4B+ryO3gfGjGd/fx8NR+J2xCGLf1e6OSjxT9vbfuQ3fErk/NjSTWWreieYWLMhaogcRA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.0.tgz", + "integrity": "sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==", "dependencies": { "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.8.2", - "web3-core-promievent": "1.8.2", - "web3-core-subscriptions": "1.8.2", - "web3-utils": "1.8.2" + "web3-core-helpers": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-promievent": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.2.tgz", - "integrity": "sha512-nvkJWDVgoOSsolJldN33tKW6bKKRJX3MCPDYMwP5SUFOA/mCzDEoI88N0JFofDTXkh1k7gOqp1pvwi9heuaxGg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz", + "integrity": "sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg==", "dependencies": { "eventemitter3": "4.0.4" }, @@ -26198,27 +26381,27 @@ "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" }, "node_modules/web3-core-requestmanager": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.2.tgz", - "integrity": "sha512-p1d090RYs5Mu7DK1yyc3GCBVZB/03rBtFhYFoS2EruGzOWs/5Q0grgtpwS/DScdRAm8wB8mYEBhY/RKJWF6B2g==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz", + "integrity": "sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==", "dependencies": { "util": "^0.12.5", - "web3-core-helpers": "1.8.2", - "web3-providers-http": "1.8.2", - "web3-providers-ipc": "1.8.2", - "web3-providers-ws": "1.8.2" + "web3-core-helpers": "1.10.0", + "web3-providers-http": "1.10.0", + "web3-providers-ipc": "1.10.0", + "web3-providers-ws": "1.10.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-subscriptions": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.2.tgz", - "integrity": "sha512-vXQogHDmAIQcKpXvGiMddBUeP9lnKgYF64+yQJhPNE5PnWr1sAibXuIPV7mIPihpFr/n/DORRj6Wh1pUv9zaTw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz", + "integrity": "sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==", "dependencies": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.2" + "web3-core-helpers": "1.10.0" }, "engines": { "node": ">=8.0.0" @@ -26235,43 +26418,43 @@ "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, "node_modules/web3-eth": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.2.tgz", - "integrity": "sha512-JoTiWWc4F4TInpbvDUGb0WgDYJsFhuIjJlinc5ByjWD88Gvh+GKLsRjjFdbqe5YtwIGT4NymwoC5LQd1K6u/QQ==", - "dependencies": { - "web3-core": "1.8.2", - "web3-core-helpers": "1.8.2", - "web3-core-method": "1.8.2", - "web3-core-subscriptions": "1.8.2", - "web3-eth-abi": "1.8.2", - "web3-eth-accounts": "1.8.2", - "web3-eth-contract": "1.8.2", - "web3-eth-ens": "1.8.2", - "web3-eth-iban": "1.8.2", - "web3-eth-personal": "1.8.2", - "web3-net": "1.8.2", - "web3-utils": "1.8.2" + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.0.tgz", + "integrity": "sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==", + "dependencies": { + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-eth-accounts": "1.10.0", + "web3-eth-contract": "1.10.0", + "web3-eth-ens": "1.10.0", + "web3-eth-iban": "1.10.0", + "web3-eth-personal": "1.10.0", + "web3-net": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-abi": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.2.tgz", - "integrity": "sha512-Om9g3kaRNjqiNPAgKwGT16y+ZwtBzRe4ZJFGjLiSs6v5I7TPNF+rRMWuKnR6jq0azQZDj6rblvKFMA49/k48Og==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz", + "integrity": "sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg==", "dependencies": { "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.8.2" + "web3-utils": "1.10.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-accounts": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.2.tgz", - "integrity": "sha512-c367Ij63VCz9YdyjiHHWLFtN85l6QghgwMQH2B1eM/p9Y5lTlTX7t/Eg/8+f1yoIStXbk2w/PYM2lk+IkbqdLA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz", + "integrity": "sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==", "dependencies": { "@ethereumjs/common": "2.5.0", "@ethereumjs/tx": "3.3.2", @@ -26279,32 +26462,19 @@ "ethereumjs-util": "^7.1.5", "scrypt-js": "^3.0.1", "uuid": "^9.0.0", - "web3-core": "1.8.2", - "web3-core-helpers": "1.8.2", - "web3-core-method": "1.8.2", - "web3-utils": "1.8.2" + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/web3-eth-accounts/node_modules/@ethereumjs/common": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", - "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.1" - } - }, - "node_modules/web3-eth-accounts/node_modules/@ethereumjs/tx": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", - "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", - "dependencies": { - "@ethereumjs/common": "^2.5.0", - "ethereumjs-util": "^7.1.2" - } + "node_modules/web3-eth-accounts/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/web3-eth-accounts/node_modules/eth-lib": { "version": "0.2.8", @@ -26316,48 +26486,6 @@ "xhr-request-promise": "^0.1.2" } }, - "node_modules/web3-eth-accounts/node_modules/eth-lib/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/web3-eth-accounts/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/web3-eth-accounts/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/web3-eth-accounts/node_modules/uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", @@ -26367,64 +26495,64 @@ } }, "node_modules/web3-eth-contract": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.2.tgz", - "integrity": "sha512-ID5A25tHTSBNwOPjiXSVzxruz006ULRIDbzWTYIFTp7NJ7vXu/kynKK2ag/ObuTqBpMbobP8nXcA9b5EDkIdQA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz", + "integrity": "sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==", "dependencies": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.8.2", - "web3-core-helpers": "1.8.2", - "web3-core-method": "1.8.2", - "web3-core-promievent": "1.8.2", - "web3-core-subscriptions": "1.8.2", - "web3-eth-abi": "1.8.2", - "web3-utils": "1.8.2" + "@types/bn.js": "^5.1.1", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-ens": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.2.tgz", - "integrity": "sha512-PWph7C/CnqdWuu1+SH4U4zdrK4t2HNt0I4XzPYFdv9ugE8EuojselioPQXsVGvjql+Nt3jDLvQvggPqlMbvwRw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz", + "integrity": "sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==", "dependencies": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", - "web3-core": "1.8.2", - "web3-core-helpers": "1.8.2", - "web3-core-promievent": "1.8.2", - "web3-eth-abi": "1.8.2", - "web3-eth-contract": "1.8.2", - "web3-utils": "1.8.2" + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-eth-contract": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-iban": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.2.tgz", - "integrity": "sha512-h3vNblDWkWMuYx93Q27TAJz6lhzpP93EiC3+45D6xoz983p6si773vntoQ+H+5aZhwglBtoiBzdh7PSSOnP/xQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz", + "integrity": "sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg==", "dependencies": { "bn.js": "^5.2.1", - "web3-utils": "1.8.2" + "web3-utils": "1.10.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-personal": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.2.tgz", - "integrity": "sha512-Vg4HfwCr7doiUF/RC+Jz0wT4+cYaXcOWMAW2AHIjHX6Z7Xwa8nrURIeQgeEE62qcEHAzajyAdB1u6bJyTfuCXw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz", + "integrity": "sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==", "dependencies": { "@types/node": "^12.12.6", - "web3-core": "1.8.2", - "web3-core-helpers": "1.8.2", - "web3-core-method": "1.8.2", - "web3-net": "1.8.2", - "web3-utils": "1.8.2" + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-net": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { "node": ">=8.0.0" @@ -26436,13 +26564,13 @@ "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, "node_modules/web3-net": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.2.tgz", - "integrity": "sha512-1itkDMGmbgb83Dg9nporFes9/fxsU7smJ3oRXlFkg4ZHn8YJyP1MSQFPJWWwSc+GrcCFt4O5IrUTvEkHqE3xag==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.0.tgz", + "integrity": "sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==", "dependencies": { - "web3-core": "1.8.2", - "web3-core-method": "1.8.2", - "web3-utils": "1.8.2" + "web3-core": "1.10.0", + "web3-core-method": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { "node": ">=8.0.0" @@ -26490,37 +26618,6 @@ "node": ">=0.8" } }, - "node_modules/web3-provider-engine/node_modules/cross-fetch": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.6.tgz", - "integrity": "sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA==", - "dependencies": { - "node-fetch": "^2.6.7", - "whatwg-fetch": "^2.0.4" - } - }, - "node_modules/web3-provider-engine/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/web3-provider-engine/node_modules/ethereumjs-util": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", @@ -26535,57 +26632,6 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/web3-provider-engine/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/web3-provider-engine/node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/web3-provider-engine/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/web3-provider-engine/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/web3-provider-engine/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/web3-provider-engine/node_modules/ws": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", @@ -26595,38 +26641,46 @@ } }, "node_modules/web3-providers-http": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.2.tgz", - "integrity": "sha512-2xY94IIEQd16+b+vIBF4IC1p7GVaz9q4EUFscvMUjtEq4ru4Atdzjs9GP+jmcoo49p70II0UV3bqQcz0TQfVyQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.0.tgz", + "integrity": "sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==", "dependencies": { "abortcontroller-polyfill": "^1.7.3", "cross-fetch": "^3.1.4", "es6-promise": "^4.2.8", - "web3-core-helpers": "1.8.2" + "web3-core-helpers": "1.10.0" }, "engines": { "node": ">=8.0.0" } }, + "node_modules/web3-providers-http/node_modules/cross-fetch": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", + "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", + "dependencies": { + "node-fetch": "^2.6.11" + } + }, "node_modules/web3-providers-ipc": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.2.tgz", - "integrity": "sha512-p6fqKVGFg+WiXGHWnB1hu43PbvPkDHTz4RgoEzbXugv5rtv5zfYLqm8Ba6lrJOS5ks9kGKR21a0y3NzE3u7V4w==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz", + "integrity": "sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==", "dependencies": { "oboe": "2.1.5", - "web3-core-helpers": "1.8.2" + "web3-core-helpers": "1.10.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-ws": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.2.tgz", - "integrity": "sha512-3s/4K+wHgbiN+Zrp9YjMq2eqAF6QGABw7wFftPdx+m5hWImV27/MoIx57c6HffNRqZXmCHnfWWFCNHHsi7wXnA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz", + "integrity": "sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==", "dependencies": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.2", + "web3-core-helpers": "1.10.0", "websocket": "^1.0.32" }, "engines": { @@ -26639,24 +26693,24 @@ "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" }, "node_modules/web3-shh": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.2.tgz", - "integrity": "sha512-uZ+3MAoNcaJsXXNCDnizKJ5viBNeHOFYsCbFhV755Uu52FswzTOw6DtE7yK9nYXMtIhiSgi7nwl1RYzP8pystw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.0.tgz", + "integrity": "sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==", "hasInstallScript": true, "dependencies": { - "web3-core": "1.8.2", - "web3-core-method": "1.8.2", - "web3-core-subscriptions": "1.8.2", - "web3-net": "1.8.2" + "web3-core": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-net": "1.10.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-utils": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.2.tgz", - "integrity": "sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", + "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", "dependencies": { "bn.js": "^5.2.1", "ethereum-bloom-filters": "^1.0.6", @@ -26670,43 +26724,6 @@ "node": ">=8.0.0" } }, - "node_modules/web3-utils/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/web3-utils/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -26795,6 +26812,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" + }, "node_modules/which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", @@ -26966,9 +26988,9 @@ } }, "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": "7.5.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", + "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", "engines": { "node": ">=8.3.0" }, @@ -27107,18 +27129,17 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", - "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", - "dev": true, + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", "engines": { "node": ">= 14" } }, "node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { "cliui": "^8.0.1", @@ -27169,6 +27190,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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", @@ -27229,25 +27262,26 @@ } }, "node_modules/zx": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/zx/-/zx-7.2.0.tgz", - "integrity": "sha512-SMuOZ21zFnBxicw+WMtTv3z3eERh6KBtZExAJaL8EAV+Ev/3M1NIAOkrZ8kRfCzD9acv9heUH/WZctTR4vQxBQ==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/zx/-/zx-7.2.2.tgz", + "integrity": "sha512-50Gjicd6ijTt7Zcz5fNX+rHrmE0uVqC+X6lYKhf2Cu8wIxDpNIzXwTmzchNdW+JY3LFsRcU43B1lHE4HBMmKgQ==", "dev": true, "dependencies": { "@types/fs-extra": "^11.0.1", "@types/minimist": "^1.2.2", - "@types/node": "^18.14.2", + "@types/node": "^18.16.3", "@types/ps-tree": "^1.1.2", - "@types/which": "^2.0.2", + "@types/which": "^3.0.0", "chalk": "^5.2.0", - "fs-extra": "^11.1.0", - "globby": "^13.1.3", + "fs-extra": "^11.1.1", + "fx": "*", + "globby": "^13.1.4", "minimist": "^1.2.8", - "node-fetch": "3.2.10", + "node-fetch": "3.3.1", "ps-tree": "^1.2.0", - "webpod": "^0.0.2", + "webpod": "^0", "which": "^3.0.0", - "yaml": "^2.2.1" + "yaml": "^2.2.2" }, "bin": { "zx": "build/cli.js" @@ -27257,9 +27291,9 @@ } }, "node_modules/zx/node_modules/@types/node": { - "version": "18.15.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz", - "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==", + "version": "18.16.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.10.tgz", + "integrity": "sha512-sMo3EngB6QkMBlB9rBe1lFdKSLqljyWPPWv6/FzSxh/IDlyVWSzE9RiF4eAuerQHybrWdqBgAGb03PM89qOasA==", "dev": true }, "node_modules/zx/node_modules/chalk": { @@ -27274,10 +27308,19 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/zx/node_modules/data-uri-to-buffer": { + "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==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/zx/node_modules/fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -27289,9 +27332,9 @@ } }, "node_modules/zx/node_modules/globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", "dev": true, "dependencies": { "dir-glob": "^3.0.1", @@ -27320,9 +27363,9 @@ } }, "node_modules/zx/node_modules/node-fetch": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.10.tgz", - "integrity": "sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", + "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", "dev": true, "dependencies": { "data-uri-to-buffer": "^4.0.0", @@ -27359,9 +27402,9 @@ } }, "node_modules/zx/node_modules/which": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", - "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", "dev": true, "dependencies": { "isexe": "^2.0.0" @@ -27373,8 +27416,9 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "services/keys": { - "name": "@casimir/keys", + "services/dkg": { + "name": "@casimir/dkg", + "version": "0.0.1", "dependencies": { "ethers": "^5.7.2" }, @@ -27385,12 +27429,10 @@ "dotenv": "^16.0.3", "esbuild": "^0.15.9", "esno": "^0.16.3", - "jest": "^29.4.0", - "ts-jest": "^29.0.5", "zx": "^7.1.1" } }, - "services/keys/node_modules/esbuild": { + "services/dkg/node_modules/esbuild": { "version": "0.15.18", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", @@ -27427,38 +27469,6 @@ "esbuild-windows-arm64": "0.15.18" } }, - "services/oracle": { - "name": "@casimir/oracle", - "version": "0.0.1", - "dependencies": { - "ethers": "^5.7.2" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "dotenv": "^16.0.3", - "esno": "^0.16.3", - "typescript": "^5.0.4" - } - }, - "services/oracle/node_modules/@types/node": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.0.0.tgz", - "integrity": "sha512-cD2uPTDnQQCVpmRefonO98/PPijuOnnEy5oytWJFPY1N9aJCz2wJ5kSGWO+zJoed2cY2JxQh6yBuUq4vIn61hw==", - "dev": true - }, - "services/oracle/node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=12.20" - } - }, "services/users": { "name": "@casimir/users", "version": "0.0.1", diff --git a/package.json b/package.json index fad471fd4..762266189 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "services/*" ], "scripts": { - "clean": "npm exec --workspaces -- npx rimraf node_modules && npx rimraf node_modules package-lock.json && npm i", + "clean": "npm exec --workspaces -- npx rimraf node_modules dist && npx rimraf node_modules package-lock.json && npm i", "curl": "curl -H 'Content-Type: application/json' -d \"$npm_config_body\" \"$npm_config_url\"", "deploy:cdk": "npx esno -r dotenv/config scripts/cdk/deploy.ts", "dev": "npx esno -r dotenv/config scripts/local/dev.ts --app \"$npm_config_app\" --clean \"$npm_config_clean\" --emulate \"$npm_config_emulate\" --fork \"$npm_config_fork\" --mock \"$npm_config_mock\" --network \"$npm_config_network\" --simulation \"$npm_config_simulation\"", @@ -20,7 +20,7 @@ "dev:ssv": "scripts/ssv/dev -n \"$npm_config_nodes\"", "docgen": "npm run docgen --workspace @casimir/ethereum", "lint": "eslint --ext .vue,.ts ./ --fix", - "postinstall": "npm exec --workspaces npm run build", + "postinstall": "npm run build --workspace @casimir/ethereum", "preinstall": "git submodule update --init --recursive && git submodule foreach --recursive git checkout .", "prepare": "husky install", "test": "echo \"Error: no test specified\" && exit 1", diff --git a/scripts/ethereum/dev.ts b/scripts/ethereum/dev.ts index d13f394e5..2d9f83c03 100644 --- a/scripts/ethereum/dev.ts +++ b/scripts/ethereum/dev.ts @@ -1,5 +1,5 @@ import { $, echo, chalk } from 'zx' -import { loadCredentials, getSecret, getFutureContractAddress, getWallet } from '@casimir/helpers' +import { loadCredentials, getSecret, getFutureContractAddress, getWallet, runSync } from '@casimir/helpers' import minimist from 'minimist' /** @@ -62,6 +62,7 @@ void async function () { if (clean) { await $`npm run clean --workspace @casimir/ethereum` + await $`npm run clean --workspace @casimir/dkg` } /** Set 12-second interval mining for dev networks */ @@ -87,4 +88,14 @@ void async function () { /** Start local oracle */ process.env.ETHEREUM_RPC_URL = 'http://localhost:8545' $`npm run dev --workspace @casimir/dkg` + + process.on('SIGINT', () => { + const messes = ['dkg'] + if (clean) { + const cleaners = messes.map(mess => `npm run clean --workspace @casimir/${mess}`).join(' & ') + console.log(`\n🧹 Cleaning up: ${messes.map(mess => `@casimir/${mess}`).join(', ')}`) + runSync(`${cleaners}`) + } + process.exit() + }) }() \ No newline at end of file diff --git a/scripts/local/dev.ts b/scripts/local/dev.ts index 6d09ca8b4..4d6d25dd6 100644 --- a/scripts/local/dev.ts +++ b/scripts/local/dev.ts @@ -1,6 +1,5 @@ import { $, argv, chalk, echo } from 'zx' -import { loadCredentials, getSecret, run, getFutureContractAddress, getWallet } from '@casimir/helpers' -import { ethers } from 'ethers' +import { loadCredentials, getSecret, getFutureContractAddress, getWallet, run, runSync } from '@casimir/helpers' /** * Run a Casimir dev server. @@ -62,14 +61,8 @@ void async function () { const { chains, services, tables } = apps[app as keyof typeof apps] if (mock) { - - if (clean) { - /** Clean postgres database */ - await $`npm run clean --workspace @casimir/data` - } - /** Mock postgres database */ - $`npm run watch --tables=${tables.join(',')} --workspace @casimir/data` + run(`npm run watch --tables=${tables.join(',')} --workspace @casimir/data`) /** Mock services */ let port = 4000 @@ -80,7 +73,7 @@ void async function () { try { if (await run(`lsof -ti:${port}`)) { - await run(`npx --yes kill-port ${port}`) + await run(`kill -9 $(lsof -ti:${port})`) } } catch { console.log(`Port ${port} is available.`) @@ -135,7 +128,7 @@ void async function () { const port = 5001 try { if (await run(`lsof -ti:${port}`)) { - await run(`npx --yes kill-port ${port}`) + await run(`kill -9 $(lsof -ti:${port})`) } } catch { console.log(`Port ${port} is available.`) @@ -144,10 +137,7 @@ void async function () { process.env.PUBLIC_SPECULOS_PORT = `${port}` process.env.PUBLIC_LEDGER_APP = emulate $`scripts/ledger/emulate -a ${emulate}` - /** Wait to push proxy announcement later in terminal run */ - setTimeout(() => { - $`npx esno scripts/ledger/proxy.ts` - }, 5000) + $`npx esno scripts/ledger/proxy.ts` /** Emulate Trezor */ $`scripts/trezor/emulate` @@ -155,4 +145,14 @@ void async function () { /** Run app */ $`npm run dev --workspace @casimir/${app}` + + process.on('SIGINT', () => { + const messes = ['data', 'dkg'] + if (clean) { + const cleaners = messes.map(mess => `npm run clean --workspace @casimir/${mess}`).join(' & ') + console.log(`\n🧹 Cleaning up: ${messes.map(mess => `@casimir/${mess}`).join(', ')}`) + runSync(`${cleaners}`) + } + process.exit() + }) }() \ No newline at end of file diff --git a/services/dkg/package.json b/services/dkg/package.json index 88e35f5ef..786b660cf 100644 --- a/services/dkg/package.json +++ b/services/dkg/package.json @@ -5,6 +5,7 @@ "main": "dist/index.js", "scripts": { "build": "tsc", + "clean": "npx esno -r dotenv/config scripts/clean.ts", "start": "node dist/index.js", "dev": "npx esno -r dotenv/config scripts/dev.ts", "test": "echo \"Error: no test specified\" && exit 1" diff --git a/services/dkg/scripts/clean.ts b/services/dkg/scripts/clean.ts new file mode 100644 index 000000000..0528b6de3 --- /dev/null +++ b/services/dkg/scripts/clean.ts @@ -0,0 +1,11 @@ +import { run } from '@casimir/helpers' + +/** Resource path from package caller */ +const resourcePath = 'scripts/resources/rockx-dkg-cli' + +/** + * Clean up resources + */ +void async function () { + await run(`docker compose -f ${resourcePath}/docker-compose.yaml down`) +}() \ No newline at end of file diff --git a/services/dkg/scripts/dev.ts b/services/dkg/scripts/dev.ts index 261d68a8f..d16144722 100644 --- a/services/dkg/scripts/dev.ts +++ b/services/dkg/scripts/dev.ts @@ -1,17 +1,25 @@ -import { retryFetch } from '@casimir/helpers' -import { $ } from 'zx' +import { fetchRetry, run, runSync } from '@casimir/helpers' + +const resourcePath = 'scripts/resources/rockx-dkg-cli' void async function () { + process.env.CLI_PATH = `./${resourcePath}/build/bin/rockx-dkg-cli` process.env.MESSENGER_SRV_ADDR = 'http://0.0.0.0:3000' process.env.USE_HARDCODED_OPERATORS ='true' + /** Build and check if the CLI is available */ + await run(`make -C ${resourcePath} build`) + const cli = await run(`which ${process.env.CLI_PATH}`) + if (!cli) throw new Error('DKG CLI not found') + /** Start the DKG service */ - await $`docker compose -f scripts/resources/rockx-dkg-cli/docker-compose.yaml up -d` + await run(`docker compose -f ${resourcePath}/docker-compose.yaml up -d`) + console.log('🔑 DKG service started') /** Ping the DGK service for a pong */ - const ping = await retryFetch(`${process.env.MESSENGER_SRV_ADDR}/ping`) + const ping = await fetchRetry(`${process.env.MESSENGER_SRV_ADDR}/ping`) const { message } = await ping.json() if (message !== 'pong') throw new Error('DKG service is not running') - $`npx esno -r dotenv/config src/index.ts` + run('npx esno -r dotenv/config src/index.ts') }() \ No newline at end of file diff --git a/services/dkg/src/index.ts b/services/dkg/src/index.ts index 1c262dbfb..baa37fa0c 100644 --- a/services/dkg/src/index.ts +++ b/services/dkg/src/index.ts @@ -2,7 +2,7 @@ import { config } from './providers/config' import { getEventEmitter } from './providers/events' import { initiatePoolDepositCommand, initiatePoolExitCommand, initiatePoolReshareCommand } from './providers/commands' -const { manager, signer, messengerUrl } = config() +const { manager, signer, cliPath, messengerUrl } = config() const commands = { PoolDepositRequested: initiatePoolDepositCommand, @@ -20,7 +20,7 @@ const eventEmitter = getEventEmitter({ manager, events: Object.keys(commands) }) if (!command) throw new Error(`No command found for event ${details.event}`) console.log(`Executing ${details.event} command for pool ${id}`) - await command({ manager, signer, messengerUrl, id }) + await command({ manager, signer, cliPath, messengerUrl, id }) } })() diff --git a/services/dkg/src/interfaces/CommandOptions.ts b/services/dkg/src/interfaces/CommandOptions.ts index bc9a54a39..3bfa0c683 100644 --- a/services/dkg/src/interfaces/CommandOptions.ts +++ b/services/dkg/src/interfaces/CommandOptions.ts @@ -2,12 +2,14 @@ import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' import { ethers } from 'ethers' export interface CommandOptions { - /** The manager contract */ + /** Manager contract */ manager: ethers.Contract & CasimirManager - /** The command signer */ + /** Command signer */ signer: ethers.Signer - /** The distributed key generation messenger service URL */ + /** DKG cli path */ + cliPath: string + /** DKG messenger service URL */ messengerUrl: string - /** The pool ID */ + /** Pool ID */ id: number } \ No newline at end of file diff --git a/services/dkg/src/interfaces/DKGOptions.ts b/services/dkg/src/interfaces/DKGOptions.ts index a2d7b8cba..7f5546c36 100644 --- a/services/dkg/src/interfaces/DKGOptions.ts +++ b/services/dkg/src/interfaces/DKGOptions.ts @@ -1,4 +1,6 @@ export interface DKGOptions { - /** The distributed key generation messenger service URL */ + /** DKG CLI path */ + cliPath: string + /** DKG messenger service URL */ messengerUrl: string } \ No newline at end of file diff --git a/services/dkg/src/providers/commands.ts b/services/dkg/src/providers/commands.ts index c705b6b6a..86a74ceaa 100644 --- a/services/dkg/src/providers/commands.ts +++ b/services/dkg/src/providers/commands.ts @@ -3,9 +3,9 @@ import { DKG } from './dkg' import { CommandOptions } from '../interfaces/CommandOptions' export async function initiatePoolDepositCommand(options: CommandOptions) { - const { manager, signer, messengerUrl } = options + const { manager, signer, cliPath, messengerUrl } = options const newOperatorGroup = [1, 2, 3, 4] // Todo get new group here - const ssv = new DKG({ messengerUrl }) + const ssv = new DKG({ cliPath, messengerUrl }) const validator = await ssv.createValidator({ operatorIds: newOperatorGroup, withdrawalAddress: manager.address }) const { depositDataRoot, @@ -30,7 +30,7 @@ export async function initiatePoolDepositCommand(options: CommandOptions) { } export async function initiatePoolReshareCommand(options: CommandOptions) { - const { manager, signer, messengerUrl, id } = options + const { manager, signer, cliPath, messengerUrl, id } = options // Todo reshare event will include the operator to boot @@ -42,7 +42,7 @@ export async function initiatePoolReshareCommand(options: CommandOptions) { const newOperatorGroup = [1, 2, 3, 4] // Get operators to sign reshare - const ssv = new DKG({ messengerUrl }) + const ssv = new DKG({ cliPath, messengerUrl }) const validator = await ssv.reshareValidator({ publicKey, operatorIds: newOperatorGroup, oldOperatorIds: operatorIds, withdrawalAddress: manager.address }) @@ -51,14 +51,14 @@ export async function initiatePoolReshareCommand(options: CommandOptions) { } export async function initiatePoolExitCommand(options: CommandOptions) { - const { manager, signer, messengerUrl, id } = options + const { manager, signer, cliPath, messengerUrl, id } = options // Get pool to exit const pool = await manager.getPool(id) const { publicKey, operatorIds } = pool // Get operators to sign exit - const ssv = new DKG({ messengerUrl }) + const ssv = new DKG({ cliPath, messengerUrl }) // Broadcast exit signature diff --git a/services/dkg/src/providers/config.ts b/services/dkg/src/providers/config.ts index 972113814..70d23bcb3 100644 --- a/services/dkg/src/providers/config.ts +++ b/services/dkg/src/providers/config.ts @@ -17,8 +17,11 @@ export function config() { if (!managerAddress) throw new Error('No manager address provided') const manager = new ethers.Contract(managerAddress, CasimirManagerJson.abi, signer) as ethers.Contract & CasimirManager + const cliPath = process.env.CLI_PATH + if (!cliPath) throw new Error('No cli path provided') + const messengerUrl = process.env.MESSENGER_SRV_ADDR if (!messengerUrl) throw new Error('No messenger url provided') - return { manager, signer, messengerUrl } + return { manager, signer, cliPath, messengerUrl } } diff --git a/services/dkg/src/providers/dkg.ts b/services/dkg/src/providers/dkg.ts index b819671be..2e702017d 100644 --- a/services/dkg/src/providers/dkg.ts +++ b/services/dkg/src/providers/dkg.ts @@ -1,21 +1,23 @@ import fs from 'fs' -import { execSync } from 'child_process' import { KeyGenerationInput } from '../interfaces/KeyGenerationInput' import { DepositData } from '../interfaces/DepositData' import { Shares } from '../interfaces/Shares' import { DKGOptions } from '../interfaces/DKGOptions' import { ReshareInput } from '../interfaces/ReshareInput' -import { getWithdrawalCredentials } from '@casimir/helpers' +import { getWithdrawalCredentials, runSync } from '@casimir/helpers' import { CreateValidatorOptions } from '../interfaces/CreateValidatorOptions' import { Validator } from '@casimir/types' import { ReshareValidatorOptions } from '../interfaces/ReshareValidatorOptions' import { operatorStore } from '@casimir/data' export class DKG { - /** Key generation messenger service URL */ + /** DKG CLI path */ + cliPath: string + /** DKG messenger service URL */ messengerUrl: string constructor(options: DKGOptions) { + this.cliPath = options.cliPath this.messengerUrl = options.messengerUrl } @@ -46,6 +48,8 @@ export class DKG { /** Get validator deposit data */ const { depositDataRoot, publicKey, signature, withdrawalCredentials } = await this.getDepositData(ceremonyId, withdrawalAddress) + console.log('VALIDATOR PK', publicKey) + /** Create validator */ const validator: Validator = { depositDataRoot, @@ -149,8 +153,8 @@ export class DKG { const thresholdFlag = `--threshold ${Object.keys(operators).length - 1}` const withdrawalCredentialsFlag = `--withdrawal-credentials ${getWithdrawalCredentials(withdrawalAddress)}` const forkVersionFlag = '--fork-version prater' - const command = `rockx-dkg-cli keygen ${operatorFlags} ${thresholdFlag} ${withdrawalCredentialsFlag} ${forkVersionFlag}` - const startKeyGeneration = execSync(`${command}`).toString().trim() as string + const command = `${this.cliPath} keygen ${operatorFlags} ${thresholdFlag} ${withdrawalCredentialsFlag} ${forkVersionFlag}` + const startKeyGeneration = runSync(`${command}`).toString().trim() as string const ceremonyId = startKeyGeneration.split(' ').pop() as string return ceremonyId } @@ -183,8 +187,8 @@ export class DKG { const thresholdFlag = `--threshold ${Object.keys(operators).length - 1}` const publicKeyFlag = `--validator-public-key ${publicKey}` const oldOperatorFlags = Object.entries(oldOperators).map(([id, url]) => `--old-operator ${id}=${url}`).join(' ') - const command = `rockx-dkg-cli reshare ${operatorFlags} ${thresholdFlag} ${publicKeyFlag} ${oldOperatorFlags}` - const startReshare = execSync(`${command}`).toString().trim() as string + const command = `${this.cliPath} reshare ${operatorFlags} ${thresholdFlag} ${publicKeyFlag} ${oldOperatorFlags}` + const startReshare = runSync(`${command}`).toString().trim() as string const ceremonyId = startReshare.split(' ').pop() as string return ceremonyId } @@ -203,8 +207,8 @@ export class DKG { */ async getShares(ceremonyId: string): Promise { const requestIdFlag = `--request-id ${ceremonyId}` - const command = `rockx-dkg-cli get-keyshares ${requestIdFlag}` - const getShares = execSync(`${command}`).toString().trim() as string + const command = `${this.cliPath} get-keyshares ${requestIdFlag}` + const getShares = runSync(`${command}`).toString().trim() as string const sharesFile = getShares.split(' ').pop() as string const sharesJSON = JSON.parse(fs.readFileSync(`${sharesFile}`, 'utf8')) fs.rmSync(sharesFile) @@ -233,8 +237,8 @@ export class DKG { const requestIdFlag = `--request-id ${ceremonyId}` const withdrawalCredentialsFlag = `--withdrawal-credentials 01${'0'.repeat(22)}${withdrawalAddress.split('0x')[1]}` const forkVersionFlag = '--fork-version prater' - const command = `rockx-dkg-cli generate-deposit-data ${requestIdFlag} ${withdrawalCredentialsFlag} ${forkVersionFlag}` - const getDepositData = execSync(`${command}`).toString().trim() as string + const command = `${this.cliPath} generate-deposit-data ${requestIdFlag} ${withdrawalCredentialsFlag} ${forkVersionFlag}` + const getDepositData = runSync(`${command}`).toString().trim() as string const depositDataFile = getDepositData.split(' ').pop() as string const depositData = JSON.parse(fs.readFileSync(depositDataFile, 'utf8')) fs.rmSync(depositDataFile) diff --git a/services/dkg/tsconfig.json b/services/dkg/tsconfig.json index 5b187af65..fe283a28e 100644 --- a/services/dkg/tsconfig.json +++ b/services/dkg/tsconfig.json @@ -1,28 +1,19 @@ { - "compilerOptions": { - "target": "ESNext", - "module": "CommonJS", - "lib": [ - "ESNext", - "DOM" - ], - "declaration": true, - "strict": true, - "noEmit": true, - "noImplicitAny": true, - "strictNullChecks": true, - "noImplicitThis": true, - "alwaysStrict": true, - "noUnusedLocals": false, - "noUnusedParameters": false, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": false, - "inlineSourceMap": true, - "inlineSources": true, - "experimentalDecorators": true, - "strictPropertyInitialization": false, - "types": ["node", "jest"], - "esModuleInterop": true, - "resolveJsonModule": true - } - } \ No newline at end of file + "compilerOptions": { + "target": "ESNext", + "strict": true, + "preserveConstEnums": true, + "noEmit": true, + "sourceMap": false, + "module": "CommonJS", + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + "resolveJsonModule": true + }, + "include": [ + "./src/*" + ] +} \ No newline at end of file diff --git a/services/users/scripts/seed.ts b/services/users/scripts/seed.ts index 94ab635f3..7a4ded330 100644 --- a/services/users/scripts/seed.ts +++ b/services/users/scripts/seed.ts @@ -1,6 +1,6 @@ import minimist from 'minimist' import { userStore, accountStore } from '@casimir/data' -import { retryFetch } from '@casimir/helpers' +import { fetchRetry } from '@casimir/helpers' import { Account, User } from '@casimir/types' /** @@ -34,7 +34,7 @@ void async function () { /** Seed Account or User resources with users API */ const port = process.env.PUBLIC_USERS_PORT || 4000 - const seed = await retryFetch(`http://localhost:${port}/seed/${plural}`, { + const seed = await fetchRetry(`http://localhost:${port}/seed/${plural}`, { method: 'POST', headers: { 'Content-Type': 'application/json' diff --git a/services/users/tsconfig.json b/services/users/tsconfig.json index 9bdd6c1fa..83c0e636b 100644 --- a/services/users/tsconfig.json +++ b/services/users/tsconfig.json @@ -19,5 +19,5 @@ "include": [ "./src/*", "env.d.ts" -, "scripts/seed.ts", "scripts/seed.ts" ] + ] } \ No newline at end of file From cfda1cd3221f639ca3469b791f4271d25793f22d Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Tue, 16 May 2023 14:45:17 -0400 Subject: [PATCH 27/78] Fix cleanup in ethereum dev script --- contracts/ethereum/docs/index.md | 88 ++++++++++++++++---------------- scripts/ethereum/dev.ts | 5 +- services/dkg/scripts/dev.ts | 2 +- 3 files changed, 47 insertions(+), 48 deletions(-) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 66552a052..a7c0df343 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -1242,6 +1242,50 @@ _Send ETH to a user_ | user | address | The user address | | amount | uint256 | The amount of stake to send | +## MockFunctionsOracle + +### constructor + +```solidity +constructor() public +``` + +### getRegistry + +```solidity +function getRegistry() external view returns (address) +``` + +Returns the address of the registry contract + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | address | address The address of the registry contract | + +### sendRequest + +```solidity +function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) +``` + +Sends a request (encoded as data) using the provided subscriptionId + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | +| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| _gasLimit | uint32 | Gas limit for the fulfillment callback | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | A unique request identifier (unique per DON) | + ## IDepositContract ### DepositEvent @@ -1315,47 +1359,3 @@ function withdraw(uint256) external Withdraw wrapped ether to get ether -## MockFunctionsOracle - -### constructor - -```solidity -constructor() public -``` - -### getRegistry - -```solidity -function getRegistry() external view returns (address) -``` - -Returns the address of the registry contract - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | address | address The address of the registry contract | - -### sendRequest - -```solidity -function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) -``` - -Sends a request (encoded as data) using the provided subscriptionId - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| _gasLimit | uint32 | Gas limit for the fulfillment callback | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | A unique request identifier (unique per DON) | - diff --git a/scripts/ethereum/dev.ts b/scripts/ethereum/dev.ts index 2d9f83c03..97a217bf6 100644 --- a/scripts/ethereum/dev.ts +++ b/scripts/ethereum/dev.ts @@ -28,8 +28,8 @@ void async function () { /** Parse command line arguments */ const argv = minimist(process.argv.slice(2)) - /** Default to no clean */ - const clean = argv.clean === 'true' || argv.clean === true + /** Default to clean services and data */ + const clean = argv.clean !== 'false' || argv.clean !== false /** Set execution environment */ const execution = argv.execution === 'ganache' ? 'ganache' : 'hardhat' @@ -62,7 +62,6 @@ void async function () { if (clean) { await $`npm run clean --workspace @casimir/ethereum` - await $`npm run clean --workspace @casimir/dkg` } /** Set 12-second interval mining for dev networks */ diff --git a/services/dkg/scripts/dev.ts b/services/dkg/scripts/dev.ts index d16144722..1c6e94808 100644 --- a/services/dkg/scripts/dev.ts +++ b/services/dkg/scripts/dev.ts @@ -1,4 +1,4 @@ -import { fetchRetry, run, runSync } from '@casimir/helpers' +import { fetchRetry, run } from '@casimir/helpers' const resourcePath = 'scripts/resources/rockx-dkg-cli' From 02dc2ec7e5398fcf2bc32dad402ce3ec59398036 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Wed, 17 May 2023 10:57:57 -0400 Subject: [PATCH 28/78] Add ssv v3 contracts --- .gitmodules | 9 - contracts/ethereum/hardhat.config.ts | 2 +- .../scripts/resources/consensus-specs | 1 - .../ethereum/scripts/resources/ssv-contracts | 1 - .../ethereum/scripts/resources/ssv-network | 1 - contracts/ethereum/src/CasimirManager.sol | 6 +- contracts/ethereum/src/CasimirUpkeep.sol | 4 +- .../src/interfaces/ICasimirManager.sol | 4 +- .../src/interfaces/ICasimirUpkeep.sol | 4 +- contracts/ethereum/src/libraries/Types.sol | 4 +- .../ethereum/src/mock/MockFunctionsOracle.sol | 4 +- .../vendor/interfaces/IDepositContract.sol | 2 +- .../src/vendor/interfaces/ISSVNetwork.sol | 354 +++++++++++++++++- .../src/vendor/interfaces/ISSVNetworkCore.sol | 87 +++++ .../vendor/interfaces/ISSVNetworkViews.sol | 100 +++++ .../src/vendor/interfaces/ISSVRegistry.sol | 4 - .../ethereum/src/vendor/interfaces/IWETH9.sol | 2 +- 17 files changed, 555 insertions(+), 34 deletions(-) delete mode 160000 contracts/ethereum/scripts/resources/consensus-specs delete mode 160000 contracts/ethereum/scripts/resources/ssv-contracts delete mode 160000 contracts/ethereum/scripts/resources/ssv-network create mode 100644 contracts/ethereum/src/vendor/interfaces/ISSVNetworkCore.sol create mode 100644 contracts/ethereum/src/vendor/interfaces/ISSVNetworkViews.sol delete mode 100644 contracts/ethereum/src/vendor/interfaces/ISSVRegistry.sol diff --git a/.gitmodules b/.gitmodules index a4c767733..ce6368d16 100644 --- a/.gitmodules +++ b/.gitmodules @@ -10,15 +10,6 @@ [submodule "scripts/ledger/resources/speculos"] path = scripts/ledger/resources/speculos url = https://github.com/LedgerHQ/speculos.git -[submodule "contracts/ethereum/scripts/resources/ssv-network"] - path = contracts/ethereum/scripts/resources/ssv-network - url = https://github.com/bloxapp/ssv-network.git -[submodule "contracts/ethereum/scripts/resources/ssv-contracts"] - path = contracts/ethereum/scripts/resources/ssv-contracts - url = https://github.com/bloxapp/ssv-contracts.git -[submodule "contracts/ethereum/scripts/resources/consensus-specs"] - path = contracts/ethereum/scripts/resources/consensus-specs - url = https://github.com/ethereum/consensus-specs.git [submodule "scripts/trezor/resources/trezor-user-env"] path = scripts/trezor/resources/trezor-user-env url = https://github.com/trezor/trezor-user-env.git diff --git a/contracts/ethereum/hardhat.config.ts b/contracts/ethereum/hardhat.config.ts index eed667828..ae7ad45e4 100644 --- a/contracts/ethereum/hardhat.config.ts +++ b/contracts/ethereum/hardhat.config.ts @@ -64,7 +64,7 @@ const compilerSettings = { runs: 1 } } -const compilerVersions = ['0.8.16'] +const compilerVersions = ['0.8.18'] const externalCompilerVersions = ['0.4.22', '0.4.24', '0.6.6', '0.6.11', '0.8.4'] const compilers = [...compilerVersions, ...externalCompilerVersions].map(version => ({ version, settings: compilerSettings })) diff --git a/contracts/ethereum/scripts/resources/consensus-specs b/contracts/ethereum/scripts/resources/consensus-specs deleted file mode 160000 index ca4468da0..000000000 --- a/contracts/ethereum/scripts/resources/consensus-specs +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ca4468da0d3d288f2c86c0d41c3472df3ad35b82 diff --git a/contracts/ethereum/scripts/resources/ssv-contracts b/contracts/ethereum/scripts/resources/ssv-contracts deleted file mode 160000 index e215dbdb8..000000000 --- a/contracts/ethereum/scripts/resources/ssv-contracts +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e215dbdb8ab757d37a32c41998c5ef1c1162bf86 diff --git a/contracts/ethereum/scripts/resources/ssv-network b/contracts/ethereum/scripts/resources/ssv-network deleted file mode 160000 index 88cbd1cb8..000000000 --- a/contracts/ethereum/scripts/resources/ssv-network +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 88cbd1cb8a1c5d6045c8b03ef079a7379e264a10 diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index 305f10f0c..7fd5bf73a 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -1,5 +1,5 @@ -// SPDX-License-Identifier: MIT -pragma solidity 0.8.16; +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; import "./CasimirUpkeep.sol"; import "./interfaces/ICasimirManager.sol"; @@ -532,7 +532,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { validatorPublicKeys.remove(validatorIndex); exitingValidatorCount--; - ssvNetwork.removeValidator(validatorPublicKey); + // ssvNetwork.removeValidator(validatorPublicKey); emit PoolExited(poolId); } diff --git a/contracts/ethereum/src/CasimirUpkeep.sol b/contracts/ethereum/src/CasimirUpkeep.sol index ba1cd2ebf..5ec43423d 100644 --- a/contracts/ethereum/src/CasimirUpkeep.sol +++ b/contracts/ethereum/src/CasimirUpkeep.sol @@ -1,5 +1,5 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.7; +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; // 1. Handle exits, withdrawals, and clusters // 2. Pick between Functions, EA, and custom oracle diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index 1f2aff2b4..e98c5bb74 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -1,5 +1,5 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.7; +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; interface ICasimirManager { /***********/ diff --git a/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol b/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol index d6db3f958..a3d2a06d1 100644 --- a/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol +++ b/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol @@ -1,5 +1,5 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.7; +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; import "@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol"; diff --git a/contracts/ethereum/src/libraries/Types.sol b/contracts/ethereum/src/libraries/Types.sol index 805c5b1c5..ca2a23fbe 100644 --- a/contracts/ethereum/src/libraries/Types.sol +++ b/contracts/ethereum/src/libraries/Types.sol @@ -1,5 +1,5 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.7; +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; import "../interfaces/ICasimirManager.sol"; diff --git a/contracts/ethereum/src/mock/MockFunctionsOracle.sol b/contracts/ethereum/src/mock/MockFunctionsOracle.sol index 5cee6bf94..7f1eeef09 100644 --- a/contracts/ethereum/src/mock/MockFunctionsOracle.sol +++ b/contracts/ethereum/src/mock/MockFunctionsOracle.sol @@ -1,5 +1,5 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; import "@chainlink/contracts/src/v0.8/dev/interfaces/FunctionsOracleInterface.sol"; diff --git a/contracts/ethereum/src/vendor/interfaces/IDepositContract.sol b/contracts/ethereum/src/vendor/interfaces/IDepositContract.sol index 22af2eac5..b25b893d1 100644 --- a/contracts/ethereum/src/vendor/interfaces/IDepositContract.sol +++ b/contracts/ethereum/src/vendor/interfaces/IDepositContract.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.16; +pragma solidity 0.8.18; interface IDepositContract { /// @notice A processed deposit event. diff --git a/contracts/ethereum/src/vendor/interfaces/ISSVNetwork.sol b/contracts/ethereum/src/vendor/interfaces/ISSVNetwork.sol index 514fbc028..62edd23ad 100644 --- a/contracts/ethereum/src/vendor/interfaces/ISSVNetwork.sol +++ b/contracts/ethereum/src/vendor/interfaces/ISSVNetwork.sol @@ -1,4 +1,354 @@ // SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity ^0.8.2; +pragma solidity 0.8.18; -import "../../../scripts/resources/ssv-network/contracts/ISSVNetwork.sol"; +import "./ISSVNetworkCore.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +interface ISSVNetwork is ISSVNetworkCore { + /**********/ + /* Events */ + /**********/ + + /** + * @dev Emitted when a new operator has been added. + * @param operatorId operator's ID. + * @param owner Operator's ethereum address that can collect fees. + * @param publicKey Operator's public key. Will be used to encrypt secret shares of validators keys. + * @param fee Operator's fee. + */ + event OperatorAdded( + uint64 indexed operatorId, + address indexed owner, + bytes publicKey, + uint256 fee + ); + + /** + * @dev Emitted when operator has been removed. + * @param operatorId operator's ID. + */ + event OperatorRemoved(uint64 indexed operatorId); + + /** + * @dev Emitted when the whitelist of an operator is updated. + * @param operatorId operator's ID. + * @param whitelisted operator's new whitelisted address. + */ + event OperatorWhitelistUpdated( + uint64 indexed operatorId, + address whitelisted + ); + + /** + * @dev Emitted when the validator has been added. + * @param publicKey The public key of a validator. + * @param operatorIds The operator ids list. + * @param shares snappy compressed shares(a set of encrypted and public shares). + * @param cluster All the cluster data. + */ + event ValidatorAdded( + address indexed owner, + uint64[] operatorIds, + bytes publicKey, + bytes shares, + Cluster cluster + ); + + /** + * @dev Emitted when the validator is removed. + * @param publicKey The public key of a validator. + * @param operatorIds The operator ids list. + * @param cluster All the cluster data. + */ + event ValidatorRemoved( + address indexed owner, + uint64[] operatorIds, + bytes publicKey, + Cluster cluster + ); + + event OperatorFeeDeclared( + address indexed owner, + uint64 indexed operatorId, + uint256 blockNumber, + uint256 fee + ); + + event OperatorFeeCancellationDeclared( + address indexed owner, + uint64 indexed operatorId + ); + + /** + * @dev Emitted when an operator's fee is updated. + * @param owner Operator's owner. + * @param blockNumber from which block number. + * @param fee updated fee value. + */ + event OperatorFeeExecuted( + address indexed owner, + uint64 indexed operatorId, + uint256 blockNumber, + uint256 fee + ); + + event ClusterLiquidated( + address indexed owner, + uint64[] operatorIds, + Cluster cluster + ); + + event ClusterReactivated( + address indexed owner, + uint64[] operatorIds, + Cluster cluster + ); + + event OperatorFeeIncreaseLimitUpdated(uint64 value); + + event DeclareOperatorFeePeriodUpdated(uint64 value); + + event ExecuteOperatorFeePeriodUpdated(uint64 value); + + event LiquidationThresholdPeriodUpdated(uint64 value); + + event MinimumLiquidationCollateralUpdated(uint256 value); + + /** + * @dev Emitted when the network fee is updated. + * @param oldFee The old fee + * @param newFee The new fee + */ + event NetworkFeeUpdated(uint256 oldFee, uint256 newFee); + + /** + * @dev Emitted when transfer fees are withdrawn. + * @param value The amount of tokens withdrawn. + * @param recipient The recipient address. + */ + event NetworkEarningsWithdrawn(uint256 value, address recipient); + + event ClusterWithdrawn( + address indexed owner, + uint64[] operatorIds, + uint256 value, + Cluster cluster + ); + event OperatorWithdrawn( + address indexed owner, + uint64 indexed operatorId, + uint256 value + ); + + event ClusterDeposited( + address indexed owner, + uint64[] operatorIds, + uint256 value, + Cluster cluster + ); + + event FeeRecipientAddressUpdated( + address indexed owner, + address recipientAddress + ); + + /****************/ + /* Initializers */ + /****************/ + + /** + * @dev Initializes the contract. + * @param token_ The network token. + * @param operatorMaxFeeIncrease_ The step limit to increase the operator fee + * @param declareOperatorFeePeriod_ The period an operator needs to wait before they can approve their fee. + * @param executeOperatorFeePeriod_ The length of the period in which an operator can approve their fee. + */ + function initialize( + string calldata initialVersion_, + IERC20 token_, + uint64 operatorMaxFeeIncrease_, + uint64 declareOperatorFeePeriod_, + uint64 executeOperatorFeePeriod_, + uint64 minimumBlocksBeforeLiquidation_, + uint256 minimumLiquidationCollateral_, + uint32 validatorsPerOperatorLimit_ + ) external; + + /*******************************/ + /* Operator External Functions */ + /*******************************/ + + /** + * @dev Registers a new operator. + * @param publicKey Operator's public key. Used to encrypt secret shares of validators keys. + * @param fee operator's fee. When fee is set to zero (mostly for private operators), it can not be increased. + */ + function registerOperator( + bytes calldata publicKey, + uint256 fee + ) external returns (uint64); + + /** + * @dev Removes an operator. + * @param operatorId Operator's id. + */ + function removeOperator(uint64 operatorId) external; + + function setOperatorWhitelist( + uint64 operatorId, + address whitelisted + ) external; + + function declareOperatorFee(uint64 operatorId, uint256 fee) external; + + function executeOperatorFee(uint64 operatorId) external; + + function cancelDeclaredOperatorFee(uint64 operatorId) external; + + function reduceOperatorFee(uint64 operatorId, uint256 fee) external; + + function setFeeRecipientAddress(address feeRecipientAddress) external; + + /********************************/ + /* Validator External Functions */ + /********************************/ + + function registerValidator( + bytes calldata publicKey, + uint64[] memory operatorIds, + bytes calldata shares, + uint256 amount, + Cluster memory cluster + ) external; + + function removeValidator( + bytes calldata publicKey, + uint64[] memory operatorIds, + Cluster memory cluster + ) external; + + /**************************/ + /* Cluster External Functions */ + /**************************/ + + function liquidate( + address owner, + uint64[] memory operatorIds, + Cluster memory cluster + ) external; + + function reactivate( + uint64[] memory operatorIds, + uint256 amount, + Cluster memory cluster + ) external; + + /******************************/ + /* Balance External Functions */ + /******************************/ + + function deposit( + address owner, + uint64[] memory operatorIds, + uint256 amount, + Cluster memory cluster + ) external; + + function withdrawOperatorEarnings( + uint64 operatorId, + uint256 tokenAmount + ) external; + + function withdrawOperatorEarnings(uint64 operatorId) external; + + function withdraw( + uint64[] memory operatorIds, + uint256 tokenAmount, + Cluster memory cluster + ) external; + + /**************************/ + /* DAO External Functions */ + /**************************/ + + function updateNetworkFee(uint256 fee) external; + + function withdrawNetworkEarnings(uint256 amount) external; + + function updateOperatorFeeIncreaseLimit( + uint64 newOperatorMaxFeeIncrease + ) external; + + function updateDeclareOperatorFeePeriod( + uint64 newDeclareOperatorFeePeriod + ) external; + + function updateExecuteOperatorFeePeriod( + uint64 newExecuteOperatorFeePeriod + ) external; + + function updateLiquidationThresholdPeriod(uint64 blocks) external; + + function updateMinimumLiquidationCollateral(uint256 amount) external; + + /**************************/ + /* Public State Variables */ + /**************************/ + + function validatorPKs( + bytes32 validatorId + ) external view returns (address owner, bool active); + + function clusters( + bytes32 clusterId + ) external view returns (bytes32 clusterData); + + function operators( + uint64 operatorId + ) + external + view + returns ( + address operatorOwner, + uint64 fee, + uint32 validatorCount, + Snapshot memory snapshot + ); + + function operatorFeeChangeRequests( + uint64 operatorId + ) + external + view + returns (uint64 fee, uint64 approvalBeginTime, uint64 approvalEndTime); + + function operatorsWhitelist( + uint64 operatorId + ) external view returns (address whitelisted); + + function network() + external + view + returns ( + uint64 networkFee, + uint64 networkFeeIndex, + uint64 networkFeeIndexBlockNumber + ); + + function dao() + external + view + returns (uint32 validatorCount, uint64 balance, uint64 block); + + function minimumBlocksBeforeLiquidation() external view returns (uint64); + + function minimumLiquidationCollateral() external view returns (uint64); + + function operatorMaxFeeIncrease() external view returns (uint64); + + function executeOperatorFeePeriod() external view returns (uint64); + + function declareOperatorFeePeriod() external view returns (uint64); + + function version() external view returns (bytes32); +} diff --git a/contracts/ethereum/src/vendor/interfaces/ISSVNetworkCore.sol b/contracts/ethereum/src/vendor/interfaces/ISSVNetworkCore.sol new file mode 100644 index 000000000..7f5bc6f92 --- /dev/null +++ b/contracts/ethereum/src/vendor/interfaces/ISSVNetworkCore.sol @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.18; + +interface ISSVNetworkCore { + /***********/ + /* Structs */ + /***********/ + + struct Validator { + address owner; + bool active; + } + struct Snapshot { + /// @dev block is the last block in which last index was set. For Operator, it's also used to identify an active / inactive one. + uint64 block; + /// @dev index is the last index calculated by index += (currentBlock - block) * fee + uint64 index; + /// @dev accumulated is all the accumulated earnings, calculated by accumulated + lastIndex * validatorCount + uint64 balance; + } + + struct Operator { + address owner; + /// @dev when fee is set to zero (mostly for private operators), it can not be increased + uint64 fee; + uint32 validatorCount; + Snapshot snapshot; + } + + struct OperatorFeeChangeRequest { + uint64 fee; + uint64 approvalBeginTime; + uint64 approvalEndTime; + } + + struct Cluster { + uint32 validatorCount; + uint64 networkFeeIndex; + uint64 index; + bool active; + uint256 balance; + } + + struct DAO { + uint32 validatorCount; + uint64 balance; + uint64 block; + } + + struct Network { + uint64 networkFee; + uint64 networkFeeIndex; + uint64 networkFeeIndexBlockNumber; + } + + /**********/ + /* Errors */ + /**********/ + + error CallerNotOwner(); + error CallerNotWhitelisted(); + error FeeTooLow(); + error FeeExceedsIncreaseLimit(); + error NoFeeDeclared(); + error ApprovalNotWithinTimeframe(); + error OperatorDoesNotExist(); + error InsufficientBalance(); + error ValidatorAlreadyExists(); + error ValidatorDoesNotExist(); + error ClusterNotLiquidatable(); + error InvalidPublicKeyLength(); + error InvalidOperatorIdsLength(); + error ValidatorOwnedByOtherAddress(); + error ClusterAlreadyEnabled(); + error ClusterIsLiquidated(); + error ClusterDoesNotExists(); + error IncorrectClusterState(); + error UnsortedOperatorsList(); + error NewBlockPeriodIsBelowMinimum(); + error ExceedValidatorLimit(); + error TokenTransferFailed(); + error SameFeeChangeNotAllowed(); + error FeeIncreaseNotAllowed(); + error NotAuthorized(); + error OperatorsListNotUnique(); + error OperatorAlreadyExists(); +} diff --git a/contracts/ethereum/src/vendor/interfaces/ISSVNetworkViews.sol b/contracts/ethereum/src/vendor/interfaces/ISSVNetworkViews.sol new file mode 100644 index 000000000..12ee7a065 --- /dev/null +++ b/contracts/ethereum/src/vendor/interfaces/ISSVNetworkViews.sol @@ -0,0 +1,100 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.18; + +import "./ISSVNetworkCore.sol"; +import "./ISSVNetwork.sol"; + +interface ISSVNetworkViews is ISSVNetworkCore { + /****************/ + /* Initializers */ + /****************/ + + /** + * @dev Initializes the contract. + * @param ssvNetwork_ The SSVNetwork contract. + */ + function initialize(ISSVNetwork ssvNetwork_) external; + + /*************************************/ + /* Validator External View Functions */ + /*************************************/ + + function getValidator( + bytes calldata publicKey + ) external returns (address, bool); + + /************************************/ + /* Operator External View Functions */ + /************************************/ + + function getOperatorFee(uint64 operatorId) external returns (uint256); + + function getOperatorDeclaredFee( + uint64 operatorId + ) external returns (uint256, uint256, uint256); + + function getOperatorById( + uint64 operatorId + ) + external + view + returns ( + address owner, + uint256 fee, + uint32 validatorCount, + bool isPrivate, + bool active + ); + + /*******************************/ + /* Cluster External View Functions */ + /*******************************/ + + function isLiquidatable( + address owner, + uint64[] memory operatorIds, + ISSVNetwork.Cluster memory cluster + ) external returns (bool); + + function isLiquidated( + address owner, + uint64[] memory operatorIds, + ISSVNetwork.Cluster memory cluster + ) external returns (bool); + + function getBurnRate( + address owner, + uint64[] memory operatorIds, + ISSVNetwork.Cluster memory cluster + ) external returns (uint256); + + /***********************************/ + /* Balance External View Functions */ + /***********************************/ + + function getOperatorEarnings(uint64 operatorId) external returns (uint256); + + function getBalance( + address owner, + uint64[] memory operatorIds, + ISSVNetwork.Cluster memory cluster + ) external returns (uint256); + + /*******************************/ + /* DAO External View Functions */ + /*******************************/ + + function getNetworkFee() external returns (uint256); + + function getNetworkEarnings() external returns (uint256); + + function getOperatorFeeIncreaseLimit() external returns (uint64); + + function getExecuteOperatorFeePeriod() external returns (uint64); + + function getDeclaredOperatorFeePeriod() external returns (uint64); + + function getLiquidationThresholdPeriod() external returns (uint64); + + function getMinimumLiquidationCollateral() external returns (uint256); +} diff --git a/contracts/ethereum/src/vendor/interfaces/ISSVRegistry.sol b/contracts/ethereum/src/vendor/interfaces/ISSVRegistry.sol deleted file mode 100644 index afb9afdaa..000000000 --- a/contracts/ethereum/src/vendor/interfaces/ISSVRegistry.sol +++ /dev/null @@ -1,4 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity ^0.8.2; - -import "../../../scripts/resources/ssv-network/contracts/ISSVRegistry.sol"; diff --git a/contracts/ethereum/src/vendor/interfaces/IWETH9.sol b/contracts/ethereum/src/vendor/interfaces/IWETH9.sol index d48edd887..6b3341c11 100644 --- a/contracts/ethereum/src/vendor/interfaces/IWETH9.sol +++ b/contracts/ethereum/src/vendor/interfaces/IWETH9.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity 0.8.16; +pragma solidity 0.8.18; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; From 6ec84c867a8b66c17dd6a9824e43e4d58fbb8fbb Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Wed, 17 May 2023 11:09:42 -0400 Subject: [PATCH 29/78] Update web server port and origin --- contracts/ethereum/docs/index.md | 810 ++++++++++++++++++++++++++ services/users/src/index.ts | 2 +- services/users/src/sessions.config.ts | 2 +- 3 files changed, 812 insertions(+), 2 deletions(-) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index a7c0df343..76331d6be 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -1341,6 +1341,816 @@ Query the current deposit count. | ---- | ---- | ----------- | | [0] | bytes | The deposit count encoded as a little endian 64-bit number. | +## ISSVNetwork + +### OperatorAdded + +```solidity +event OperatorAdded(uint64 operatorId, address owner, bytes publicKey, uint256 fee) +``` + +_Emitted when a new operator has been added._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | operator's ID. | +| owner | address | Operator's ethereum address that can collect fees. | +| publicKey | bytes | Operator's public key. Will be used to encrypt secret shares of validators keys. | +| fee | uint256 | Operator's fee. | + +### OperatorRemoved + +```solidity +event OperatorRemoved(uint64 operatorId) +``` + +_Emitted when operator has been removed._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | operator's ID. | + +### OperatorWhitelistUpdated + +```solidity +event OperatorWhitelistUpdated(uint64 operatorId, address whitelisted) +``` + +_Emitted when the whitelist of an operator is updated._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | operator's ID. | +| whitelisted | address | operator's new whitelisted address. | + +### ValidatorAdded + +```solidity +event ValidatorAdded(address owner, uint64[] operatorIds, bytes publicKey, bytes shares, struct ISSVNetworkCore.Cluster cluster) +``` + +_Emitted when the validator has been added._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| owner | address | | +| operatorIds | uint64[] | The operator ids list. | +| publicKey | bytes | The public key of a validator. | +| shares | bytes | snappy compressed shares(a set of encrypted and public shares). | +| cluster | struct ISSVNetworkCore.Cluster | All the cluster data. | + +### ValidatorRemoved + +```solidity +event ValidatorRemoved(address owner, uint64[] operatorIds, bytes publicKey, struct ISSVNetworkCore.Cluster cluster) +``` + +_Emitted when the validator is removed._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| owner | address | | +| operatorIds | uint64[] | The operator ids list. | +| publicKey | bytes | The public key of a validator. | +| cluster | struct ISSVNetworkCore.Cluster | All the cluster data. | + +### OperatorFeeDeclared + +```solidity +event OperatorFeeDeclared(address owner, uint64 operatorId, uint256 blockNumber, uint256 fee) +``` + +### OperatorFeeCancellationDeclared + +```solidity +event OperatorFeeCancellationDeclared(address owner, uint64 operatorId) +``` + +### OperatorFeeExecuted + +```solidity +event OperatorFeeExecuted(address owner, uint64 operatorId, uint256 blockNumber, uint256 fee) +``` + +_Emitted when an operator's fee is updated._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| owner | address | Operator's owner. | +| operatorId | uint64 | | +| blockNumber | uint256 | from which block number. | +| fee | uint256 | updated fee value. | + +### ClusterLiquidated + +```solidity +event ClusterLiquidated(address owner, uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster) +``` + +### ClusterReactivated + +```solidity +event ClusterReactivated(address owner, uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster) +``` + +### OperatorFeeIncreaseLimitUpdated + +```solidity +event OperatorFeeIncreaseLimitUpdated(uint64 value) +``` + +### DeclareOperatorFeePeriodUpdated + +```solidity +event DeclareOperatorFeePeriodUpdated(uint64 value) +``` + +### ExecuteOperatorFeePeriodUpdated + +```solidity +event ExecuteOperatorFeePeriodUpdated(uint64 value) +``` + +### LiquidationThresholdPeriodUpdated + +```solidity +event LiquidationThresholdPeriodUpdated(uint64 value) +``` + +### MinimumLiquidationCollateralUpdated + +```solidity +event MinimumLiquidationCollateralUpdated(uint256 value) +``` + +### NetworkFeeUpdated + +```solidity +event NetworkFeeUpdated(uint256 oldFee, uint256 newFee) +``` + +_Emitted when the network fee is updated._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| oldFee | uint256 | The old fee | +| newFee | uint256 | The new fee | + +### NetworkEarningsWithdrawn + +```solidity +event NetworkEarningsWithdrawn(uint256 value, address recipient) +``` + +_Emitted when transfer fees are withdrawn._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| value | uint256 | The amount of tokens withdrawn. | +| recipient | address | The recipient address. | + +### ClusterWithdrawn + +```solidity +event ClusterWithdrawn(address owner, uint64[] operatorIds, uint256 value, struct ISSVNetworkCore.Cluster cluster) +``` + +### OperatorWithdrawn + +```solidity +event OperatorWithdrawn(address owner, uint64 operatorId, uint256 value) +``` + +### ClusterDeposited + +```solidity +event ClusterDeposited(address owner, uint64[] operatorIds, uint256 value, struct ISSVNetworkCore.Cluster cluster) +``` + +### FeeRecipientAddressUpdated + +```solidity +event FeeRecipientAddressUpdated(address owner, address recipientAddress) +``` + +### initialize + +```solidity +function initialize(string initialVersion_, contract IERC20 token_, uint64 operatorMaxFeeIncrease_, uint64 declareOperatorFeePeriod_, uint64 executeOperatorFeePeriod_, uint64 minimumBlocksBeforeLiquidation_, uint256 minimumLiquidationCollateral_, uint32 validatorsPerOperatorLimit_) external +``` + +_Initializes the contract._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| initialVersion_ | string | | +| token_ | contract IERC20 | The network token. | +| operatorMaxFeeIncrease_ | uint64 | The step limit to increase the operator fee | +| declareOperatorFeePeriod_ | uint64 | The period an operator needs to wait before they can approve their fee. | +| executeOperatorFeePeriod_ | uint64 | The length of the period in which an operator can approve their fee. | +| minimumBlocksBeforeLiquidation_ | uint64 | | +| minimumLiquidationCollateral_ | uint256 | | +| validatorsPerOperatorLimit_ | uint32 | | + +### registerOperator + +```solidity +function registerOperator(bytes publicKey, uint256 fee) external returns (uint64) +``` + +_Registers a new operator._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| publicKey | bytes | Operator's public key. Used to encrypt secret shares of validators keys. | +| fee | uint256 | operator's fee. When fee is set to zero (mostly for private operators), it can not be increased. | + +### removeOperator + +```solidity +function removeOperator(uint64 operatorId) external +``` + +_Removes an operator._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | Operator's id. | + +### setOperatorWhitelist + +```solidity +function setOperatorWhitelist(uint64 operatorId, address whitelisted) external +``` + +### declareOperatorFee + +```solidity +function declareOperatorFee(uint64 operatorId, uint256 fee) external +``` + +### executeOperatorFee + +```solidity +function executeOperatorFee(uint64 operatorId) external +``` + +### cancelDeclaredOperatorFee + +```solidity +function cancelDeclaredOperatorFee(uint64 operatorId) external +``` + +### reduceOperatorFee + +```solidity +function reduceOperatorFee(uint64 operatorId, uint256 fee) external +``` + +### setFeeRecipientAddress + +```solidity +function setFeeRecipientAddress(address feeRecipientAddress) external +``` + +### registerValidator + +```solidity +function registerValidator(bytes publicKey, uint64[] operatorIds, bytes shares, uint256 amount, struct ISSVNetworkCore.Cluster cluster) external +``` + +### removeValidator + +```solidity +function removeValidator(bytes publicKey, uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster) external +``` + +### liquidate + +```solidity +function liquidate(address owner, uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster) external +``` + +### reactivate + +```solidity +function reactivate(uint64[] operatorIds, uint256 amount, struct ISSVNetworkCore.Cluster cluster) external +``` + +### deposit + +```solidity +function deposit(address owner, uint64[] operatorIds, uint256 amount, struct ISSVNetworkCore.Cluster cluster) external +``` + +### withdrawOperatorEarnings + +```solidity +function withdrawOperatorEarnings(uint64 operatorId, uint256 tokenAmount) external +``` + +### withdrawOperatorEarnings + +```solidity +function withdrawOperatorEarnings(uint64 operatorId) external +``` + +### withdraw + +```solidity +function withdraw(uint64[] operatorIds, uint256 tokenAmount, struct ISSVNetworkCore.Cluster cluster) external +``` + +### updateNetworkFee + +```solidity +function updateNetworkFee(uint256 fee) external +``` + +### withdrawNetworkEarnings + +```solidity +function withdrawNetworkEarnings(uint256 amount) external +``` + +### updateOperatorFeeIncreaseLimit + +```solidity +function updateOperatorFeeIncreaseLimit(uint64 newOperatorMaxFeeIncrease) external +``` + +### updateDeclareOperatorFeePeriod + +```solidity +function updateDeclareOperatorFeePeriod(uint64 newDeclareOperatorFeePeriod) external +``` + +### updateExecuteOperatorFeePeriod + +```solidity +function updateExecuteOperatorFeePeriod(uint64 newExecuteOperatorFeePeriod) external +``` + +### updateLiquidationThresholdPeriod + +```solidity +function updateLiquidationThresholdPeriod(uint64 blocks) external +``` + +### updateMinimumLiquidationCollateral + +```solidity +function updateMinimumLiquidationCollateral(uint256 amount) external +``` + +### validatorPKs + +```solidity +function validatorPKs(bytes32 validatorId) external view returns (address owner, bool active) +``` + +### clusters + +```solidity +function clusters(bytes32 clusterId) external view returns (bytes32 clusterData) +``` + +### operators + +```solidity +function operators(uint64 operatorId) external view returns (address operatorOwner, uint64 fee, uint32 validatorCount, struct ISSVNetworkCore.Snapshot snapshot) +``` + +### operatorFeeChangeRequests + +```solidity +function operatorFeeChangeRequests(uint64 operatorId) external view returns (uint64 fee, uint64 approvalBeginTime, uint64 approvalEndTime) +``` + +### operatorsWhitelist + +```solidity +function operatorsWhitelist(uint64 operatorId) external view returns (address whitelisted) +``` + +### network + +```solidity +function network() external view returns (uint64 networkFee, uint64 networkFeeIndex, uint64 networkFeeIndexBlockNumber) +``` + +### dao + +```solidity +function dao() external view returns (uint32 validatorCount, uint64 balance, uint64 block) +``` + +### minimumBlocksBeforeLiquidation + +```solidity +function minimumBlocksBeforeLiquidation() external view returns (uint64) +``` + +### minimumLiquidationCollateral + +```solidity +function minimumLiquidationCollateral() external view returns (uint64) +``` + +### operatorMaxFeeIncrease + +```solidity +function operatorMaxFeeIncrease() external view returns (uint64) +``` + +### executeOperatorFeePeriod + +```solidity +function executeOperatorFeePeriod() external view returns (uint64) +``` + +### declareOperatorFeePeriod + +```solidity +function declareOperatorFeePeriod() external view returns (uint64) +``` + +### version + +```solidity +function version() external view returns (bytes32) +``` + +## ISSVNetworkCore + +### Validator + +```solidity +struct Validator { + address owner; + bool active; +} +``` + +### Snapshot + +```solidity +struct Snapshot { + uint64 block; + uint64 index; + uint64 balance; +} +``` + +### Operator + +```solidity +struct Operator { + address owner; + uint64 fee; + uint32 validatorCount; + struct ISSVNetworkCore.Snapshot snapshot; +} +``` + +### OperatorFeeChangeRequest + +```solidity +struct OperatorFeeChangeRequest { + uint64 fee; + uint64 approvalBeginTime; + uint64 approvalEndTime; +} +``` + +### Cluster + +```solidity +struct Cluster { + uint32 validatorCount; + uint64 networkFeeIndex; + uint64 index; + bool active; + uint256 balance; +} +``` + +### DAO + +```solidity +struct DAO { + uint32 validatorCount; + uint64 balance; + uint64 block; +} +``` + +### Network + +```solidity +struct Network { + uint64 networkFee; + uint64 networkFeeIndex; + uint64 networkFeeIndexBlockNumber; +} +``` + +### CallerNotOwner + +```solidity +error CallerNotOwner() +``` + +### CallerNotWhitelisted + +```solidity +error CallerNotWhitelisted() +``` + +### FeeTooLow + +```solidity +error FeeTooLow() +``` + +### FeeExceedsIncreaseLimit + +```solidity +error FeeExceedsIncreaseLimit() +``` + +### NoFeeDeclared + +```solidity +error NoFeeDeclared() +``` + +### ApprovalNotWithinTimeframe + +```solidity +error ApprovalNotWithinTimeframe() +``` + +### OperatorDoesNotExist + +```solidity +error OperatorDoesNotExist() +``` + +### InsufficientBalance + +```solidity +error InsufficientBalance() +``` + +### ValidatorAlreadyExists + +```solidity +error ValidatorAlreadyExists() +``` + +### ValidatorDoesNotExist + +```solidity +error ValidatorDoesNotExist() +``` + +### ClusterNotLiquidatable + +```solidity +error ClusterNotLiquidatable() +``` + +### InvalidPublicKeyLength + +```solidity +error InvalidPublicKeyLength() +``` + +### InvalidOperatorIdsLength + +```solidity +error InvalidOperatorIdsLength() +``` + +### ValidatorOwnedByOtherAddress + +```solidity +error ValidatorOwnedByOtherAddress() +``` + +### ClusterAlreadyEnabled + +```solidity +error ClusterAlreadyEnabled() +``` + +### ClusterIsLiquidated + +```solidity +error ClusterIsLiquidated() +``` + +### ClusterDoesNotExists + +```solidity +error ClusterDoesNotExists() +``` + +### IncorrectClusterState + +```solidity +error IncorrectClusterState() +``` + +### UnsortedOperatorsList + +```solidity +error UnsortedOperatorsList() +``` + +### NewBlockPeriodIsBelowMinimum + +```solidity +error NewBlockPeriodIsBelowMinimum() +``` + +### ExceedValidatorLimit + +```solidity +error ExceedValidatorLimit() +``` + +### TokenTransferFailed + +```solidity +error TokenTransferFailed() +``` + +### SameFeeChangeNotAllowed + +```solidity +error SameFeeChangeNotAllowed() +``` + +### FeeIncreaseNotAllowed + +```solidity +error FeeIncreaseNotAllowed() +``` + +### NotAuthorized + +```solidity +error NotAuthorized() +``` + +### OperatorsListNotUnique + +```solidity +error OperatorsListNotUnique() +``` + +### OperatorAlreadyExists + +```solidity +error OperatorAlreadyExists() +``` + +## ISSVNetworkViews + +### initialize + +```solidity +function initialize(contract ISSVNetwork ssvNetwork_) external +``` + +_Initializes the contract._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| ssvNetwork_ | contract ISSVNetwork | The SSVNetwork contract. | + +### getValidator + +```solidity +function getValidator(bytes publicKey) external returns (address, bool) +``` + +### getOperatorFee + +```solidity +function getOperatorFee(uint64 operatorId) external returns (uint256) +``` + +### getOperatorDeclaredFee + +```solidity +function getOperatorDeclaredFee(uint64 operatorId) external returns (uint256, uint256, uint256) +``` + +### getOperatorById + +```solidity +function getOperatorById(uint64 operatorId) external view returns (address owner, uint256 fee, uint32 validatorCount, bool isPrivate, bool active) +``` + +### isLiquidatable + +```solidity +function isLiquidatable(address owner, uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster) external returns (bool) +``` + +### isLiquidated + +```solidity +function isLiquidated(address owner, uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster) external returns (bool) +``` + +### getBurnRate + +```solidity +function getBurnRate(address owner, uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster) external returns (uint256) +``` + +### getOperatorEarnings + +```solidity +function getOperatorEarnings(uint64 operatorId) external returns (uint256) +``` + +### getBalance + +```solidity +function getBalance(address owner, uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster) external returns (uint256) +``` + +### getNetworkFee + +```solidity +function getNetworkFee() external returns (uint256) +``` + +### getNetworkEarnings + +```solidity +function getNetworkEarnings() external returns (uint256) +``` + +### getOperatorFeeIncreaseLimit + +```solidity +function getOperatorFeeIncreaseLimit() external returns (uint64) +``` + +### getExecuteOperatorFeePeriod + +```solidity +function getExecuteOperatorFeePeriod() external returns (uint64) +``` + +### getDeclaredOperatorFeePeriod + +```solidity +function getDeclaredOperatorFeePeriod() external returns (uint64) +``` + +### getLiquidationThresholdPeriod + +```solidity +function getLiquidationThresholdPeriod() external returns (uint64) +``` + +### getMinimumLiquidationCollateral + +```solidity +function getMinimumLiquidationCollateral() external returns (uint256) +``` + ## IWETH9 ### deposit diff --git a/services/users/src/index.ts b/services/users/src/index.ts index 81cb71950..242e94ecd 100644 --- a/services/users/src/index.ts +++ b/services/users/src/index.ts @@ -18,7 +18,7 @@ app.use(express.json()) /** CORS needs explicit origin (no *) with credentials:true */ app.use( cors({ - origin: 'http://localhost:3000', + origin: 'http://localhost:3001', allowedHeaders: ['content-type', ...supertokens.getAllCORSHeaders()], methods: ['GET', 'PUT', 'POST', 'DELETE'], credentials: true diff --git a/services/users/src/sessions.config.ts b/services/users/src/sessions.config.ts index 44042b672..f27d85b62 100644 --- a/services/users/src/sessions.config.ts +++ b/services/users/src/sessions.config.ts @@ -10,7 +10,7 @@ export const SuperTokensBackendConfig: TypeInput = { appInfo: { appName: 'Casimir', apiDomain: 'http://localhost:4000', - websiteDomain: 'http://localhost:3000', + websiteDomain: 'http://localhost:3001', }, recipeList: [ Session.init(), From d4fbe3eea08ae38c8135b5f12198821358119831 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Wed, 17 May 2023 11:14:06 -0400 Subject: [PATCH 30/78] Remove contract build clean in dev script --- scripts/ethereum/dev.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/scripts/ethereum/dev.ts b/scripts/ethereum/dev.ts index 97a217bf6..0ac79a64b 100644 --- a/scripts/ethereum/dev.ts +++ b/scripts/ethereum/dev.ts @@ -59,10 +59,6 @@ void async function () { process.env.ETHEREUM_FORKING_URL = url echo(chalk.bgBlackBright('Using ') + chalk.bgBlue(fork) + chalk.bgBlackBright(' ethereum fork at ') + chalk.bgBlue(url)) } - - if (clean) { - await $`npm run clean --workspace @casimir/ethereum` - } /** Set 12-second interval mining for dev networks */ process.env.MINING_INTERVAL = '12' From 5d21c20992aeeba8d60bb109f8e9258207c86afc Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Wed, 17 May 2023 12:56:05 -0400 Subject: [PATCH 31/78] Update mock validators --- common/data/scripts/clean.ts | 5 +- common/data/src/mock/validator.store.json | 198 +++++++----------- common/helpers/src/index.ts | 11 +- common/types/src/interfaces/Validator.ts | 3 +- contracts/ethereum/helpers/dkg.ts | 6 +- contracts/ethereum/src/CasimirManager.sol | 18 +- .../src/interfaces/ICasimirManager.sol | 6 +- services/dkg/.gitignore | 1 + services/dkg/scripts/clean.ts | 5 +- services/dkg/scripts/dev.ts | 2 +- services/dkg/src/index.ts | 2 + services/dkg/src/interfaces/Shares.ts | 6 - services/dkg/src/providers/commands.ts | 15 +- services/dkg/src/providers/dkg.ts | 21 +- 14 files changed, 121 insertions(+), 178 deletions(-) create mode 100644 services/dkg/.gitignore delete mode 100644 services/dkg/src/interfaces/Shares.ts diff --git a/common/data/scripts/clean.ts b/common/data/scripts/clean.ts index 77eb0624b..6139ff982 100644 --- a/common/data/scripts/clean.ts +++ b/common/data/scripts/clean.ts @@ -3,10 +3,13 @@ import { run } from '@casimir/helpers' /** Resource path from package caller */ const resourcePath = './scripts' +/** Compose stack name */ +const stackName = 'casimir-data' + /** * Clean up resources */ void async function () { await run(`rm -rf ${resourcePath}/.out`) - await run(`docker compose -p casimir-data -f ${resourcePath}/docker-compose.yaml down`) + await run(`docker compose -p ${stackName} -f ${resourcePath}/docker-compose.yaml down`) }() \ No newline at end of file diff --git a/common/data/src/mock/validator.store.json b/common/data/src/mock/validator.store.json index 8a4ae5534..e2b2b0e70 100644 --- a/common/data/src/mock/validator.store.json +++ b/common/data/src/mock/validator.store.json @@ -1,122 +1,80 @@ { - "1677706967978": { - "depositDataRoot": "0x0d3537f422edccad29e6b6c585f1476171b281ecf600f5f758ebfe7483ae0cb4", - "publicKey": "0xb18f3f007086e8a7cf3848f55bf1e21eeafcf34c6e30b1fef283b158e9ce4769df4871f2a01cc6d0e37c18a3e1717d2d", - "operatorIds": [ - 1, - 2, - 3, - 4 - ], - "sharesEncrypted": [ - "0x18dafffa73c4ab42db13cd672467ea7cd0efea152c67f63417f2262f12e77304ee07cd545e22bb8a45d3676b2e2d1f6291236950ce6dd415e4e89f861ac2e51feea95cdd92e9b3f255d46623d354630e31906229ac80fea040b1d66f616086327127fd93c9949bd5d0bbe8dd2ca06cacd17e6f0a6a6b74c29f1512f27e71c643ad2a5ce261bb0f553d03a3df7853209eb047c1a4d8a056ca666d38a3cf5a453f61fae1547eb09920ae4a3b530bc74055eb050a0569e9bee8644afdc45a298c5fe700d18747d19c69bde6a2a9896440bfff4fdaae2f9345f8893a57a1b0576476ae97d76934a0030c81845db56860ee1705fce67d945398495b7d534f40fa6879", - "0x68086721c5510ad396852e4b571b2c7e9f5a7aa9228cfdfd4a17577b6a72af56efe6d67a5c223617dfefce37d4cf5dac7856e6c4501cb091eaa213bc226cad5db0c8ff846dd835cdcd7d2b01d5ca81e1c2530b82b9e600804894792589a1e862f84bb0a28d528f25f846c739c229c80cdb6f20691f00413bcbbb16718ee812b530be3f5406ed7d7b6adb25ca2ea33f0d49c5ddc932e81de8b1287cb5b59ed8bdb61dd87d242c5ad3b331ce08ce281c01aa5cc48d6c612795908b88d75be23127c3c19016bb358a0cdd22345a0d0562ad2a062fec19d3bb18b607b52fe124e228628ccc49a7b3105181fefd8310f80e53aae9e58a51838526263def0ca362ecbd", - "0xd88540e6c9808ded94249eb311ef42ba25b3f4f3e0e03442bf4549ea7c40fbeea9cf44755a2f5d6badc0ce5731c65fcba979d55512c992b42416feccca01b31ec5da53119b92a922955263dcee5d30764af93a4a1edb29f309373ecee24b6d5e268904a65510552278582f9f6d439d862b24d3356dfa1357cef79806ecafde3aa47ed835b34e4890568d72d7306f6be95c770fad609dd8d94fb05c77793e35b6d51b072141be3958caa69d7baa2e3f00048c165fbba10bf7922b11bee935523417b3d3dd14b0e84175db4b4116f6ba39beccb7f445b3f5fba38b578cedfcf1fd5a63835cd6498fef1d72424887f5cf2842277bafdcd10f54a5c4f28f01f151d8", - "0x35ce271f77983f8a2a976e98a9308549d46d24254ba49ad5aafe0fb4d3a40b2f33ce3f28cf9064fc0a9c9d166a394d99340634a533cc1e698ae29c43a32bf684aca226322cb997e9be0a3507e04da3aa2c6e77a3295f1af202f2d78567a8608934ea48fa4d2d0611b0a7c5e50847c61d625170947fd1cbae36acd386ee85b8786a2a4e3159eb9f49bb36eeed3de1fb160d2dbfc3da8c5bba7cfa706eaa96d17a5825a92facdae97c215828dc00d5f71c46c59786bbb31241ea8a92b8e50369655e7b98428be6c829ec6c83378f0cfc173a14424a04cbd255e55146996efeacf53d3eaef778eaa50b59fdd5e104d83086ec6c283d94f8cb91b5595ab0caff3431" - ], - "sharesPublicKeys": [ - "0xa92e78bf681839252b73d747bc526c21c7a045b0d0d52380387823959ebb7ff61becb91b09890a0e31f20e47e16055c1", - "0x87c6cc2c7bf521187596902533649ad190d6a9eac811e39d82433b9224f2507245febecf59ee4cca02960ba01313df5f", - "0xa2fc1ace1dfd4f6f915d2e9ea2ae311d7e0749cde3ce8ff96b73007793c9afe58654befbcb8c18b81bf5abad04a641b1", - "0xa643c84020406e575abbcf03095fd1c7e80ebe43e200f751047458ccca56448273fdb1ad7f18cd94d7c9b5fcedf56db8" - ], - "signature": "0x80e4e088bd71d8dd4d1d462ab1cc8344326fd6ba5f0c3ea594ad5a45130ce25668eef17dd333910861ccd64e423b11490614b70afc37736b6ebe5f2c3e7c2b628b0c91e246279f0e4f9670eee7614f37d66cf114ed561a2f7e02eea906fac74f", - "withdrawalCredentials": "0x01000000000000000000000007e05700cb4e946ba50244e27f01805354cd8ef0" - }, - "1677707111195": { - "depositDataRoot": "0xe9a59c4c2f6a50c6de96602287795b8224ff2f2047e807da75ef1f2ec7694842", - "publicKey": "0x96b198a59dad0063dc8ea086af351c3eecf79136e5e6895d5029ba1a4698c631485895173c466390a59ca13b0f2a2e68", - "operatorIds": [ - 1, - 2, - 3, - 4 - ], - "sharesEncrypted": [ - "0x5f1a5ee977521066c2aa734c730816f0f74bea0d9358d6534552ceec238cb0b4aa87facaf7bc057da10ccc4aad6dcedf5083cceb9187c86769c4de2c14e7561b6e8add1e02cb7626170ebbabcddb197498557abf5785c7eaa92901b9b7e5cdd1869d587f564ceb68d84eb03b7e721b9718eef17fec817b5ac8496932a297990dbbb18674e35fbe7f0a6c8f9280dc7bf4f662ca97009557954bf2c11320a7b8869070d6f79e0e5e1227262245c03a0e86b4d065985227963632513160997bb5ddabae9e0549ae6f8b06ffd314582aee7e7fc7f632ebf71b5c24a4d1e1ef3c5ecc945cb39dd6d6c51c8d3d5870d5cb00fe5c4a4348acbb135ef7a5aedbd616912e", - "0x3b1623e4d1155dd53bafb51eb6447768a3de11b4feb2424c7a1eabab71c171839588c2ca9d9e3f9994ad5d75ed80fb90f90ccc54f1a747976d49652006c5f826a6e9139d0e02483c38f63e4554e8050fc42a342f24ce30257d7b86602e6a03de2212e006ecec429fcf519a7fbc1b90898acd94e48a4e65c1555072a1b6cd3c26fefc5fdbcc3a0b1af6a08d76a218b637415e726a40c19fadb8a15192c39885091d39750142a85b7660f38a7d740dfacca3c013e63e8a08262219b18c005f54ba9621376f6f9f09ed30a17b19f7f5bbfce422cf52ba4a1b845bba06b0ce9cdac86b9878087cdae885af3e3cb55d36ea66fa17d4c0784af9038e12fa3af8ec5100", - "0x2209adb28728a448adc0eda32b9542a457c0d61454f00e0c59b21b0074e0fad414c2b31b0715cfe3fd410d6df2215f3dbc9f7ae4dd709a5082e7c7475860843fce0353073f3c48787f81f6f695f9b9c643bfa2bf7f85aa19568f8b9c205235789525c5eb3ddf7a0f91ff6029d241eefb55dbaa0280e33693c912f6485d86e04b75b63689f48371bcda34a7d1077363334320b0afbe02215c17225d055e4ede7d1e26ceb170e0c03f6cd62b785bd06f78ec9b653b92d326ccc6ea1b85bf5f0fac2bb0816fa8dd00137b5dd44f9d067901ae8c54783d1152a98e8e183b38919a062d8cf62ffeeb6969c62287a0459f3540a12d89aa828da46ba837404a72cb4030", - "0x29b88dc2056a7b1f0deacac7532fdf112a25c5b3ae51680ebe62cc6de99b0ad253249e74cf37438fe0334e60b470605d7e7ceab34daf702f410a7ee1f1b52e77928c77094fcf47fc991c8dc986cac293405b3fe66485996a3beefaca2bc3b8543d1b540a0a6921eee041650c951fea376952a038793d5d23670a3a7fd4bc543ea87681029c806bdc17021709e731d5540cff24fb91e189cc2b5e59f04c3ff0e96ca4f3318aded0c09dfa6cbce9b46f511ce5038de3b2efda2a60c12534463c40ede614a7963058fdb47848176a7e3753a654a426c26d8488af644ecb2e26d5ef00cea4bcf65909932dee8ff48f9ec7a9f82268cceec4c029a8fffd4920824e68" - ], - "sharesPublicKeys": [ - "0x87b2dce78bdd092998949387c206a01cef0f69dfd4d85b72a288202f2a3e38c5780bb88734b48f455e52c4045d148a4c", - "0x85c09fa89fc3c9466fb8c906b9f1af158463f3b1b6eea8cb23406016102c83686f61fe82eae0d838d0166a312577b02d", - "0xa66380eed9ac85affe93f7387ab58261fe7679a9e25d5408dbe70754be46804990772b37a35a95aef4cf5127ada86458", - "0x88c1761c2955b75bc38c6d5ce64c972c46970d7ae00c701ec609d03ba3912d7ac040bae7fb8424d089e181e516ff0b41" - ], - "signature": "0x91ec46da324b8736f7f1a6ebe3b4bedc83511230c282af24b657e1dab9f11081507c34d02a02c4d5c7049d10407d73b915fa28a66b1701e1e0597406ea2b23d485227822faaaa3f80629a72bb7d15352a6a9adfc73cf84aeab6a725dcc6cda84", - "withdrawalCredentials": "0x01000000000000000000000007e05700cb4e946ba50244e27f01805354cd8ef0" - }, - "1677707132781": { - "depositDataRoot": "0xe9dfc7e7836f0582a810c29d35678afdf11e88bddf02b326b3331823edf8a382", - "publicKey": "0xa21d084713a2ebc0013e1effb3b94a71207617b859a9b5353e2ede5d4b4f8ee2f136eefc41a7aa5c4f62ac865a88191b", - "operatorIds": [ - 1, - 2, - 3, - 4 - ], - "sharesEncrypted": [ - "0x56469cced6756ac54137940b1ba2499b700539da948bb0b219472f7077c2ca72378435ed0dd214719181f768850d7f1c088b885ed958a913aa14b30330b10e9e469090d0917831713fe39c205158e414230aa59ff836e8a37f2cd704df1049261bfb9a9f0293faf2d21f1f52a456e4ced9eb5619a0723695072419cd69f844e9bb6cc36399bbe149961de2306ec6139f48114593784bfdbf90f05fff3f334fad61e2fd3af60c4e382818576c3814906560fa6483545f49f22932620d61fb7ddc2d80c819f2ae54cba0670dda3557d910068107b31930b8a7341ae2820041420346ff37409810836010b626da2d74f28ff5dd244acedcbf543e902f8a7677a698", - "0x68dddec161975aa7ec3bbee170bddcdec2258f7b644ea8f50ce82f048e44f0d8835a2507bf431bb6243007fd64c7e20a9d31854e1f1a343a94140eff3ec0aade07a8ff21b18d78c256f255dba5a85510fdb8960e747b431969cf86f23c1e261aaa37e57fd9dd7dc6d08fee5f6915481359f44ca551f7481cfad889552b9d53c40395b1fbbb694d168c5314ed39763e708975a6a99d7457cfcdf45816c0f368228c2cacc80cc522c89ab554b8d526a37d26514bd26c9c7c145fa2a1958e3dae6fe62c38ce9fee93c0c85db656c2df6cd06187e5d58e4ce4ce234a8d80cf89f84e6ea7a8738a3a97cfcbda67466a588223aa86aace7aafabf8dc2d4e3e3ed6d56c", - "0xc404d2f72d148a3e8f951dd98656d33c171d3fdee85cb606447dfe487b27622d3f88eaadf503ff3b996c2ef5f5fbbbbb632e4d9643296e6dbe8e9b43bf9abcd82bb6e9bd730f955b6dd1d1ba9e3dc760cb9cb1a1cec4fbd3f060554f561c51251dcd44bacdecfcd896080d8b276bb5a3ffaa5f1eff427f77ee86642f12d19cb157be2fe3a3086c4dc5ae38069ef62b352f0c5e0019577c568cf00bbe11d7c4174a256469ee7b7ab26c0b638fab85c7252b175f0e1fc95c721f5b993fb445ebeb22ef1da652e007df858dd8084b270748f6a90d347c90f383f1e5ffcab77d8aa8f84541acc0f8bbf8d7dc51e36c66c285ced09bdaf56c002eddd8ffaff6f0a843", - "0x361a1fe13ec3bab36a011ba66e7a14a8efbee1bb6f4227b92e1b137ca89ce9a449af80b6df049966b564655a3bbed8163f99b3e3009f89ff749c005d6011d53e472c3f966913fd8a23ae5a9a0bbddb550e680af64d88ad0dca8b0598ce84c78d1acd667a80358fc4cd8e27488e89702d3927e18dd5caa2536a911a82abaa2bf7459dfd3c7b236966e7ec1b9f1514eb1209d15230d6783b19c36d997693d1157795d844c7af0c1fcd7eaeea7f3e0e9e6547b724107ede32e3d674fbef27a94349dfc7438ccce9d9bae3a6bb6273a361e9e1bd542c4d1a0862082f67822aa12bcdb8dcd7212ba88288af44a33b55990e0c1e519731bfdfc429fc0e3084abd8bdfb" - ], - "sharesPublicKeys": [ - "0xa148a47cf96932ab7a10ca6457f0b2a9d0b81f1ca079668087b1e70ca30cf6feb799ca340c66c3e9f04ec1387ffe1dda", - "0x98b15a8569aeb5f475f24689b90c1b31b48e5d54f37cd8f15bad3b1a1877a2461e7c352adbd14ec0577d6151a408a03f", - "0x95dabd7d48c3f9703061bd28bc8438d73ddb4a6b2dca513aa461edbb8022eff8d9918ba7f8154721a355ecdc6c79b84c", - "0xad5faccb495c4c4cfc51546eac85676386cf08830bdc4d461d56d47ecaef7b7eb2a9cc8e148e8c8265ec0c58ba1f4400" - ], - "signature": "0x84c9afaacfb7b5e2e4388b82fd93520b73096b5d686fd1b96335f466f812d0b5f6c7f9388d02b9db7b64f8c1ec238a1005f765f324fb0b4d2ed8d75613116742b19bf05d699adab3c91829da8be939499dfc94d886cb4ea037050d2124497012", - "withdrawalCredentials": "0x01000000000000000000000007e05700cb4e946ba50244e27f01805354cd8ef0" - }, - "1682029172203": { - "depositDataRoot": "0x080e0fd5662a93b7824fe3b9b3931d5255de029a9837af9fbbf38b430a1c0410", - "publicKey": "0xa8e451ef957f2afc2d1e5f90b2ed1e7293647631aa2578b8be914dbf335c3d349bbda05120e6723cf002df0b77cbaefb", - "operatorIds": [ - 1, - 2, - 3, - 4 - ], - "sharesEncrypted": [ - "0x1b829ef9e898c3a1eb7e0a8b58ceaf2d5d4284ce84124a1da1c63438e59c49cc08aa00e24970e1e76b1b9d9e351c67ee6679c9354dee5ff1c58f1cd4071989536066e532ed7875ae64d50ca7322b212d96b49b1539edb37a6bb679ec630998ca510e0dae8f48fa1f294e25144ec2629674d2853fae40a009a21e2c0a186d29ba7b21d83c7c96d619387b1a09eaddfca27f7d607b51882bcef2b2063cbcea6724d2d112b4f99b7692361a08fe7a2738cdb9f5978c9b1126ba224082e419dccfaed26e96e8d7ff7e8269bc98846614dc7be7c23157c4338e2ca6cd7cfbd4b9317eb057daadb1cd06704812080f9e1bb3d3c1ff7dcc216352f7288e6bbbf5939cb4", - "0x2fc1080c6ccbe48a243091aec02dfb818dd9f0a99db2895dcb85be4af40c255284d5f07cb1b75265d49054955207961a79ff4562301de966e1188a47589df17a1150818bbb3c91a70f7190f40ab4cf0cebce277dbe914a269715bac482202df2f559bf8788f91bce67f86a130e5eb20f004c6813720bd31623ae2f90328805a9774108edd0ae40a1ae26f52a8147c8959702df4bd24617dce1454938a2a44008456bed1e13157ecfbcccb657192b26ff8f32ca769743f6fae58fafa9769db684e63b613a0b4a56f5dd433267c733351f6c42622fd20ab5f58f634d2003f5a321a40b4c64a4659fec0cfa04b8c642f902a18374c712ab170249ddf3cce2330cb6", - "0x5827b573a74757440de6cb9afc9f7bc4906862ca9b225685a0b55ba7f7f2bde1db500c47089fa7e0dbde7b8e24188821fcf84b1f9a4fd34c46dbe6f6a32ffe398fdd2d4587586ae2b3b5d7b570ca180985edc883af4b2ad7591772b07527eb5382d79850897dc685754059d9d14a5f256b9aef75a9b3c09db6bcfbb7f42a16fc3ce381f355d2a0b0c2430750b24f25c2f2315705b09ba8606dbb2c8ac61efc93d62d974a7aaf163ca3f856335fc7179d9b68af5d470326ab0032fc6b94f73bb95e8d182baa1c6ed7cf49cd7741575e76a5c6d31f4410c7f6dea293447e0e79cc8a860d3eb223b7e52b2772d1f178267a23de4bf1a0aaa28541c49ba5ac3667e0", - "0x16be0386aa6a97dab30aa2b709cf14e1b425e718899388ea63cdb9f0dcc3537631997ce804848a9ca713ca99e13f5cbfd2be783ea971a753f3a60fd5408db4ef829a4d6c231ba3971c76662d9bd5fb9fc6fde90a68e9069f87cb1abd3040e382199e2c6b4f49ed9bb30a4716ccbdcd11f20415b66e831b2ea394b2fd87cb74bdcecf32d705c6e0a829a692b7b91af920fb83785ce859db1888b831a337005eecc1e6f10bc83da1c87ba01178b01c20660f1b08f302d6ffeeb99b4387f91711f638419a5393803a1efb1c30d3e4943301d0266a502de9a4b30884c19dc4c167cba53d85cc11cab5d3578e919ec827cdf2823d192408fda4faaae8ffc35e019c0a" - ], - "sharesPublicKeys": [ - "0xa410862d901916524df8620c5cc214eb02ec27c06d19dd02355052a5b40f0ac25280f5fbc364aa36f3f71d2729c01c43", - "0xa539c8d398fecce0801465b1451c8d9d5d0d5c37dba4b4eb47c6781302b39e228acce0ef1368805885b600b2955ee35d", - "0x834b18f29d22cbff851b8dac50c8a23995642b24e950552e1a495181f59e7e3c6e08c3567f2b9ff4584f8e5833d8e67f", - "0xb94b389871f8db8c0e3166cf0cb4303625c0f888228863a2b7064c0f7bebc1e36bcb61c3ef176d9d3356d77558066554" - ], - "signature": "0x9884a6958bbda8cfe8f9e266754c8d0325df14fa2390200de1fbf560d985648370682a8f1339c938a8485835b172cc82129ed3278491e78fc10117fc0d441baf7046249c5439e9236bdaae40cffe67fd792eb7f7534ef0461e95c2aa334249b9", - "withdrawalCredentials": "0x01000000000000000000000007e05700cb4e946ba50244e27f01805354cd8ef0" - }, - "1682029266157": { - "depositDataRoot": "0x8823df02cd687de5fbd9fa579b3dd36bf4cee3fc0fbfbeb1db9075b08a2fde7a", - "publicKey": "0xb5c41bc1e75d68f19551dd901b09cf238ee4ea427db1d5bcc56ff8c06fe6c44af42d5796ee7c991ae5a467d6dad50b9d", - "operatorIds": [ - 1, - 2, - 3, - 4 - ], - "sharesEncrypted": [ - "0x50d38e3a5b8f1331b6c9094fd970d091ce3d0abff83e00af648452e2a91e14849d96c2af58b8ebc0135e3b93352f8a24c50e3d2c018705a808162509fa9e5910c1821801b95147c449acf5d4abaff49d885dee031416b1ea55b9aa19af0eec50b431031c3937ba0c28e48dcfa8ab83bb15b28c71dce673d434cc868c66852ff06a70897692a810b5d0ff4fddb671261de7d870d52c3f788f4e477d51fd2543188e84ae50b3b65c3e78f70e129f5aeac1209b410ea8769d1dcb13c60a0ce5821f307e4f4b4fbac75e3be548edabf4741f1eda8b323ee3a1be41c91ef02ebc336801573edd4dd7884542c83abaac1cdc55da2dad97593d149f736e599f31287006", - "0xb658e8ffa00b046b459adc195c85a995a5f2a38516a71a9fb06dafb23f476f5738472b77850c47710a10c447971ae594bf5cfef0add739c0b2ecfb4bee9a8585a1324dc7e922473601d362fc95082f7aa02b0492ea2a82473a6b6301f96486e13cf00996cbfc9847044cddcadf5bde09ffe2306b36e86554b5927401b080cf785c9ebb2158c181a9530847c44333826341cd05178d6b55cb692c057e0592f41fa780e1a8a89b88fc6c6590f39fd22b85fcaedf90aeb157f21aa49bf5b7a2e459cddd2d915f808419d150f35589a07e3a7e87d0e5028db27a235f7572935dc225e0143c2e1e968433940f776d2c55792ed1bd911f8f815dbbb5a0677ca990f76a", - "0x600136e52c2e77265edcc674b1393ae3ea2a5eeb1667ae9aba7d6017fc5b0c617b2516fd12b2eca44269ff0d9c8bb63e54a5d17d59e09c75cd07ba34a00bef049eecf845dc72629f8abc5a3dbc77d9fb236f55105cd4ae1f20c9178219a256347ccab80ba330b0e97936b85c0bcb968afdd20427872f3d05d4d447f18ec03a0e3efc4d506867fe153c8356b45a951dba341f4189388a61c6ecc365d8a3896a9d51989ddeeb1b572eadd611a946c528986cd5f70d9cb8584bbef1cc6b4a49546b3cf9d126cd75784477a843cb5bcf701f972af114313ce3889546c17d9095589c9a4e854eaf0b48baaf7a9ee9432d6b9d40b0b24d08e5b50aceec92b391c7a21f", - "0xa43a54741faab9e7d013d2bbf16d37ff17168797c8842ca87bd1507da1d049f17f41f17635fecd749f46926e3bb0fb050bd868729ccc3a4754174b6a5be9026faed41d41e142cc3ee63bf8278fa2304409adc76b73f9233ef3a595aad7ac91f297285ae2be8aeb00b65ebfa6b94412a762c345324952e1041a80a530b6516503062b05635bafd759634f1f004b450e8a5e5df82e70e825f6ac10e85d09f7fa93e9888fd802a496d867cd57fa24f2aa2a1559b89eaa188e25d7b1ba9fe0943c0f975f87329e7566a448f87157f34c2fb7a7d71e088a972e9f2b2a901944a4c2abc0e2e4a7653d2b71b7690c28262a157db055411b6f679f3dc482d24fe48b7ce0" - ], - "sharesPublicKeys": [ - "0xa195e2dd8704a8cfb0249ef6f5eecb1f014b5f29d4cde983d93d01ca651a5c5cd7e261b9f1013803c2db23a5a538e3d3", - "0x8f47eb6d6c8bfd00437bf4f4c3063413ecc2fd5c01bb3664a7936b69d4e990bca601c4f3c6f4baa829ad8ef2afb08191", - "0x85763686250462930079aaf5ae4ae3c8048e6739d373faebe5dc72d55df6da4d94afabb9942576092335e0e590246d65", - "0xaeb305149e6373bf231bb450dc67727101871bf660afc24704c6bdf052a17e715fbc1db37e8acf621480b342ed1e166a" - ], - "signature": "0x82ac99921a75f04c9b9d45df6c56523a5d0f00d74e5dab36769f3160710d0df02c60d07a703af536c18acdc3e513c4fe192cabf861f1f79a785768df3d47b09d13953cdadc7f747fc1b73ef855107d02486adb2c82024c3eec1f93f2e84e27f0", - "withdrawalCredentials": "0x01000000000000000000000007e05700cb4e946ba50244e27f01805354cd8ef0" - } + "1684341938413": { + "depositDataRoot": "0xc0941d38fdc62ee7c0fefe84c1b33ff90ecfc35ac8cbdbc3a4596acec366298e", + "publicKey": "0x87f31d8d16935736886235bb93c0dfd24e24588af5e79c2f3a7d44ef969957e49e635abd1ba9b03e9c496f01cb885c75", + "operatorIds": [ + 1, + 2, + 3, + 4 + ], + "shares": "0x00c08e0a6022cbda2ef8f7b651a1dc1875ef5e00e9b3c01794163c99ea57ad79721941e50b30d88ce9ad8ac514a8f34c9a8183eec563c9f952bce19c46a8bc5a5bf5972288e5f7830ab269e8b1c17378a15c7974f792ee8d8e4a9640b2c7cc42f185985e35defbfd310255f2d5a6163517c577d242e9fb787338899c69e89afe18927efd32f167ceb37960c52879b25a30f2b9367fcca6af137885626fef2b9f64b643b0166208d792cfa5a6b207e3469248dfe32d42e199ce7407bb0fc665124863e75d346fdefc73bdb675dd9ef1f6fd6bbefae3bedfd1fedf7bae5d73cd9f71ce1de39e5a7bb739d9debdd9cd3b77b73ce377b775ee9b6fad3bedae5fd5cd5a7b5dfdd9aedcddc6fcd78eb6ede7df6fad7b6de69f71b75d7f4ebde377fce36d5aeb6e7cf3b6bbdfae1fdf46daf39edcf5de1b6f4d3ce1af1d6dbf34d5e77b79f69bd37d75d3ad5b7fddb5f7bedb7daf3675d7b6e1cd1e77bf5ce5fe1cf5ddfb75cdbde3be5e75e77de7deb6e39737d9a7fb6b4d1b7b6f1fe3ceb47b9ddddda7b7ef9ddb735e7bddcd7a69ae5be9cdf7f78f7dd9ce5eeb4eb9df96f67dae34d1bd9fe3979fdf471af39e7cddc7f9d39d5dddc7bdf34ef67386bcd7adf5e9d7dbe9fefc7f8df7f3be1aefbf3769eef4dfb77cd777f6f39775d7be7adf97b67b9f38e76e35f38e38e1d6faedad357f97367b671fe3df1dd75ef7eb6d75df6d7c77a778e77f79e1d7f4d9f7dd71f7fad3673c6f7f5b6fc73cd37e1cdbb7dcd5fd1ddf97fce36d3b7da7bd7b8d7cdb86dfdfd79d71ce38f1fdde7ba6f8f5de7cddbdb7eb5e3a7f8f3df36f3adde79c6b96b7f34e9a77ddf577969ce37eb4e7bd5e69d735ddfd9ae7d6fdefad74db97f4eb57f5f777776f971f71ed5fd1a69d71ce3be3a71b7dce3af1f69d7f5f7475ad3b77d79fdfce9ee38f7dd3dd3573de9ef1f6fad9ce356f4ef6f38e7aeb669ff1be5ae376b8d5cdbddbcdfa79df1cebc75cd9a6dadbdeded35e5b6b6df76dcf7a7daf3777579dd766bcf7b6f6f34eb9edad1f7b9d75dfbe39e75df777de37d1ad5ff7df1fd797347db775db6f7bddd6b5ef6e9ed9f6f8779e5ce37f37d757dff76e7c6f8d38f75d5fe1b737ef9f7c7f66b8735edef7c6bbd5fe38f1bd9fdbdddcef4f3ceb8efcedd7f6dbddf6e3475c79df3ad5be74e9f69ce5f75a6bddbcd3d6fdddf6bce3be77f75d3a75fe9be9f69bd9eedceb47f5d3573cdfc79ad397b8ef6e3b7357786faeb56b66b67b7d5ee9ddbd75bf5cd77e9ae346bbd5de9ce5fd7769eede69d79fd7a7b7eb969c73ae7971e79ef38e387fb737737e1bdb9edce756fd79b75de35e5d7dcdf6eb4eb46dde5ee78f5dedfd3579f7b8edb7b7f1ad3bd7bdfbf7beb47766b7f78e36f7673d6bc7faddb7b96b4e5deb8d3cd7cd1adf8f1bedde76d3c6f8eb8f757f47fb77adbdf1fd39f1e71bf7adba7dfd1dd77778efcdf67396dd7f7d1fd3d69d6bbe1bd9de39f1c6dff1dd5b71ed75e9af7bdfbddeeb87bb6bdd39e38f757377776b46bddda71eebc75dd5a75cf7671ff5fef9ef57de6deeb5f5a777edfefcef76b477ddbde3d7fa7f569e73aedddfbdfbe5de5e6faf7d734dbaef769de5ad5ee9ce3cd7bef5e3571eeb7e35d38e786bdd777756f47b879a73d71cf7cd9f75cdfcebae1cddeddfdb9d3b7fb79dd1f6b46fce5de5cdb673975df7a77be1cd79f7ae35df67fcd9ed3cdb4e74eb469ddb9dbb6bcddc7dae9e6ba6bde7469ff37e357b6f79ef4f1fe1c69fe9e71ee1aef5d1a75b6b47b7f7cf39db46b575c7bdd36d9b7f46ba6f5e1debbdf97bd75f6dedbae37edfddd7dde9b73ae1ad767fbdb7f34edcdba7f973ad7a7b7dfc6f6e5b71bd79e5fd1eeb5df4f7871dd3a6db79b75ad756fddbdebae79e7cd1cd5a71dedbddb73875bf3c7dd6b6776ef577df36d5af767b87b7d3ddddebc6de6f9e7bedcd5bef979ee1e6f8f76f7979b75fddc79bd7c73d734efbd5dd7c6f675ee38e5ff3cddaf7475d7bbe3deb4e9e7f8e5fdddf74f38e75f1adf77f7e1fdb8d5d7db6fc71be1aebb69cdf6df6d9cf5b75a6daf7577bdf67df6f6e3577877b79ed756ba69ee3a6f9df7e5a6f769fe1f71b77c69e6bbd1dddddfcefae39f1be5bd9beb777a71dd1fdfd6bcddc6ddf75d77f5f739f78f3bf7bd77f35d34e7ceb9d397faf78e5cedee1a6f5e1be5fe5d7fd6dbe35e376ded7b6f66fd79a7bc69fe37d39f1e6bce1f77c7f9f38ef9ddf69deb8f5cd377f9edbe37db977ae9b79f6b47b57dde7d77c7766fde74e1ff3b6f575fdfbe5d7f475df74e9c73c79bdf4d5df1be7ddfb7faf3775d7b6ebbd5ef1ee3b6fc73bf75f3cd1ed34ef8f397b5f3a69c777f7c7dcd766f5f3ceb6f77e5ed1ff7cd35e5ee5ad7d7ddd776fcefbe9bd9feddddc737d76db5f38f1b79ad367b76bae5ae9ef5ee376bbe1b79be3b779", + "signature": "0xa66f7b04c719954f8bdab939d64f0c9c33e005151e30e290f388f0d0fbc59de8b70e8c8f6793e3c73094c8f857af99f90eda005a9f952126290617235ecca66111751f831e5bf8b22a5132d6695a1d2cafa2c7f08715c97ed74b3a54b2f74f00", + "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + }, + "1684341963696": { + "depositDataRoot": "0xc6996ebef4f4eb4fd9fbae7de11f9680467d1af23b5e1c2e649e423aa8d8d619", + "publicKey": "0xb7e0ab492edfc95868bc12c9d8a3c1d67b8641a6464c20a935b02edae4d8caf90b8983072f7197ce389a33326499c996", + "operatorIds": [ + 1, + 2, + 3, + 4 + ], + "shares": "0x00c0a024998a506528d958442dd54c0318b63729f29ba67f47b87b6327d80eaf2260b2be7f238284b6858cb0726745d6cceb95469afa025844f3964b9dadad5edb58d26de6168b44a65bc898bab45eb410043c7f8b26028dab1a87478a1e6f294cb0b259ffff254bc73265ae676a104d3ca7a729e05799cbfde68d0cf87ae1666f0d395d2aef8be41a5da1e2e98221060b41ab3559f50200d4ce74db25a0c34285a1dba2e6f8d3a19395697b85e2df71f17c7999352c7ac49d1a4e005921685d4a83db9ebd6b879bddde397bdd5edbd7f7f39f74eb9dbbe5df1e7dad9ff37e767b477bd1adb9eb8dfb6baefbf7a6bcef671ae35e3d79b75ce7769a7bbd7cd74efbd1dd776dfd747b4ddde9f75defb69e7f6e5df3ce3973979ddfce5eef8e1fd397df7baedb6f569e7fcd7775edbce5ad5a6b96fd79a69ceb5737dbc7dfebadf871f73dd3879c6fceda7776faeb8d7cf1d7fb75c6b5ddff76f1ee1be9edf6778f78e5a75edb9d36e1be37e3bf77eb77f7edc73ce396bae7b6dde1feb6f3471d71eebcdf96f87bce9ce9d6bdeb8d5e75ae34efc69dd36d9b75cdf4e9e7b4d1cdf77b6dfb6fcd9c7dd6b8e5edb76dcd5ceb6ef9e36d35f5e6fb7bb6f771ddf777dd1be7b7bc71a6fc7fcf7df5ef1cdf7f74e7579ef5ae1bef4ddbef4eba71ee5ee76e1c7b6f1c6f6dfc7b779ce7bd5ff5deb7ddbf5df5c75df5ae1bd5de9d7b7dda7f67ddddaf35d5bd5d77a79e7bcf3573a73af5ff5eeb77b6ef86b66b8d9d79cd3b7747b6e1be78e35f1cf3d7dd7fcd9a7de6b4df8ddbd3573ad1febcdb56dfe1a7fbf34e5eedb6dfeddd1cd9e77af34f3ae5fd1e7bcf74e75e7dd1c7dbe7b69adfd6dbe37ddd6fde9f6b8ef56b871d7db7fbf5ef396f675de5ce1dd1f7f869adf8db97dbddcddff79d346fa7fdf1be9bdb9774f7a69c71aedef76d9f73b79d6db7b47767b5ef8ef5e367f5e9dd9cf5ed1ef37736ddcf3b6f9ddaf3cd5bd7cddb7f4dbd6b5edaef775a77de7673779fd7de76db77bddf579a7f5e7ae75dddd7ae3ddb5db8d9c6bdd9ceb971d77469a7f4ddcddeefa73a77d7fc6de73cf1a7f7f79d7def77787fb7b4e7d6dee36e9f7dadfdf5de39d37f5cd7877a75fd9bf75e9ed7aeb8d7de7b779d5ad7c6ded3975e75ae5ef1fddbddcef573ad5a6f4df5e1befae3ad35ebce9bd5de7cd3d69df7779b7b575ff5e69e73cef5d786f5d7be1d6ddebae5dd78e77f777b47da7347dae3c7ded356df75d6b7eb877be39d7ad1af7af7b75dddad77e9b6f7f1ce3577769defbebd75ad3ae3a775d3d69deda7bbe34edbdf46f7d7cef5f766de75ad9d7386dbd3a75ff36e3bddadf8d367db775e34eb7f7969ae1de9cf386fae3979b7f4f7c778d9be76e5ae7c6f673aeded9edbaf1c79c6dfedeebaf74e7b73b7b5e1e6b9775776efb7bde9ee7c73be38d9fe1be5e75d77c7b7737d1c6fb71cedfdb6d5deb871c778d1ad1e75d7f77bb71f6fcdbcd5de3a6fdeda69e79f736db5d7c7fadf4d9e7fb75bd787f6e75d38e9b6ba7f9dde6b479af5eedc75c7f66fa77673577adddf7877c7777bb73cf5d6fd71b7bbd1aef86ba6f8ebaedf6fc69defbf34e5df7c6df79f7dcddedbdf1ce38edddf5f1bdb7f5ed7ae75e7bf78d1e7bce39f36735f5e7da71c73c737e5ff5eefbef9e3af7cddf75adb76bb73bd75f767f6e1fd7bebad346bce74ddfd1f69ee3a7fd7dc69fdb7d7cd36d9f7b5e5d6dedb4f5f7b4ebaf37dbcd756dc7f9d75eba736ddadf56fbeb9df7f1ff77e5ad3cdb76b4e5a6f77faf3cf1c7dad9cd38efaeb4d1ef7ce5fe7c71deb9e76d39f37e7775eeddef479ff5de7875fddc7b4d397b579f7bbe3de1a7dc6bdd7d7b66b47b4f777bae7a6dfd75d9aedb77af5a75aeda75bf787dad35d75f377df79ce1bd9ef35dfb7bbf38d5dd78ebae5ddbadb96f9735f1aeb7dfd79ae1c73b6deef5df86bc6bb779df8f39e9e735dbbe5cd1fe9ff3bdba79c7f4e1e6bdd74f1eeba7347da69e6b6f39f7bd1fefaedad7adb47f8d7ad3a778f396b6e5bdb8d5d69ed5b7f7e9ff7575ef5df36e38e39ef6d5ed1ef797b86f6e5d7b6d7777c6dce1cddcebb77873adb56deeb4e9ee1d7b46f6f5ee77d1b7f7d3dd38e1d7f973ad7c775d34e34e5ee9fd9be5a7ddf78e9b6dae9ee39d7bdf4df47b7d9d77ad74ddaef575bf34d3c7f4f7b7db7f77f579e77ce7de34e1edfdf74d77e75f1fdba6dbe9a75c7dae1f736edc736db5f386bd7dceb8e9df5bebdd37d1fd9ae3c6fc775e7c77df3de1e7bb6dd77bf5ed3d6b76b4e5d6b6e1bd3be3bd5bd7477cdfbddaf5ceb7e5feb4ef6d7ae79d5de1f71ae35dde6b9e5a7fad3bedf739f5ad3bf1bd9f69ae37d1de5e6fcd9ff1ae1c738e5cf76d74df96b9e9d6bde7bdbdf78d7ce1ae7973cdfc6dae9ddf979d7dde1bebad3ad7ae75df7d9ce74f7a7fbd3bf5f", + "signature": "0xb9554b197daf8c683a5c9e4449f216dcbcca9a75ca54a3a3fbfbe2039a9817534d3db77b6c31ee8077b125a552fd59741776382a471a143436684aa8d442719f2658693262ca7e1e3a8ed45d312bd466e3305b2b65e626d0e3e67a247b58bb71", + "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + }, + "1684342041914": { + "depositDataRoot": "0xc0032d54ec59aa8a6e6949ee4cbe84dfa3e3ce832521892e6a041ca92478dac7", + "publicKey": "0x90149681ae691258e2c85f2dc1297999091e7a56c776e4c6db2effb1e0bbca5ec7445bdcb113a190da8d8f3d012973fd", + "operatorIds": [ + 1, + 2, + 3, + 4 + ], + "shares": "0x00c0843951e698e1b7fb05c60674b3439db4fd1f88c0f06410045d0fb2b88b6c628ce7369da5217164bf0b83e8106f6e890684aab5af928eb215f486ee515a5fafd2fa20aac67785f90d28448f0a16d23584e7896f1d441c66a5812b461097555064a11339d69028fe105d82074ab602d15a0435fb39cd6a3c1e36c5a868ba58286c8f451389e33d99f1f3b2b077aa9daa93917df4acaaf3313203922e796ce34567eca2cc5559b0f14d8f98e24cbbce5bbb97e21031e2707d89c46ba45fa1f02b2de37d5bd1eef76f477ad7b6b6d5bdb5e35eb56f773c6f571fd5bdf7ef5dbce5a6b6db67f4d757f4f78e3cd75d7775f7f6ebbd35d356f971ff1cd1b79ee5ad356b4f396fc7376bcd1b7dde7971af7a79befce5af76ddef5e79cf1ad39d37df7e747b67f86db69c7fa777f1d777ddad1cebbe7d79bf1fe38d7d6bbeb6d39ede6da7bc73addae7df1adf8df6d7977a6ddf7b6db73971a7797f86f97dc73ce3b6f5f5bf7af5ae5b73bf5e77573771fe746bc735d78df46f97f47baf1a6fdf38d3cf37d74d9cdf675ee3ddf4efceb4f5ed5af5fe79f5cd74e5ad1ad1de796db79bdb469d77af5dddef3de5ae7973ad5eef8e5befb6f873469e7fbf1f738eb4e3b7fa6b4e5a6bce3a775d7befae1d69f7fa6b8f74e5e6bd779778e9d7baddcdb8f74778e37d1cf1b77ae9bf3b779f1ed36d1bdb5e1a774ebbd3aef4f7c7b7f7b7dcf5f73a7fbdf769d7f6e5b738f5de1cd77e5bd1cf1cefdebc6f77f771c71edf9dfcd5f79c69ce1f73b71f79f775e35e5b6b6d9e6b9e36e3d6b8d1e71ce3a7f7d34df9f76e9b6f8e3cede6f47ddd3df1febb6b67dbddaf7aef9e39777e75d9eedfdbaef7edee3cddfef56b769ef746bd6bc6bddded7af5f75bdbc6b97b573a79fdb8df671be9cedaeb76b573a739f3ad7bddbeb9db773cef4f7ad78f7469bddad5c7fbd3de3a71f73473779e6f56b5e39f1cd9debaf3af3d6f4edbe5f73de77e7b7b8dbde1a73bf36d7cd3ddb9ef86b6f5cd9de3cf7df77d5ae1ed76774f38e39f75d1d77af37f7879dd1eeb67f8d1bd7a7f4efbe7971deba69cddd7bdf7d71ee5edbc7f76bbf7bdfdf3675dd75d74dbcefdef7ddadf8d9e6ddd5f6b56fce9beb76daeb9eb4e9dd3c6bbf78f7cdf9f7b739e3a7ba75cd9dedb69bf5ae3cd5aedaf7bddbf3b776efb75f6f6e9a79edbbedfedcf7cdbaf7bd3471adbb73af1ee7869e79ed377f673bf5d77a7fbe39e367357bcf3d75ae387bae39edfebc71cdfbf1fd1a6f6efae7775c7dd69d77cdbb7f46b9ede7b4d7c6b871adfd79ed1df3a7b5d39db76bde3873ae796db7787f87da7ddeb8d35e5a7b8e1ee7c6b4d37ddee5d6bb7bd73dd39d5fefb7daf39df9ddee357b7778d3871cdb8e1edf5d9d79befcefdd7771e7dff5d77ad7de787357de7db73b7b57f5e1f69c6dd77871be1e7f5f74e78d35e38f1bebcefa6f6739f1ae1d7fc6baef9f1a71dd9d69a69dd1fd35d1b7b7efdd9fddee5df1fe3cf1f71f7766b773b6f8ddb71fdb4d3af37f7adfcf357f6f1fdb9e1ff1af1def469c7bd7b9f77eb8edadbcefc6ddd1d7bd7356f57baebbdb8f777f9f1af1ddf9d1fe9de7cddce7befb77571b79b6da6f8efbd9cd1d77ae3479f7fb738dfcedff1ed39d797b7ebd6df75ef74736dbaf34f7ddddf78ddde7ce757fde3ae1e6dd75be75d76e9eef9dbd73de7b6f46b4d7b6bbedbd7cf1df1d71e75b73b6b77de71ff3cd9d7f96b4774d5d6ded39739e76ddbf5be7cd1fe3479ad9e7b66f57b479bd37f79ef875bdfd73de7adb5dbde1cf1ddf8e9ff5de1de35e7bdb6e3575ae3cf3c69f79adf473aeda71fd7adb46f86dfd37d9ce1bf7679dd36d7be7de7bd7cf5adf8d776deef9ebdd3bf39d3bf35e3471eedff1c6daddd69ee5aeb4d34d1bd3de3d69fdf7d3ae1cd5ce1ddf47f7e3d6bd79f6f7efddba737e3aefb6dbf5e73d69bdb86f9f3dd9e75fe9edb87bc7777dcdf7d397fb7bbebb6b9f74737776d1be7dd3de3575b69a734e5fdf57bc7f47fdddee7871a6b56b7eb671fe3471ce75f79eb5f7c7f5ebde9be1ed5ee3ce9e6df739d1ce3ce3cd9de75d1e73473ceb5739df8e3bf77e3d6bd77569eeb5ef7e3c7776b8f3de7b79a6b7f79e1bf1f7fdf5df5addcdb679fe3dddc6f7ebc7f8f766f9e1f6fde9be39d9aeb7f3de75e35eba71eeb9d9a71ce78dfd7f4dddf36dbdd9edb57b7e79e75e5b7f5ddaf1c77ad34e5e79cf7b7f6e5cf1ddb9d5ed9cf1ae3475ef3b7357776fdd3c777e347776fddb66dbe3cd7df7a6f6e1c75e79fe3679cddef5fe76db56f873b6f5f346f869ce35e74d79e77e9dd1ae7b6f9e39d7de3469a73af5e7fdedc75ddb7d5d7faddff5fd9edfadbb738d7df5a7ded5ee3dd77e78eb8d1e775e9bd5b7bdf1df5d79d69fd79d37eba75addbd747f779e79aefb73c75e7f9d1ae1c6dedf471ed9f", + "signature": "0x93b11dfa5b6b937628bb1267fcd1fbabc41d83bc05b3f48ed81054b4c1f57372121e97fe446116261496e06c646f7af00797baab6043e746657087cc1dfb61afddbe4c1d0ec40ce327ed5faa8dcc77473b8164ecb010200193c287039917ba1f", + "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + }, + "1684342066922": { + "depositDataRoot": "0x00beb995ba93e591ed0ea8eef0f52c5daa136637cab1d3f282345ce4b92840ab", + "publicKey": "0xb61368db9bc88854d3da83b1b258c7499b1f281ec2b055688ae7163e4145929cece1ea68ac7c0b59fdfe6c4ded01fd1c", + "operatorIds": [ + 1, + 2, + 3, + 4 + ], + "shares": "0x00c0a99790cbf1754998a599240c68d44ba8243da674186ec98766ffebce7f99a4971e652ca281f0a7bbe554a79bc8044b44a89799c1aac254b095e9bf6b4f5d6ba67c406f77fda6b9365cbbda4b41d33245e9a37379a5444788309f16f01a77e84f8a626842f4f3c90d22b984f5fbacfaf88c8a07f8085be4b8cc35ab2cf8b42f9890833f4902a305ff7912a77f117de5168292b588663e7a503869d029dba933e317fd3dc472ffff55b71d52149e2821108e1f88fee9f9583de2fb0babee91247471af1d73cf7473aefb7f46f56b8d37776e9ef34d38f3969d73df1f7f7f5de7bd1ae9ef76ededb775a75cdda7fc75d7b5e7b7fa79fe5dd1eefcebbd39f5ae9ed5febddf8f5fdbcf1f6bae35db6e7871a7b9ddd7b673b71b75ad796fbddfef8f1eeb477c77cd9ff5bf5bd3977af5d6dad37d1c69ae9bf3cefb6f6d1de7af78d74e1cebc6de7da6b777aef77dbd7defad346db6f4dba79ad1c73cf37d757386dfdfbdb5e78739dbd778eb6d5a7dcf74db975a738db6d9ad1ceddf3d77bf1de1c7b7d9de39d7de7ad3875bef5efcf39ddd71beb4dfb7b5dbc73b7dd69af35f5fdf46fae7579e739edfedde1de3ce1f71bd7d7bc7386b9ebde35d3aef76dee9f79c75f6df69edbdedd7bb71ed5df1f774f36d5fe9ad39ef6e7cf1a6f4e1b79ed5ee9a71fe1a7bbd9a6dd73bd1d6b97b671cedc6fb7fb6dcd7dede6f76f9eb777575f73675ee7775eef57f579be3be37779f5ae9dd7dd5d79adb8e35f7be77ebdd7cd5bf1ee9dd9d7ba69b77675c777f76e757dc6f9f5b6de69bddbd7d75ae7679ae1bdf4e397b5d5bd746bc7fde3a7bbe9fe5e7bae74735d3b737d5e79e69ff1fe7d77c7b577a6b7e1ed34dfc7b4738f78f377b5e1fe3ad9b75ae1af1b6df7367746db73defa775d37e787fd7366f6e3cd1d73cddd7f8ef6d5eedf71ddb8eb4e1a739eb9f5de9feded76e1ae9ddb4d79e1de77779d3ad3d739e1ff5f7dbe3ae5f69de7469e75a77c7b4d9e6f86fdd5b7f4e1ef38f7cdf8e9be5eedc774eba75d69ddbcd5fe36f1c6fd6f479c79f7b9df4f5be7577c6f4f3ceb8f786b56fae9f7fa75be3aede7b57bcf1ed75e1ed1ce1fd5d73cf3869fe35db9d5edb56f5e7a739f397dddf8d38d787f57b673cdddddee7af1feb469edbcd1e6b6d9b73def673def4e3d739e5ef3bedddfbf1ff5e77779d735e7c73a7f97786fd6da79f79be1be3cd3477adf875fdfcd78e78ebcdb6df7e3c71ed3b6ddf35737f38e767bcef47b9e786dee5e7db7f771ce9d7f8ddbdb7ef4e5ce5ff3d7fb7b4d1fd5af34db5f79e5ed3ae9defcd1bedee7bd5fdbc778efcf3675d6bb7bbe37d7773569e7b969a6b8e5a6b47f5d367bbeb6d9fd37ddbf3ad78ebcefd7b975ee7873df5d778db5e5be35d5cd3def977defad1adfcef7f3673ad3ad5af347f8e35df871a6b6f757f875de3adb969fe7571fd3569ce5d7da79c6bde3cd36edfe3469aeb4f7bef5f34e3ce1be9a69bd387dde36df5e746dde38f5f7b6ddee9fef46b6d7cebdddcdbbf7bf7dedd75be766b4e3cf5f7b6d5bd5b7366b6e9ee5ff7b6bbd747b77dff356f86bddb5f7cd1a7dcebcd3679c6f66f7e7dd1a7dcef679adbce9ee7c6dfd3de9fdb7d39f5fedbe5ce3577cd9b7f8d5cd786dee1e7deebcddedb8e3be5c69af3b77979cd7bd1f73a6bc69e75af796fc77bdfce74eda7b6779d9c6f5d7ce9be9ad5df5d71e6bbd1d7b8d1ed9ce5c69fd5c71df7ceda71fd34e36f5deb67fbd1aeb9776edf6bad1a7f9ef973871f7b6d3df1df5f7b4f3cdf579b6dcf7a75ee5e73b7b4738f5e6f56fbef7ddf6f8e9a7bc6fae1e6dfedc79af1df3bdb5e9fd9de3de5aefb6dfe1cd7a79cededbde7779ef7869f69ff3a7b769fef67fddb5df5e1a6dfef7734e39736e5fe1fd77d3dd1dd3ddda75a735dbad77e366b5db8e9ce7aede73673c69df7b79eeb56baddeeb7f5f77be9be5e6def3ad5be3cd5ad796ba7bae38dfbd78dda75eebaf3ad3b6f8738dbcdfbf1ceb8e37d1c75ed5d79ef77e9b6f57f4f1adfcf5a7de7fb777ef977ce1ed9f69def76df73a77a6bd75b6b7f3577cefb6f7d37d5f6f4e7bd1dd9edf971edded3575f69d79ee1c6f6f7ae5d774e5ad1ef1bedc776ddb6f5f3d73473875beb673479adf9776e9f6bad3bf5bddcedae7ae9ed3ce3a7df79b7387b76f9d5c7bdf5d6fcf1c69ddb7d5a778ddbdf9777737d9bdf9734f7c7bc7b5d7d6daeb8e1cd5d73ad9bedcf75df871d737f78e34db8e5eef4ebc6f7db87dee5d69e69dedaf77df4efb735f3cd3579b7b7e74dfd6fa7bdef57fdeba71c6fbe7c6fbf396b8ddcdf5d36d7de387dc79df3971d79ef75d75dde77de9e6bdd7cd7b77dd787f9e5cf7d69b734db473cd77e9ad5ef1ce1ed38dfcf3b69f6f6ddb6dbd35efb7de6f77bdd7579bef7f5bf5be5eefc6b6e9b73b6b579ee9c", + "signature": "0x90071d264bd8dbaa16c6ccb279f52fe86e147795dff69fd35b57fc90bde56314d0e93d07243b58f2f8f5ff247caeb1bf035566f7f043c1031bcb80e3673b601ffa296aef4d41c47a80539215a5734ba04af191fff8c73ded9e203480ff28c1fe", + "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + }, + "1684342178284": { + "depositDataRoot": "0x180bf16e4787674dd32ea16bc3f0cf6b99f6eb4831ca8406f48ea7c26ac8f3d2", + "publicKey": "0xa558b01422e724b25ff477140a1dfff7a5d11a59c6da571ecfe739b7ddc47b611fc5b7ef15c2f40dc7a765befd4f665f", + "operatorIds": [ + 1, + 2, + 3, + 4 + ], + "shares": "0x00c099216eb98dbde1f67900ce492c492d56fc19b2f41de75c963f3031070931ba4be63c529e6913c2db086a93b70d942154ad73d3d8b99746e8355604f1041ed28b943ee7cc7925d99bfa9776a9f27078af0bca16cc9da41c91e61f393276123441a0d34e5bbe1d0f2c09ebebf23c4f27e0b7d1630899b62a33ca8c3efaa3fd697a7a1fc9d717ee45de076b7e09ba8bd1f490ba3e5580999633b86c6d1d99dffe5966f24848b7b350528a9b68ed1f05dcd88ec429cef179a7f09c414aab84ae474e6fc71d6dae1eebad5c6f571e6fcd9e7b5efa69deb7df4d3a6fa6f6f1f6f76dbefd738d3a737d1a6b7f5e7dfdb479e7f4779d1ed77e9d7db6b4d356b57f46bad7dd5f7da71d738d1b6faf3adb771d77defbdf5f3d79cd78e1c7fcdfdf1de9a6f76bdddc69ae387b56f66f5df877ae1febdf75f75e367f6d5bdb47fc7b8d7beb66baeb47fde39eb8e9de5b6f4d1cf786b7ddae5af776bb6b7f3877de387f87dcd3cdbddb8df9efb7f4e75d9af1e7f4f1de9bebc6f57b4ddaedce1f6f9df5d5cdf9d777b8df5e1ee35efa73be5b79dd3b6fb69ddbdd3ddf9dfadbde386dd75cd3c69be3879be9a79cf3dddce9dd3ceb7eb8e9f7bd6b5d746da73d7b46f4e39f35e1af7dd9ff7cd1bebbe75ef679eef4ebad5b6fddf97f5db87fd6f4df96dad5ce1ed37ef5dfae38d1cf1be7575ae1fdfcd9eeb47767f8e7af7df5a6b7e77f7a75d6b97fb739738e3de74e7be7a6fa73cd1e779d7df1eef9e1c6b4f7ae1bdbde3d71ae9df5bf3deb7f39eb8f7a75cd7a7f5d5ae38e3de3d73c6b9efdf1ce5e69b7b7d1adba734db86bc7de777e9bf346b8e1af35e3ce9e6b6d74d75e79e3cf5ae1d73df37e366b9df9dbde3bf5d6f8f1d7db7f76f86bd7bce1defcd79db5e7971adfd69ce77ef4e77dfbdb5df6efa7367bcef76b8f74ddb7b76ded77ef7ef47776bc7f47ba736efdf36d9b6fbd776f579cd5b6fc6bbdf8f75e347f5f1bf34d76df5f38ddce78f3d6fadbb7787b8e38f5bddfd36f5b736e9ef77ef4e5c6b47f7edddfcf5c7f77b56f6dbcddfdba7dd75e6fbd5df3ce797ddd787dcddedb4d1bd3df5ed76776d1ee5fd386b87b6edef7ae75d5f6fb6da69ee776b7df7d3c7f96b7e7be9bd7aefcf34d377dc7db6b9f5ee79d7c6fce79d376dbe9addff1a7fcd9a75cdbde3af79d37e1e7b8d5fe1ce1fd7b7b5eda777d9be9b7f9ef5ef7dfcf5fe3c7baeb6f5bdf87b9f74d1ceddf36e79777e37e9df3ae1be76775f747dee7bd1de3573d75cd7be9ed5def67bbeb6f5ee9d6b6d7a7b679bdfb7b971ddf66b8efcefc6f8f34e9b6deefbf5b736ebb71d7fb7b4eb87367747deddd7fbf1a6ddd5e6df79fdf6edddde7ddf3cd357f5f797dc6dbedad3871d6b7e9aefde7dd766b5d757b76fae5fedfe1ef5edf869de1af78e1ee1cd79d5c6faef8e3cd7bf7c79ad9c69fe7775e77bd7677773bd35d346b4e5fdf7f7be76ebad9ef77f75f1ed9cddd7356f9d9fe3ce3cefc6f6dbbf7969ad5a7bde7bdf7d1ce9f7fd69febcf7dd79d9ae78e1d7dce39f79f7b79be3cdfbdf9d35d35ef871ed1a7dcf1be377db6dad79e37f3df376bae5cf5a6b86badbae3c75d7b5f3471f6f8efd77bf1af5df1d7777dbd7d7fb7fad1deddd34d347bcdb7e3ddfcdbde9a6b47f56fc6b769ef5e7fc71ee1fef4df5db7f5af3ceddf5a77d6dbeb6f35f3b6b7e357fa6bcefaedbdf9d9eddbddbd7a6de79fefaf5de74d5ed1f735d5c7bdf3b777e9d7b5f3ae5bd7c7b86bdf3a7777756dbefdd9d6ddd9e6dbd3af5cef4dfbd357f5eb67b8f35f79737dbdd3869de79e5c735d7af5fd7bedfdb7ebcddf73cf1cdf5f5df7b6b9f1fd9ef5cf77e1af7c6fd75ee9b71cf7dedf7f5d5b7347b7dbce3cedc7f4e1bdfaf5de37e36e9fd7bd1d7b77f46baebb79ee5bdb9d9dd797dedb7eda79be37dbddb479e7b971bef4f3de3c7bdf377377f97747f471d7fb7b67fd776ddb79beb769df39e9ed5cebadf771be7679cdf5ebdef7d77e3bd5fd757ba6f8d1adde7dd69c69d6bc69c7b9f7b77479ad1bf7c7b4edfdf971a776ef5e5e7f4d1d6bde776f46fcdf971e77571e71cdb87f86dcddc77c79bddbefcf387bbd9dd3aef8efc77af5d7fce7ce7df767fc7f7f1ce3d75b79df5de39e7d6f7d7be3bdfa6b8e9b79b7fd75d6b9f7beb87b9775f1ad9eeb7e1bdb66f8d7575e75ad1ae397db6b9d38ddcf1aefcd1febadfde7ddbd69df79e5dd5ceb6f766f46fbd7a71b6dee74e75f356b677d7f4e5fd37ddb7f7d39edf7b87dd7dcd76e37e75778f5e71addfef4e9aeb8e1cd7a7f7f5debaef6d5edfce1a69ce5f7b6f75e38e7769c75d79ef1adfde756db7df79d69a7dee3ad9d7fdebae35f37e1af386bad7d7f66bbd7ce5deb96ddd9d7f5d5ef5cd1d6f9d5be9ee3969ad776f4f7bd3673b6baf74d5def76bc778e7b77dd9cd9cf1b", + "signature": "0xa58903ac1ee94405f800a22538d3043b91c398f5aca01fa7e4f43510da9371d0fbba371e7cdd43b20648087733e3f9b90e6dcd42b716b580176920f3a433c9a9e2fcec63ab94622f639d556383c21c600d822c641498b765186530b901776d91", + "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + }, + "1684342203258": { + "depositDataRoot": "0x1ab76776a6fdfe0e44af5cac6e51bb4b59ed4b8cc80407aec7d9c2424e8c7daa", + "publicKey": "0xa5c0886cc57bc1514f9565f93f7c880efefd519b0f15eb6e33b8a7de862c460e59435f327ae30817fe79e1d5fca3931e", + "operatorIds": [ + 1, + 2, + 3, + 4 + ], + "shares": "0x00c0a3008afd7ea04548c203e558a8166346f3473a909145b75c83604230ff726dca38b2b8cc7aa603867eb04cf5eb7e0173929dffe0ed59d88b0594c9c26c5383b032e33d1edd1ad1f1ce288c4df2d351378fa2a97384c705c56f1127d6b0a9ce83b778b4bc4a8e82ad61196679bfcad51d83a5b1eed3454ada98a652634c82da8277202fe898daf632a628317c0614bcab81ed8906d57b1979bbbe0e13e04c9b5730579bddfbc2a902a8214e6733f4f98ed5523d4962eae55612827f5eb128c9a1db5e76dba774d77d7af38f5a75ddf4d74d786f9d1bf7b69a7f6f7cd3777bf5deb971df5dd9defc7faf1cef9e386fd75edf5779f1ed5eef7774d787756f7f7d71cd37f35f35e1bdbcebb6def5ad9b6dae7bddc6f5e5aefaef9eb579d774d3575bdb779ae9a77775df5ddfbedbd76f7675de34d9cef67bbd9fe797b6f7877beded7ae38df9e5d79bdbadfb6b5df47fc69ad776bcdb47f8dbdebad1b735f77734d7679bd78d3b69bf1a7bad7cf7bd5a6f5d3a75e77dedfdfcebbe9dd1cd7dd35f76d3ce5e7f879adb8d1dd37e9ae7bf77f5eebbe9edf5f1d6b56b579c7b5777d1be37ef6d1f7bd73def4db56b66f6df7d39f1fefbd5d739db5f7d7b475ae3469eebae7df5bd9eddbd76e5f7f76f975d71f73d6f97b7d77f1ed7ae1ed3a6b67f6f7af34d9eef5f7cdb9d5a73875f7f4ddce78d5cf5ddf7df8f74e1ce7ce36d76f35df8e5eef7dded1f6f5d5ceb6e76e3dd367f4e39e35dfaf1ad77f5cf37e9cd3d776735d9c738d9d73679ff756f5ef9dbbe7bf7ae5d7b87b9f3ce787da77b6fc6b7ef96f669f7f5eb5d1b6dc77c7f4d1a738e1de1ae76d3cd9e7b4d7bf5a7bb75d71ee37e7975b71cf5b6b7d38ebdd34d1ddfcd3bd9ed7dd39e9c6f5d796f46ddf36d3d7f8edbe1de1e73575ed76d9dd7979bd77efc6dcf1c7b7df86f47de739e7c75cf347de7f4e9ce7be1e73879a6ddddb7bbdda79fe3cedbede7f56f6ddcd5ddf8eb5e5addddbd73bf7671f69ae356fcf1eeb6e1fdb675ae5fdb56f4738ddedba75b6fcef4d1e7ddd1b6f469af367bb77875ed1c73ad1ef74735e1b7fbe5defbd5b79b7bddf6d396bad37dbbd5be1ad75e9fd36f5f77bf5ce5c6db6fad7a6b5e7571bf38f78eb8f38efbe75e1ce3af3475e774eba75c7bdf1aefad7bd5e7b5eb9dfbedddbddfd6bbe3bef569a774f7a6b6ddee3a6dcd3a775ef96da7f9f367f5dbbf1a6dad9fe5e69c75fd1df3b6ddf75e5e7b5737e1ee3475df1ddf77b4d5b71af5de5bd1ad7dd9edf6e1c73be7bd5aef9f357f4734e7dd1c69de9e774f1fedbd9fd39e7de75f1edf8eb8dfc7f86fbd9bedc77573b6f7d9ceb7e7de9d73ad1af35f5a778e7bebdf7bdf9e1f7346dd79c777d1fe39dbaf1f75cf7c6bad3cd1ee9befc6dbf1fd7def9e7a7bdd747b9d5fd35df9d74df977dddff7571de74dfc6baf77d35f3be1de9ff1b7dd7fad346f8e5cf1f7ded3aeb6d1ad9eeb8f1fe9e6f9d5ad5ed9ef3771d6f5db97dee77f3c7b5f3de3873bd5e7dfd386f871f77cd1f6ba6b5f5f7b8d9ce35f38ef4f1dd1f69e738db977b6ded9a7f7d1e6dcd1fe5d7b5d3de377fd739f1d79edfbd5e79bedee7573adb76bde7de5e7776dedf9e78f77e1ed34d39df5d9aedb6f4d7aeb56b4ebbe9dddad35f5cdf4f77d3675e7de7b6ddc6b9ddd77b77775ad35edddf86f5f7a6fce7b73479ce5ef5cf1cf77f1a6b8e35efaf1e7f56bae36e3b71ce1debbe5b7b8f5d7dde9ee9af1fef8d77f1df7aeddddfeb47396fc6f8d7ce5fd36f3cf35e36e9ef3a6fde7c71adbad34d1de35776e7adb8d7def66b7f3b6dee9f6de6bad5fd9b69adfcf74eb8d5ee5bdf5df579e739e7be5c69e73be1f7b9774f3a734eb5ddf7bd778f37eda735f357bdebde75eb671d79ff5ff5edb5f3dd7ad5cd79e396f8f1cedcededf6f1cf5c75f7bcd3de35d9f736ef7db7e7c7dde76e79e7d79a7b7f77dfbef97bbf3a7f6df4e356bae757b8e747767b87bde1ddf7f7a6f4f3d77ae5bf38d5f7b47b5e1f7f7e9f6f6d9cdb66f86f86fbdbb77ce3bd1fe37e3ddb9d9de78d36f397f7efc6fdf5ef1df7c79f79de9cd5cd76dbb6b873c7b6ebd735d3ae5b7b7f787dfddcf75ef96f7d5bddef3bf77db76b8e1d6dd73cf1f774e7a6f7f1ce1debb7dff5bdbbdfb73cf1b79c6fd6de71c7b96baefdddfefbdbdf76df4d3971b7f9eb5e3de7dd776df738e1ae34d78efddb56fbf5c7bbf7ad9ad9fd76dde6dc6fcedff7971a776d34d7ad39d7be377def7def4f1cf7af3c6b969deb8db4f1f7b7ef5e34edad5fd3a774e79e35d1b7b775ddbdedc7f76bde7bdb8f5aef47db734f7671ff36e3875f69fdb67b96bdd1cdf6d3bdb4e7ce9fe9b6dddb4ef8ddff37eb5e5ae5df7bd1ae5ed39e7c6f66dbe9bdfad78ef5e5ef377fbe5fd366df6b4e5ee5edbcf1df7d6bcd5cd5df5a6b5", + "signature": "0x9424a19ca8e1a7283f924470cd25aa7ae4a543218742ce08b155c77d24aa825f138c39af87a625d109e794ea4b66a91016c54a122f015508dc100a1662b8af88c5e40a4bac9be8da37723ed2d9c5b00329cda02e8e69895beb4536446ab072c8", + "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + } } \ No newline at end of file diff --git a/common/helpers/src/index.ts b/common/helpers/src/index.ts index bbe260176..652daea14 100644 --- a/common/helpers/src/index.ts +++ b/common/helpers/src/index.ts @@ -217,11 +217,8 @@ export async function getFutureContractAddress({ wallet, nonce, index }: { nonce: number, index?: number }): Promise { - - console.log(`Wallet Address: ${wallet.address}`) - console.log(`Current Nonce: ${nonce}`) - - const futureAddress = ethers.utils.getContractAddress({ from: wallet.address, nonce: nonce + (index || 0) }) - console.log(`Predicted Contract Address: ${futureAddress}`) - return futureAddress + return ethers.utils.getContractAddress({ + from: wallet.address, + nonce: nonce + (index || 0) + }) } \ No newline at end of file diff --git a/common/types/src/interfaces/Validator.ts b/common/types/src/interfaces/Validator.ts index 2e8dcebf0..6859c4df3 100644 --- a/common/types/src/interfaces/Validator.ts +++ b/common/types/src/interfaces/Validator.ts @@ -2,8 +2,7 @@ export interface Validator { depositDataRoot: string publicKey: string operatorIds: number[] - sharesEncrypted: string[] - sharesPublicKeys: string[] + shares: string signature: string withdrawalCredentials: string } \ No newline at end of file diff --git a/contracts/ethereum/helpers/dkg.ts b/contracts/ethereum/helpers/dkg.ts index ec707b851..76a8d49ce 100644 --- a/contracts/ethereum/helpers/dkg.ts +++ b/contracts/ethereum/helpers/dkg.ts @@ -12,8 +12,7 @@ export async function initiatePoolDeposit({ manager, signer, index }: { manager: depositDataRoot, publicKey, operatorIds, - sharesEncrypted, - sharesPublicKeys, + shares, signature, withdrawalCredentials } = mockValidators[index] @@ -21,8 +20,7 @@ export async function initiatePoolDeposit({ manager, signer, index }: { manager: depositDataRoot, publicKey, operatorIds, - sharesEncrypted, - sharesPublicKeys, + shares, signature, withdrawalCredentials, ethers.utils.parseEther(mockFee.toString()) // Mock fee amount estimate ~ 10 SSV diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index 7fd5bf73a..16ff60f93 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -389,8 +389,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param depositDataRoot The deposit data root * @param publicKey The validator public key * @param operatorIds The operator IDs - * @param sharesEncrypted The encrypted shares - * @param sharesPublicKeys The public keys of the shares + * @param shares The operator shares * @param signature The signature * @param withdrawalCredentials The withdrawal credentials * @param feeAmount The fee amount @@ -399,8 +398,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { bytes32 depositDataRoot, bytes calldata publicKey, uint32[] memory operatorIds, - bytes[] memory sharesEncrypted, - bytes[] memory sharesPublicKeys, + bytes memory shares, bytes calldata signature, bytes calldata withdrawalCredentials, uint256 feeAmount @@ -424,8 +422,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { pool.depositDataRoot = depositDataRoot; pool.publicKey = publicKey; pool.operatorIds = operatorIds; - pool.sharesEncrypted = sharesEncrypted; - pool.sharesPublicKeys = sharesPublicKeys; + pool.shares = shares; pool.signature = signature; pool.withdrawalCredentials = withdrawalCredentials; readyPoolIds.remove(0); @@ -549,14 +546,12 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Reshare a given pool's validator * @param poolId The pool ID * @param operatorIds The operator IDs - * @param sharesEncrypted The encrypted shares - * @param sharesPublicKeys The public keys of the shares + * @param shares The operator shares */ function resharePool( uint32 poolId, uint32[] memory operatorIds, - bytes[] memory sharesEncrypted, - bytes[] memory sharesPublicKeys + bytes memory shares ) external { require( msg.sender == dkgOracleAddress, @@ -570,8 +565,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ); pool.operatorIds = operatorIds; - pool.sharesEncrypted = sharesEncrypted; - pool.sharesPublicKeys = sharesPublicKeys; + pool.shares = shares; pool.reshareCount++; emit PoolReshared(poolId); diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index e98c5bb74..f96b2dec0 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -20,8 +20,7 @@ interface ICasimirManager { bytes32 depositDataRoot; bytes publicKey; uint32[] operatorIds; - bytes[] sharesEncrypted; - bytes[] sharesPublicKeys; + bytes shares; bytes signature; bytes withdrawalCredentials; } @@ -78,8 +77,7 @@ interface ICasimirManager { bytes32 depositDataRoot, bytes calldata publicKey, uint32[] memory operatorIds, - bytes[] memory sharesEncrypted, - bytes[] memory sharesPublicKeys, + bytes memory shares, bytes calldata signature, bytes calldata withdrawalCredentials, uint256 feeAmount diff --git a/services/dkg/.gitignore b/services/dkg/.gitignore new file mode 100644 index 000000000..614c1c82a --- /dev/null +++ b/services/dkg/.gitignore @@ -0,0 +1 @@ +.out \ No newline at end of file diff --git a/services/dkg/scripts/clean.ts b/services/dkg/scripts/clean.ts index 0528b6de3..8e4ebbcda 100644 --- a/services/dkg/scripts/clean.ts +++ b/services/dkg/scripts/clean.ts @@ -3,9 +3,12 @@ import { run } from '@casimir/helpers' /** Resource path from package caller */ const resourcePath = 'scripts/resources/rockx-dkg-cli' +/** Compose stack name */ +const stackName = 'rockx-dkg-cli' + /** * Clean up resources */ void async function () { - await run(`docker compose -f ${resourcePath}/docker-compose.yaml down`) + await run(`docker compose -p ${stackName} -f ${resourcePath}/docker-compose.yaml down`) }() \ No newline at end of file diff --git a/services/dkg/scripts/dev.ts b/services/dkg/scripts/dev.ts index 1c6e94808..8e6988063 100644 --- a/services/dkg/scripts/dev.ts +++ b/services/dkg/scripts/dev.ts @@ -5,7 +5,7 @@ const resourcePath = 'scripts/resources/rockx-dkg-cli' void async function () { process.env.CLI_PATH = `./${resourcePath}/build/bin/rockx-dkg-cli` process.env.MESSENGER_SRV_ADDR = 'http://0.0.0.0:3000' - process.env.USE_HARDCODED_OPERATORS ='true' + process.env.USE_HARDCODED_OPERATORS = 'true' /** Build and check if the CLI is available */ await run(`make -C ${resourcePath} build`) diff --git a/services/dkg/src/index.ts b/services/dkg/src/index.ts index baa37fa0c..32c639288 100644 --- a/services/dkg/src/index.ts +++ b/services/dkg/src/index.ts @@ -16,6 +16,8 @@ const eventEmitter = getEventEmitter({ manager, events: Object.keys(commands) }) for await (const event of eventEmitter) { const [ id, details ] = event + console.log(`Received ${details.event} event for pool ${id}`) + const command = commands[details.event as keyof typeof commands] if (!command) throw new Error(`No command found for event ${details.event}`) diff --git a/services/dkg/src/interfaces/Shares.ts b/services/dkg/src/interfaces/Shares.ts deleted file mode 100644 index 60b17564c..000000000 --- a/services/dkg/src/interfaces/Shares.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface Shares { - /** Encrypted operator shares */ - encryptedKeys: string[] - /** Public keys of the operator shares */ - publicKeys: string[] -} \ No newline at end of file diff --git a/services/dkg/src/providers/commands.ts b/services/dkg/src/providers/commands.ts index 86a74ceaa..558c62afb 100644 --- a/services/dkg/src/providers/commands.ts +++ b/services/dkg/src/providers/commands.ts @@ -1,18 +1,24 @@ import { ethers } from 'ethers' import { DKG } from './dkg' import { CommandOptions } from '../interfaces/CommandOptions' +import fs from 'fs' export async function initiatePoolDepositCommand(options: CommandOptions) { const { manager, signer, cliPath, messengerUrl } = options const newOperatorGroup = [1, 2, 3, 4] // Todo get new group here const ssv = new DKG({ cliPath, messengerUrl }) const validator = await ssv.createValidator({ operatorIds: newOperatorGroup, withdrawalAddress: manager.address }) + + // Save validator for mocks + const validators = JSON.parse(fs.readFileSync('./scripts/.out/validators.json', 'utf8')) + validators[Date.now()] = validator + fs.writeFileSync('./scripts/.out/validators.json', JSON.stringify(validators, null, 4)) + const { depositDataRoot, publicKey, operatorIds, - sharesEncrypted, - sharesPublicKeys, + shares, signature, withdrawalCredentials } = validator @@ -20,13 +26,12 @@ export async function initiatePoolDepositCommand(options: CommandOptions) { depositDataRoot, publicKey, operatorIds, - sharesEncrypted, - sharesPublicKeys, + shares, signature, withdrawalCredentials, ethers.utils.parseEther('0.1') // Mock fee amount estimate ~ 10 SSV ) - await initiatePoolDeposit.wait() + return await initiatePoolDeposit.wait() } export async function initiatePoolReshareCommand(options: CommandOptions) { diff --git a/services/dkg/src/providers/dkg.ts b/services/dkg/src/providers/dkg.ts index 2e702017d..88d647d36 100644 --- a/services/dkg/src/providers/dkg.ts +++ b/services/dkg/src/providers/dkg.ts @@ -1,7 +1,6 @@ import fs from 'fs' import { KeyGenerationInput } from '../interfaces/KeyGenerationInput' import { DepositData } from '../interfaces/DepositData' -import { Shares } from '../interfaces/Shares' import { DKGOptions } from '../interfaces/DKGOptions' import { ReshareInput } from '../interfaces/ReshareInput' import { getWithdrawalCredentials, runSync } from '@casimir/helpers' @@ -43,20 +42,17 @@ export class DKG { await new Promise(resolve => setTimeout(resolve, 2000)) /** Get operator key shares */ - const { encryptedKeys, publicKeys } = await this.getShares(ceremonyId) + const shares = await this.getShares(ceremonyId) /** Get validator deposit data */ const { depositDataRoot, publicKey, signature, withdrawalCredentials } = await this.getDepositData(ceremonyId, withdrawalAddress) - console.log('VALIDATOR PK', publicKey) - /** Create validator */ const validator: Validator = { depositDataRoot, publicKey, operatorIds, - sharesEncrypted: encryptedKeys, - sharesPublicKeys: publicKeys, + shares, signature, withdrawalCredentials } @@ -89,7 +85,7 @@ export class DKG { console.log(`Started ceremony with ID ${ceremonyId}`) /** Get operator key shares */ - const { encryptedKeys, publicKeys } = await this.getShares(ceremonyId) + const shares = await this.getShares(ceremonyId) /** Get validator deposit data */ const { depositDataRoot, signature, withdrawalCredentials } = await this.getDepositData(ceremonyId, withdrawalAddress) @@ -99,8 +95,7 @@ export class DKG { depositDataRoot, publicKey, operatorIds, - sharesEncrypted: encryptedKeys, - sharesPublicKeys: publicKeys, + shares, signature, withdrawalCredentials } @@ -205,18 +200,14 @@ export class DKG { * // publicKeys: ["0x000000...", ...] * // } */ - async getShares(ceremonyId: string): Promise { + async getShares(ceremonyId: string): Promise { const requestIdFlag = `--request-id ${ceremonyId}` const command = `${this.cliPath} get-keyshares ${requestIdFlag}` const getShares = runSync(`${command}`).toString().trim() as string const sharesFile = getShares.split(' ').pop() as string const sharesJSON = JSON.parse(fs.readFileSync(`${sharesFile}`, 'utf8')) fs.rmSync(sharesFile) - return { - encryptedKeys: sharesJSON.data.shares.encryptedKeys.map((key: string) => '0x' + key), - publicKeys: sharesJSON.data.shares.publicKeys - } - + return sharesJSON.payload.readable.shares } /** From f95862787e24a9b9b4b302f1f56af01a3c986f6b Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Thu, 18 May 2023 23:27:16 -0400 Subject: [PATCH 32/78] Get cluster in dkg oracle --- common/data/src/mock/validator.store.json | 242 +++++++++++++-- common/types/src/index.ts | 2 + common/types/src/interfaces/Cluster.ts | 7 + common/types/src/interfaces/Validator.ts | 3 + contracts/ethereum/docs/index.md | 139 +++++---- .../ethereum/functions/API-request-source.js | 3 +- contracts/ethereum/hardhat.config.ts | 6 +- contracts/ethereum/helpers/dkg.ts | 2 + contracts/ethereum/package.json | 2 +- contracts/ethereum/scripts/dev.ts | 1 + contracts/ethereum/scripts/ganache.ts | 5 +- contracts/ethereum/src/CasimirManager.sol | 136 ++++----- .../src/interfaces/ICasimirManager.sol | 9 +- .../src/vendor/interfaces/ISSVNetwork.sol | 66 +---- .../src/vendor/interfaces/ISSVNetworkCore.sol | 9 +- .../vendor/interfaces/ISSVNetworkViews.sol | 100 ------- contracts/ethereum/test/fixtures/shared.ts | 8 +- package-lock.json | 112 ++++++- services/dkg/package.json | 4 +- services/dkg/scripts/dev.ts | 3 + services/dkg/src/index.ts | 28 +- services/dkg/src/interfaces/ClusterInput.ts | 13 + services/dkg/src/interfaces/CommandOptions.ts | 15 - .../src/interfaces/CreateValidatorInput.ts | 13 + .../src/interfaces/CreateValidatorOptions.ts | 6 - services/dkg/src/interfaces/DepositData.ts | 8 +- .../dkg/src/interfaces/DepositDataInput.ts | 6 + services/dkg/src/interfaces/HandlerInput.ts | 19 ++ .../dkg/src/interfaces/KeyGenerationInput.ts | 6 - services/dkg/src/interfaces/KeygenInput.ts | 6 + services/dkg/src/interfaces/ReshareInput.ts | 6 +- .../src/interfaces/ReshareValidatorInput.ts | 17 ++ .../src/interfaces/ReshareValidatorOptions.ts | 10 - services/dkg/src/providers/commands.ts | 70 ----- services/dkg/src/providers/config.ts | 24 +- services/dkg/src/providers/dkg.ts | 280 ++++++++++-------- services/dkg/src/providers/events.ts | 15 +- services/dkg/src/providers/handlers.ts | 85 ++++++ services/dkg/src/providers/signer.ts | 49 --- 39 files changed, 858 insertions(+), 677 deletions(-) create mode 100644 common/types/src/interfaces/Cluster.ts delete mode 100644 contracts/ethereum/src/vendor/interfaces/ISSVNetworkViews.sol create mode 100644 services/dkg/src/interfaces/ClusterInput.ts delete mode 100644 services/dkg/src/interfaces/CommandOptions.ts create mode 100644 services/dkg/src/interfaces/CreateValidatorInput.ts delete mode 100644 services/dkg/src/interfaces/CreateValidatorOptions.ts create mode 100644 services/dkg/src/interfaces/DepositDataInput.ts create mode 100644 services/dkg/src/interfaces/HandlerInput.ts delete mode 100644 services/dkg/src/interfaces/KeyGenerationInput.ts create mode 100644 services/dkg/src/interfaces/KeygenInput.ts create mode 100644 services/dkg/src/interfaces/ReshareValidatorInput.ts delete mode 100644 services/dkg/src/interfaces/ReshareValidatorOptions.ts delete mode 100644 services/dkg/src/providers/commands.ts create mode 100644 services/dkg/src/providers/handlers.ts delete mode 100644 services/dkg/src/providers/signer.ts diff --git a/common/data/src/mock/validator.store.json b/common/data/src/mock/validator.store.json index e2b2b0e70..57de97bad 100644 --- a/common/data/src/mock/validator.store.json +++ b/common/data/src/mock/validator.store.json @@ -1,80 +1,262 @@ { - "1684341938413": { - "depositDataRoot": "0xc0941d38fdc62ee7c0fefe84c1b33ff90ecfc35ac8cbdbc3a4596acec366298e", - "publicKey": "0x87f31d8d16935736886235bb93c0dfd24e24588af5e79c2f3a7d44ef969957e49e635abd1ba9b03e9c496f01cb885c75", + "1684356213848": { + "depositDataRoot": "0x0211d3ed43d9a5566930d4936c51ce62b023b840e5bb1636d0743be3dc568292", + "publicKey": "0x9526a90f15cab7042c23563ea581c28baecb64c1c92a6818e0fc4b1ba19126fdec247dbf72f788c16443bfa495435dab", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c08e0a6022cbda2ef8f7b651a1dc1875ef5e00e9b3c01794163c99ea57ad79721941e50b30d88ce9ad8ac514a8f34c9a8183eec563c9f952bce19c46a8bc5a5bf5972288e5f7830ab269e8b1c17378a15c7974f792ee8d8e4a9640b2c7cc42f185985e35defbfd310255f2d5a6163517c577d242e9fb787338899c69e89afe18927efd32f167ceb37960c52879b25a30f2b9367fcca6af137885626fef2b9f64b643b0166208d792cfa5a6b207e3469248dfe32d42e199ce7407bb0fc665124863e75d346fdefc73bdb675dd9ef1f6fd6bbefae3bedfd1fedf7bae5d73cd9f71ce1de39e5a7bb739d9debdd9cd3b77b73ce377b775ee9b6fad3bedae5fd5cd5a7b5dfdd9aedcddc6fcd78eb6ede7df6fad7b6de69f71b75d7f4ebde377fce36d5aeb6e7cf3b6bbdfae1fdf46daf39edcf5de1b6f4d3ce1af1d6dbf34d5e77b79f69bd37d75d3ad5b7fddb5f7bedb7daf3675d7b6e1cd1e77bf5ce5fe1cf5ddfb75cdbde3be5e75e77de7deb6e39737d9a7fb6b4d1b7b6f1fe3ceb47b9ddddda7b7ef9ddb735e7bddcd7a69ae5be9cdf7f78f7dd9ce5eeb4eb9df96f67dae34d1bd9fe3979fdf471af39e7cddc7f9d39d5dddc7bdf34ef67386bcd7adf5e9d7dbe9fefc7f8df7f3be1aefbf3769eef4dfb77cd777f6f39775d7be7adf97b67b9f38e76e35f38e38e1d6faedad357f97367b671fe3df1dd75ef7eb6d75df6d7c77a778e77f79e1d7f4d9f7dd71f7fad3673c6f7f5b6fc73cd37e1cdbb7dcd5fd1ddf97fce36d3b7da7bd7b8d7cdb86dfdfd79d71ce38f1fdde7ba6f8f5de7cddbdb7eb5e3a7f8f3df36f3adde79c6b96b7f34e9a77ddf577969ce37eb4e7bd5e69d735ddfd9ae7d6fdefad74db97f4eb57f5f777776f971f71ed5fd1a69d71ce3be3a71b7dce3af1f69d7f5f7475ad3b77d79fdfce9ee38f7dd3dd3573de9ef1f6fad9ce356f4ef6f38e7aeb669ff1be5ae376b8d5cdbddbcdfa79df1cebc75cd9a6dadbdeded35e5b6b6df76dcf7a7daf3777579dd766bcf7b6f6f34eb9edad1f7b9d75dfbe39e75df777de37d1ad5ff7df1fd797347db775db6f7bddd6b5ef6e9ed9f6f8779e5ce37f37d757dff76e7c6f8d38f75d5fe1b737ef9f7c7f66b8735edef7c6bbd5fe38f1bd9fdbdddcef4f3ceb8efcedd7f6dbddf6e3475c79df3ad5be74e9f69ce5f75a6bddbcd3d6fdddf6bce3be77f75d3a75fe9be9f69bd9eedceb47f5d3573cdfc79ad397b8ef6e3b7357786faeb56b66b67b7d5ee9ddbd75bf5cd77e9ae346bbd5de9ce5fd7769eede69d79fd7a7b7eb969c73ae7971e79ef38e387fb737737e1bdb9edce756fd79b75de35e5d7dcdf6eb4eb46dde5ee78f5dedfd3579f7b8edb7b7f1ad3bd7bdfbf7beb47766b7f78e36f7673d6bc7faddb7b96b4e5deb8d3cd7cd1adf8f1bedde76d3c6f8eb8f757f47fb77adbdf1fd39f1e71bf7adba7dfd1dd77778efcdf67396dd7f7d1fd3d69d6bbe1bd9de39f1c6dff1dd5b71ed75e9af7bdfbddeeb87bb6bdd39e38f757377776b46bddda71eebc75dd5a75cf7671ff5fef9ef57de6deeb5f5a777edfefcef76b477ddbde3d7fa7f569e73aedddfbdfbe5de5e6faf7d734dbaef769de5ad5ee9ce3cd7bef5e3571eeb7e35d38e786bdd777756f47b879a73d71cf7cd9f75cdfcebae1cddeddfdb9d3b7fb79dd1f6b46fce5de5cdb673975df7a77be1cd79f7ae35df67fcd9ed3cdb4e74eb469ddb9dbb6bcddc7dae9e6ba6bde7469ff37e357b6f79ef4f1fe1c69fe9e71ee1aef5d1a75b6b47b7f7cf39db46b575c7bdd36d9b7f46ba6f5e1debbdf97bd75f6dedbae37edfddd7dde9b73ae1ad767fbdb7f34edcdba7f973ad7a7b7dfc6f6e5b71bd79e5fd1eeb5df4f7871dd3a6db79b75ad756fddbdebae79e7cd1cd5a71dedbddb73875bf3c7dd6b6776ef577df36d5af767b87b7d3ddddebc6de6f9e7bedcd5bef979ee1e6f8f76f7979b75fddc79bd7c73d734efbd5dd7c6f675ee38e5ff3cddaf7475d7bbe3deb4e9e7f8e5fdddf74f38e75f1adf77f7e1fdb8d5d7db6fc71be1aebb69cdf6df6d9cf5b75a6daf7577bdf67df6f6e3577877b79ed756ba69ee3a6f9df7e5a6f769fe1f71b77c69e6bbd1dddddfcefae39f1be5bd9beb777a71dd1fdfd6bcddc6ddf75d77f5f739f78f3bf7bd77f35d34e7ceb9d397faf78e5cedee1a6f5e1be5fe5d7fd6dbe35e376ded7b6f66fd79a7bc69fe37d39f1e6bce1f77c7f9f38ef9ddf69deb8f5cd377f9edbe37db977ae9b79f6b47b57dde7d77c7766fde74e1ff3b6f575fdfbe5d7f475df74e9c73c79bdf4d5df1be7ddfb7faf3775d7b6ebbd5ef1ee3b6fc73bf75f3cd1ed34ef8f397b5f3a69c777f7c7dcd766f5f3ceb6f77e5ed1ff7cd35e5ee5ad7d7ddd776fcefbe9bd9feddddc737d76db5f38f1b79ad367b76bae5ae9ef5ee376bbe1b79be3b779", - "signature": "0xa66f7b04c719954f8bdab939d64f0c9c33e005151e30e290f388f0d0fbc59de8b70e8c8f6793e3c73094c8f857af99f90eda005a9f952126290617235ecca66111751f831e5bf8b22a5132d6695a1d2cafa2c7f08715c97ed74b3a54b2f74f00", + "shares": "0x00c085daf774c63eebd61857388894bfaf6e95b11fb07b634d617243920d92d703a0cc5316bd54779c2521b07f0cf39e27a486d0652b7656f5c8c5d801bc054c79f433cb5b695d89ede42dfb71185a24e756dd6c3ad514c386262316d8f366bfee14a424e76bc75842ed3c9fe49ae4622a773118a4b0f7a31493acb05603b24f895071132515ffe4804ac2ca6ff55e1280bab7b1302a83939f4f262d57d8a59a40a92b00c9878b7b3879f578838f4ac29186ede0105dc04c2574c8079fc8b10bd5e6e767746dcedd7b87b671ae38d9fd3977cd7beb4ef5e9a75ce9b77a6f8d74dbde9f7346dbf7bedb6dc77b79bf356f7d1b71a6de778d3c7b575fe37d3871ad74d9f79fd7bd9af776b9d74d7773979ef5e75a73c7b46fcf1ef1f7f9db6777d1af1ee1c7f6f1b7bbd9d77beb87bad7addfeddf3af1aefbe9fd9cf74edfedbdfbf5be366f6e78f7b7387fc6bce347b8eb473aeb57b57b96ba6bcdddd1ad3bdbb7f4e1d7f66b7db97f869a736f5c777ef9d5a6ba7b6eb97f8d3679f6bbd5c77ae1d7f8efde37ebbe3cf1ad38f35d5ee1a6b5e34db77badf67b46b97b8db9eb4eb7e387dedf77776b9f35f77d9ed77ef5d7aeda6fbf1de5d77df3cd9b6f577d6bcef57f9e9fd3ad3877a69f7bad3cd1e75ee77f1d6bd7f4d1f7f77dbe3977cddfeb969eef7d397b7f78f5f6f877ad7bedff7bf7875c7796df7db75fddff1cef5db57bde376fa7f6775d75d3877c775d9bd34d35d79ebb6b47fbf36e7871b739f1fe79e767f7dda736f1de76efc7badf4d9f7dad37e1ce74f3a79cd1cf356b873cef5738d75d5ee1b77b6df77bdb8db9e3d73873bf5feb6efc7b8e3b7fbd7675dd3b77a79cd7c7f8e5b71f7387fadbcdf7d5cd3bf5ff74d1bf1c775d5d6b7d9bebbefcd1cd1a6db7fcd76d5ad7cd7b6fce3cefd6bb6bcf1deb8f74f38dfce76dbddb4f5aede6bbd5beb86f477df38dfa7f5df6e76e36f1a6f46b9df57fc7f769adddedfdfbd74e7c69d6b5f5c7b77fdf7ce757db79edb8edcedcefc71df75eb969c6f6f5bf1b6daf1a69d6f5f1df36d78d5c7387fcefaeb7e9bedee79d38d9bd3a79b6fc7b675cf747badf9dfcdfcd9be1fe7dd7b75d6f4e9df3cd5c7b4e9a6b5e3973c6b5e3dd74e1c6da7fb6b5d787766bae7dd357757bbe74dbd73be5ceb7e79d9a6bb79c69af5f6b4df8d35dbadfad75d77e3879ed5ae5fd7adfce1d776d76779e77ef5d5c6fa6da6dbdf8dfdf78e1d6bae39d3c73cd5d6bdf1fe9c6b6e7bd5cf37ef5d3c7f769fddbf77e34d78d3be3875af35edc6f7eb6d34d5ad1fdf97386bcd5bd1c6ba6dee7af5fedbe1de5fe767dbe1ed79d35ddfe39efaf1e69f71ed1eef473cdb4e3d6dcdb779ad37dbaf37d35d3ddf6ddbeb4e5b6b6df475fd367bddfa75b738e76e77d9f6db7fddf671dd1be1a6fce1be1adfdd5fddedfbe5bd1f7f4e3ce78eb8ebcd78f5c6ba7da7fcf776dfedbe7c6fb79ae9af5fd1cd75f396bc775e9ee5f6dcedadb675defaeb977471ff1d75dddcd5f71d79ff3bd3a6f869e7ddedf77cdb475f6f96b479b6b9ef46b46dfdbce79e5fd3a7f6e1cf5c7dff7ad34d34f76dbae1bdbbeb969d7dee5b71b7b96f8f1b7b8e35ebbd37736e3a79b69ae5ce38739d3debbf79e3ae34eb6eb6f3be37e7573dddcf5bebde7971ed7ad5a7f5e7a6bb7366b7e1be9af38f7ce1cdbb77be76d7aef6e9d69defae79e5fe1ee37d9ee3de35734ebdd1c7deef56dadb9736e1e7f7ddbf3ce5df75d74eb97746bcf76d1ce7bd75ef56dcddf6b67fde9cebc6b8e75dfcedad3c71b7def7dd9ce9bd7debce75db9d766b8f3c79af7b73d73a7f77baebdebadb469fdbdf347fcd9d71ff74e9fe366dfddbdde73bf38e5b73de7c7db6f7776d5cef7d5a6b7d3d6fb71fe9ddfb7dc737d9dd3775bd39e76f3869be5aef7e7a6fdefbe1ceb7edf73671ae3bd5be1e75b777e34db9d38d9be3569a6f7d3bf5cdf4f3d6b971ad9b77d75fddbd5cd5d735e7b6b56da69bd9b6daedef7c6f8edbe79e5a79cf3b7bddb77ddef8f3cd9e7f5f7777beb8d36ddee757f9ddbe5d7b673bf3a6b879d73af34e37f1cf7ad1aef8d1bf74f7c778e77ef56bbf3a6bad9edb67dfd9f7f8d1defa737d77e9cd1bddf7f8dbcddbe7bddc7ba71aeb9dbadf46dff1cf77d5cdf7dbad7a75a7376ddf75edce1aeb6d3bf377baebbd746b76b86b5d37f746f76f9f5dd34dba79ed7deb8f5de1de9b6bcf5c6f9df4f1be78e77e3aebd69c79ef78e74737e36eb4e38e5de9dd376f6d9ee7c6b96ded776def7d6dc7357df6f46db71be5fe5f71d6ba6b5ef8ebbd1c7f5d7675d7777756b5735df6f78f3771ed3769deba7fbd7d71cd38f796b56f4e9e774e7669ef1cd7975e6b96f5ef979fd1adb473adbc7dce9be5e73df5ed9eef8e1e73be1d69b7b9f3bddadbce7c737dfb69dd35e5ce9b735eb4e3a", + "cluster": { + "validatorCount": 0, + "networkFeeIndex": 0, + "index": 0, + "balance": 0, + "active": false + }, + "signature": "0x86a81495d27683ff098c1bb1096b9b2f10c24a6e512a67e2a53701bd4beec0db40f7db0a0df989c1c59a786f82baa78716b14b78e331c1328f3d66080e83829c4e745633f2e6d9480d6451d9448cd653ecdfc02620054b7d71e5856bf0a92402", "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" }, - "1684341963696": { - "depositDataRoot": "0xc6996ebef4f4eb4fd9fbae7de11f9680467d1af23b5e1c2e649e423aa8d8d619", - "publicKey": "0xb7e0ab492edfc95868bc12c9d8a3c1d67b8641a6464c20a935b02edae4d8caf90b8983072f7197ce389a33326499c996", + "1684356578112": { + "depositDataRoot": "0x5304d296562a22bda92a2b411155e403c06fa79008895b186041c6a31c29bc9f", + "publicKey": "0x886bf7502e43c2bd5e883be3261b8547bf11da628e202b4b0abccfbbd4491e7a8c240242c53346640709b49aabdf4907", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c0a024998a506528d958442dd54c0318b63729f29ba67f47b87b6327d80eaf2260b2be7f238284b6858cb0726745d6cceb95469afa025844f3964b9dadad5edb58d26de6168b44a65bc898bab45eb410043c7f8b26028dab1a87478a1e6f294cb0b259ffff254bc73265ae676a104d3ca7a729e05799cbfde68d0cf87ae1666f0d395d2aef8be41a5da1e2e98221060b41ab3559f50200d4ce74db25a0c34285a1dba2e6f8d3a19395697b85e2df71f17c7999352c7ac49d1a4e005921685d4a83db9ebd6b879bddde397bdd5edbd7f7f39f74eb9dbbe5df1e7dad9ff37e767b477bd1adb9eb8dfb6baefbf7a6bcef671ae35e3d79b75ce7769a7bbd7cd74efbd1dd776dfd747b4ddde9f75defb69e7f6e5df3ce3973979ddfce5eef8e1fd397df7baedb6f569e7fcd7775edbce5ad5a6b96fd79a69ceb5737dbc7dfebadf871f73dd3879c6fceda7776faeb8d7cf1d7fb75c6b5ddff76f1ee1be9edf6778f78e5a75edb9d36e1be37e3bf77eb77f7edc73ce396bae7b6dde1feb6f3471d71eebcdf96f87bce9ce9d6bdeb8d5e75ae34efc69dd36d9b75cdf4e9e7b4d1cdf77b6dfb6fcd9c7dd6b8e5edb76dcd5ceb6ef9e36d35f5e6fb7bb6f771ddf777dd1be7b7bc71a6fc7fcf7df5ef1cdf7f74e7579ef5ae1bef4ddbef4eba71ee5ee76e1c7b6f1c6f6dfc7b779ce7bd5ff5deb7ddbf5df5c75df5ae1bd5de9d7b7dda7f67ddddaf35d5bd5d77a79e7bcf3573a73af5ff5eeb77b6ef86b66b8d9d79cd3b7747b6e1be78e35f1cf3d7dd7fcd9a7de6b4df8ddbd3573ad1febcdb56dfe1a7fbf34e5eedb6dfeddd1cd9e77af34f3ae5fd1e7bcf74e75e7dd1c7dbe7b69adfd6dbe37ddd6fde9f6b8ef56b871d7db7fbf5ef396f675de5ce1dd1f7f869adf8db97dbddcddff79d346fa7fdf1be9bdb9774f7a69c71aedef76d9f73b79d6db7b47767b5ef8ef5e367f5e9dd9cf5ed1ef37736ddcf3b6f9ddaf3cd5bd7cddb7f4dbd6b5edaef775a77de7673779fd7de76db77bddf579a7f5e7ae75dddd7ae3ddb5db8d9c6bdd9ceb971d77469a7f4ddcddeefa73a77d7fc6de73cf1a7f7f79d7def77787fb7b4e7d6dee36e9f7dadfdf5de39d37f5cd7877a75fd9bf75e9ed7aeb8d7de7b779d5ad7c6ded3975e75ae5ef1fddbddcef573ad5a6f4df5e1befae3ad35ebce9bd5de7cd3d69df7779b7b575ff5e69e73cef5d786f5d7be1d6ddebae5dd78e77f777b47da7347dae3c7ded356df75d6b7eb877be39d7ad1af7af7b75dddad77e9b6f7f1ce3577769defbebd75ad3ae3a775d3d69deda7bbe34edbdf46f7d7cef5f766de75ad9d7386dbd3a75ff36e3bddadf8d367db775e34eb7f7969ae1de9cf386fae3979b7f4f7c778d9be76e5ae7c6f673aeded9edbaf1c79c6dfedeebaf74e7b73b7b5e1e6b9775776efb7bde9ee7c73be38d9fe1be5e75d77c7b7737d1c6fb71cedfdb6d5deb871c778d1ad1e75d7f77bb71f6fcdbcd5de3a6fdeda69e79f736db5d7c7fadf4d9e7fb75bd787f6e75d38e9b6ba7f9dde6b479af5eedc75c7f66fa77673577adddf7877c7777bb73cf5d6fd71b7bbd1aef86ba6f8ebaedf6fc69defbf34e5df7c6df79f7dcddedbdf1ce38edddf5f1bdb7f5ed7ae75e7bf78d1e7bce39f36735f5e7da71c73c737e5ff5eefbef9e3af7cddf75adb76bb73bd75f767f6e1fd7bebad346bce74ddfd1f69ee3a7fd7dc69fdb7d7cd36d9f7b5e5d6dedb4f5f7b4ebaf37dbcd756dc7f9d75eba736ddadf56fbeb9df7f1ff77e5ad3cdb76b4e5a6f77faf3cf1c7dad9cd38efaeb4d1ef7ce5fe7c71deb9e76d39f37e7775eeddef479ff5de7875fddc7b4d397b579f7bbe3de1a7dc6bdd7d7b66b47b4f777bae7a6dfd75d9aedb77af5a75aeda75bf787dad35d75f377df79ce1bd9ef35dfb7bbf38d5dd78ebae5ddbadb96f9735f1aeb7dfd79ae1c73b6deef5df86bc6bb779df8f39e9e735dbbe5cd1fe9ff3bdba79c7f4e1e6bdd74f1eeba7347da69e6b6f39f7bd1fefaedad7adb47f8d7ad3a778f396b6e5bdb8d5d69ed5b7f7e9ff7575ef5df36e38e39ef6d5ed1ef797b86f6e5d7b6d7777c6dce1cddcebb77873adb56deeb4e9ee1d7b46f6f5ee77d1b7f7d3dd38e1d7f973ad7c775d34e34e5ee9fd9be5a7ddf78e9b6dae9ee39d7bdf4df47b7d9d77ad74ddaef575bf34d3c7f4f7b7db7f77f579e77ce7de34e1edfdf74d77e75f1fdba6dbe9a75c7dae1f736edc736db5f386bd7dceb8e9df5bebdd37d1fd9ae3c6fc775e7c77df3de1e7bb6dd77bf5ed3d6b76b4e5d6b6e1bd3be3bd5bd7477cdfbddaf5ceb7e5feb4ef6d7ae79d5de1f71ae35dde6b9e5a7fad3bedf739f5ad3bf1bd9f69ae37d1de5e6fcd9ff1ae1c738e5cf76d74df96b9e9d6bde7bdbdf78d7ce1ae7973cdfc6dae9ddf979d7dde1bebad3ad7ae75df7d9ce74f7a7fbd3bf5f", - "signature": "0xb9554b197daf8c683a5c9e4449f216dcbcca9a75ca54a3a3fbfbe2039a9817534d3db77b6c31ee8077b125a552fd59741776382a471a143436684aa8d442719f2658693262ca7e1e3a8ed45d312bd466e3305b2b65e626d0e3e67a247b58bb71", + "shares": "0x00c08b9d8ed8f89734251e4b308e8a4d9796a5226c7f7236f58b7ab4149fc5910722cc1425fb9f068278ad2a79e389553093a54821b839f249440d3e89e223fd6ba0b407421a3196b403ac5fa1ec39768b7db17b2a9226859e8a0ea74a493c57e82d8fb83483fdd54d756c9c90fc3ffbb178852e25467644911981552a7b6222a91a48a4cc0a19abcd67fa615a0505f63484868b95fb29a708f0cde44eab92de8a16ee6688dc9f6f3ec88cb486a8d95c54c273bad05dac014b3bcb935c0e5ec6df126b4ede69f736ef877befd79ed1de5cf5cd75734db6eb975d69a6dc778eb575fd9b6da71fd766b773a69b75cd5d75b69dd1de34ddf75df7c7bcddd75bedde3b7bcf37ef975a71ae39d9cf7be9cdb6d7a735f7dd1eeb5f75edc778e3b75f75a6fddfadbbe3477773675fe38d1df3cf7bd9dd1bdfb69cf7d7b679cefb69cdbb7b6e5eeb5dfbede7bdd7a6f679e77ad38f1d7fcddee36d3871cd9c77c7bb734f37f78ddbf36f7a7776f7f1df5b6f8d9b6f6db86f8e76d3ce1cf1f7f8e78d786f46f573577ad3775ce796ba71a69eef6f5f6b4efce75e7b6f971a7fb778e34e9adddd1bd1f6f477971d7bce34d7d6bad7de3cf34d9ee79d5ed1ce9bf5d739d9bdb67787bdf39e9cf3c6f9d7477875c6dfebbd5c735777d7cf1f79cd9eddef7af3ce76edceb8f1c77d7fd6b66bd7b4d7d7dc6b8dbd7386fc7fae9fd3c7ddef7e1ad9feb4ef879bd1e7f7f3775ddbde1fe38f1d79edbdefdd9c777f1ee9b79be38f1e75de3ddbde9bebcd3be3bf367f57f4e3be9b77769df3ce1dd38dbc6f4d76e5fdb4f3879fe387f4ef46fdeded367766f6f3de5ef367dce5dd9fef4e7d69a7da73a736e9a7bad9af5bddd6dde9e75ed79eb771aef4e75f75f39f3b71cd5ed35db9d7d737e78e3c6fcebbddfdb5eb5d5e7f9f3c69cd76df8f1eddddf671fe5addd777d3be376ded357faf5cedf7fd7dfd5ff3b75dedd7f66b7f1fe366f4ddf6bad5ee35d9be3ae77f1ae3973af5ef79d9ae5beb97377b46ddefbdb8efc7bd7bc6b47b7d7bf7677d75af5ce5befc7db7dd7347bb7da6b869cf79df5d76ef86dcd74ebce77e5ee386f871e71be7ad37e7d73cedbdb8df4d7af1bf5aefddbbf35eb6d1ef7cdf4f3471cef5ef4dbbd1a79f6b8d9bf346f679e7fcf1df7873dd1a6b4e7b7b4e76f35f36f1e6dad9ae5f739734d746bad3df7a6fde35e34eb7db671cf7469c73873df3a739d756b4d1fefcdfa7dd7ddf5cd5d7dad1e71f75cf3a7de6fd6b66b9f1d7f6f39edfe377bdd35df4edd73a77c6dcf3de39ef76bde9d7fb77ceb673d77b71a6fa79fdf6d1af7adf6e5de7b6badfa7f777d77bd1bdfad5a7dae3af1c6f56bde7875ed79d5ae3bd7bdf77b5ddcdf569a6de774eb979d71cedbe7cdf9ebc7dc75ce74f5dd3bd3c6daedde7b7f9d7879d6dde7bdfae5d77af35d7c7b86fb7357dc73adfb7b9d3679af7ad1ee35f5fd3b69ae9bdbcd767f87756fa6fbeda7badb8ddae9bf3575af3873a6f87bddb7d9de5d79ee5c75dd7d7def38e1ee5a73ddfbeb5d5f6faeb9d76db479adf871ee9cdf9eb573673cdb5e5c71cf37ef8e9af37f1cf5c77ae1b77bedfeb9734e7a7f977873cf7bf1ee1bd367db7f76b6f1d7f87fbe3dedaefa7f7f5f69fd9cd75d77e9cd5b71ce39e1ce79db5f3b75b7dbeb7736dda71c69b7fcdf47bcd9af7c7f777b71ed9ed39f7d75dd3bf37d5f6dc75f7b4f3adfdf37edeebaddbe9b79de7a6b775edb97fcf5ce3677c734ddfd74e75f1ff7777c7bcf1adda6b86f4eb5f3dd7cd1dedbf357daf36d3be7bd1a6b86f6efb6b9d7df7d71ed5a7347ded7dedbe3bf3d7b57786bcef87f9ef67dee5ad9ed9de1edb5f5bf5cd77e35f1ed3cdfaeb8f75d5ee796b5ebde9dd9e6fa7f5d7679dd5bedb7b5776d1feb97ddedc7bd6f8d1df74e36efadb56dcf5d73c7767f46ba6b977a6b66df7f969ae9a6bd69dd1bd9d79be79db5e9edb769fe9ed787b8f5c7b671b71ed37f5b69edfad7a7bd6bcefb7bd7b6df779dd9a69d79ed9f6b87b9ef57daf397f4ddd75ad34eb9dbd79e6dc7b5f5cd7a75f739dfbf3b776db67df6b8f1cdbb75a7fddb8f5a71cf77f3b6b871bf5ad9beb5e776deddf79af3ad34739e77f5e777e1fe7a6fceb4f5de79d9c77bd38db4e9f776d3475a73875e69d75aebbe9be1b7bdf76d7569ae3b7767786fc6b6d7b7bb69bdb6779f347fce777f4779f3671dd3877cdf7775f356fa79dd78775dbdeb773ce9ff1eeba7b8dfbf1ef3cf376f9d1de5bd5be1e71a6b675e69fe3cefdf79f3af1bd5f71d6bceb4d346fde7bddfe1af776dde9b77df5a73c6fbf78df6e78f3cdf979fdb5eb6d1b77b7757dc7f96b8e9bf5ff5a6fcf7dd3b7b5dba7f6ef9ef5e34f1bf39d7c7dd7f8d7ce346fddf46b87dde5c6b479ef1deb4edbf5bd1a7fdd3c7f4d1f69edbce76d777f6f3b", + "cluster": { + "validatorCount": 0, + "networkFeeIndex": 0, + "index": 0, + "balance": 0, + "active": false + }, + "signature": "0x84500b9d90568f788be589ce104c40ba1e24d68878713276f578fa6db56decd7551597aacabcd26385d60069b125daa0115a16547ea8c9de8a1f460585eb8904d0d83c6aa4ee682e14b8a7f2e1589ec4be63bb0073e394e94fa5e7da7178143b", "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" }, - "1684342041914": { - "depositDataRoot": "0xc0032d54ec59aa8a6e6949ee4cbe84dfa3e3ce832521892e6a041ca92478dac7", - "publicKey": "0x90149681ae691258e2c85f2dc1297999091e7a56c776e4c6db2effb1e0bbca5ec7445bdcb113a190da8d8f3d012973fd", + "1684356840468": { + "depositDataRoot": "0x4a35d79522d6f744f949956269e78df53517f613570745dc30d99d4b963422a4", + "publicKey": "0x8ab7b66615bd961d10634ca287e63a6101894e7a2f16ff32ecd3fd0563391cfbd6c19631c9c18a4043f3f511419f7afb", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c0843951e698e1b7fb05c60674b3439db4fd1f88c0f06410045d0fb2b88b6c628ce7369da5217164bf0b83e8106f6e890684aab5af928eb215f486ee515a5fafd2fa20aac67785f90d28448f0a16d23584e7896f1d441c66a5812b461097555064a11339d69028fe105d82074ab602d15a0435fb39cd6a3c1e36c5a868ba58286c8f451389e33d99f1f3b2b077aa9daa93917df4acaaf3313203922e796ce34567eca2cc5559b0f14d8f98e24cbbce5bbb97e21031e2707d89c46ba45fa1f02b2de37d5bd1eef76f477ad7b6b6d5bdb5e35eb56f773c6f571fd5bdf7ef5dbce5a6b6db67f4d757f4f78e3cd75d7775f7f6ebbd35d356f971ff1cd1b79ee5ad356b4f396fc7376bcd1b7dde7971af7a79befce5af76ddef5e79cf1ad39d37df7e747b67f86db69c7fa777f1d777ddad1cebbe7d79bf1fe38d7d6bbeb6d39ede6da7bc73addae7df1adf8df6d7977a6ddf7b6db73971a7797f86f97dc73ce3b6f5f5bf7af5ae5b73bf5e77573771fe746bc735d78df46f97f47baf1a6fdf38d3cf37d74d9cdf675ee3ddf4efceb4f5ed5af5fe79f5cd74e5ad1ad1de796db79bdb469d77af5dddef3de5ae7973ad5eef8e5befb6f873469e7fbf1f738eb4e3b7fa6b4e5a6bce3a775d7befae1d69f7fa6b8f74e5e6bd779778e9d7baddcdb8f74778e37d1cf1b77ae9bf3b779f1ed36d1bdb5e1a774ebbd3aef4f7c7b7f7b7dcf5f73a7fbdf769d7f6e5b738f5de1cd77e5bd1cf1cefdebc6f77f771c71edf9dfcd5f79c69ce1f73b71f79f775e35e5b6b6d9e6b9e36e3d6b8d1e71ce3a7f7d34df9f76e9b6f8e3cede6f47ddd3df1febb6b67dbddaf7aef9e39777e75d9eedfdbaef7edee3cddfef56b769ef746bd6bc6bddded7af5f75bdbc6b97b573a79fdb8df671be9cedaeb76b573a739f3ad7bddbeb9db773cef4f7ad78f7469bddad5c7fbd3de3a71f73473779e6f56b5e39f1cd9debaf3af3d6f4edbe5f73de77e7b7b8dbde1a73bf36d7cd3ddb9ef86b6f5cd9de3cf7df77d5ae1ed76774f38e39f75d1d77af37f7879dd1eeb67f8d1bd7a7f4efbe7971deba69cddd7bdf7d71ee5edbc7f76bbf7bdfdf3675dd75d74dbcefdef7ddadf8d9e6ddd5f6b56fce9beb76daeb9eb4e9dd3c6bbf78f7cdf9f7b739e3a7ba75cd9dedb69bf5ae3cd5aedaf7bddbf3b776efb75f6f6e9a79edbbedfedcf7cdbaf7bd3471adbb73af1ee7869e79ed377f673bf5d77a7fbe39e367357bcf3d75ae387bae39edfebc71cdfbf1fd1a6f6efae7775c7dd69d77cdbb7f46b9ede7b4d7c6b871adfd79ed1df3a7b5d39db76bde3873ae796db7787f87da7ddeb8d35e5a7b8e1ee7c6b4d37ddee5d6bb7bd73dd39d5fefb7daf39df9ddee357b7778d3871cdb8e1edf5d9d79befcefdd7771e7dff5d77ad7de787357de7db73b7b57f5e1f69c6dd77871be1e7f5f74e78d35e38f1bebcefa6f6739f1ae1d7fc6baef9f1a71dd9d69a69dd1fd35d1b7b7efdd9fddee5df1fe3cf1f71f7766b773b6f8ddb71fdb4d3af37f7adfcf357f6f1fdb9e1ff1af1def469c7bd7b9f77eb8edadbcefc6ddd1d7bd7356f57baebbdb8f777f9f1af1ddf9d1fe9de7cddce7befb77571b79b6da6f8efbd9cd1d77ae3479f7fb738dfcedff1ed39d797b7ebd6df75ef74736dbaf34f7ddddf78ddde7ce757fde3ae1e6dd75be75d76e9eef9dbd73de7b6f46b4d7b6bbedbd7cf1df1d71e75b73b6b77de71ff3cd9d7f96b4774d5d6ded39739e76ddbf5be7cd1fe3479ad9e7b66f57b479bd37f79ef875bdfd73de7adb5dbde1cf1ddf8e9ff5de1de35e7bdb6e3575ae3cf3c69f79adf473aeda71fd7adb46f86dfd37d9ce1bf7679dd36d7be7de7bd7cf5adf8d776deef9ebdd3bf39d3bf35e3471eedff1c6daddd69ee5aeb4d34d1bd3de3d69fdf7d3ae1cd5ce1ddf47f7e3d6bd79f6f7efddba737e3aefb6dbf5e73d69bdb86f9f3dd9e75fe9edb87bc7777dcdf7d397fb7bbebb6b9f74737776d1be7dd3de3575b69a734e5fdf57bc7f47fdddee7871a6b56b7eb671fe3471ce75f79eb5f7c7f5ebde9be1ed5ee3ce9e6df739d1ce3ce3cd9de75d1e73473ceb5739df8e3bf77e3d6bd77569eeb5ef7e3c7776b8f3de7b79a6b7f79e1bf1f7fdf5df5addcdb679fe3dddc6f7ebc7f8f766f9e1f6fde9be39d9aeb7f3de75e35eba71eeb9d9a71ce78dfd7f4dddf36dbdd9edb57b7e79e75e5b7f5ddaf1c77ad34e5e79cf7b7f6e5cf1ddb9d5ed9cf1ae3475ef3b7357776fdd3c777e347776fddb66dbe3cd7df7a6f6e1c75e79fe3679cddef5fe76db56f873b6f5f346f869ce35e74d79e77e9dd1ae7b6f9e39d7de3469a73af5e7fdedc75ddb7d5d7faddff5fd9edfadbb738d7df5a7ded5ee3dd77e78eb8d1e775e9bd5b7bdf1df5d79d69fd79d37eba75addbd747f779e79aefb73c75e7f9d1ae1c6dedf471ed9f", - "signature": "0x93b11dfa5b6b937628bb1267fcd1fbabc41d83bc05b3f48ed81054b4c1f57372121e97fe446116261496e06c646f7af00797baab6043e746657087cc1dfb61afddbe4c1d0ec40ce327ed5faa8dcc77473b8164ecb010200193c287039917ba1f", + "shares": "0x00c0b20286d5625a6a6f8368d16ab50838d89ea522ce7d837c69544d8f34e345e49b898858a54062987612b78bcda45e6d57b528c45523e5f3759c06a7dd4c016d7c23eb9262287fac18a2bdb2dd097d40c9ccfb7fd9ad583e29cde85dd09dd1bc02a21146423e7e047adb311d40cf20245c7d794d2d7befc2d5539bb4190f5a282935027cd73e240d1a1e213097a571e359a3861281c0ef9960ddc0aec4b1e6e1508ba73aec0849360fa5cdf3096ba675f65e3e516c6d1e582d07c396d3492e1848f3adb7ddfef7eb6f3bf7a7756b5e5ed9e7b5db7ddc71bd9bf1d736f3dd1bf1a736dbd6b66dcdf4e79d5f71f73c738df46def5feb4e9fd5ae5a71defddf773debd79bdfa7b77f5f5d777edc6ded5ed9cdb46bd79f69af78e78dfcf38ebb6f479befd6ba77d6b87bb6db6b97f5e38775f3be3ce3779c6f86fa6bdf38df771ae7dedee75dfdf34774efbe37e1fdfddb4efae5dd3c6dcd376f67fcf5aedeeb7e79e3af7cd396f7737f7cf7469c69dddc6b87fdeb9e39f776f6d75779e3b77be5b7daef4eb4dfae74db47b7d9fe76db6d796b6ede6dfe5debce9bd3dd7cd5eddfdfc6b4737d35efbddcf5beb57f475f75be5ce35d38edc73975ff78d5e79af3c775ddcd7973c69fdfdf7b75ed3ce1ed9d7dce74f74d35e39e38f76e1ee9ed1cf5cd9d7b97f6e9df1ce7df3dd1ed78f38efd73ceb57dfd39eb6ef4d3cf78e34778f3cf5cf77e5fedcd1cddbd766f9dbcf346f479de1ce38e5ad37ddcf1eef5dbaef87f971f6b6f7aeda71cd9d7b9f3c7f77f57bcddee3ce36e79d36dfcdb67f5e7b7faeb96f4e1befde38d9ad9d6dde1a6b8d9d7797f8777779ef8777eb97fa7dee9f75e73df77778ef4d36f1bdf4f5f6bce5de5eebc6b5ddee1fd1ae7573a6f9e3d6b675e79d7f9e9a7f4db66b873669c73a69feb46bd79ad3ad35d9ce35db5d787dd736f76e5b75ae9de9edb9db86b471d6b979aeb7eb4e1dd9d69aeba71fe1bd5bf1a7fbd35774d9ef5cd1bd9bd9e6dcef77f57347fbd5ad5fd36ddee3de5adbc6dedbcd3ae1d69ef3d6b975cf1e7787f67bb6dedf67b7edcefbe35f5e7f5f34e7de37d9c6fa6dbd3469e75cdf7dda77cf7a776f7befad5bef7db9ebdd75e1ddb579b6dc7f8737f5ee3be7af1ef3ad3571a6deddce7571eeb9f397b6ddc7b76bbdb86bc69df5f6fb69ad7979cef86f5f787fcefb6fae7bd1de78e5a6da6bd7b8f1cedce77d1aef9e9edfc6b5df777ae3573671ee9d7386ddd1ce9bdfde9f7796b577d6fbf5b73cd1d73877d6dff747fcf5b7ddd1af79db5e37d9e69af777def1b69fedaeb86fd69a6f9dfbe3de7b71ed3ae3de776deef5eb879a7fc7dc7b4e5d6f569b737774db7736f377fde7677bf78d1eef6d74e38d78df8e7b7ddeb5d3af3aef7d9ee39dbb75dd7ce3be767fa79d73b69eeb97f9d74774735f1ef1b6bdf1ed3dd75f5adfce5c73ddba6b7d3c79e7786df736d9dd3979ddf47fbdb871bd9ff77f1b75b69f7fcedfe376f87bbdf5d3a7bd73a71aedc6b5f78efce3c778dfad1adf9d5ce39f1e69c77af77eb7d7dd35f35efd6fbe34ddcd7b778ef9d796fcd5c75f77adb8d38e9ce5cd3ce38d78e5edda735eb975adb7777ddc7b7f3cd3be5ff347f6eb579f79c6f4f766ba6f9efcf377f8eb7d9ad5ddf769ef1e7746bbd7bd36d75e7ad7de1ae1cf1d6f87f46f87f7d7879f71aefbe1b7b5df76df7bd7f8f3ad79d3bd39f7cf5fdbdf3a737e9e7367bddfdd9d79e7f7f77db8f786b9ddee5b7bbe9a6b473cdf8e9c6ddf34f7c6b673a73d69d79ef7cdf77baf7d75aef57f6d7b7347da6b8df8e7b6db6fdf38d34df6f1b7daf1defde5df1d6f673bd75df87bbe9f71b73c71ae9d69cef8e9fd79ef7d9ee5cf35f3bd7be9bd7bf3d75cdfcdb8739f7dd76e77e3771d69d77cf5bf3aedbef7f5d7f8e3769b6b6ebd75ed5cf397dfe5ff5fd3cdf4e9f6bc77bd76db7ebc6deddde1b71ff1fd3def8f75e37d9be1dd34ef7db66f4d7671c6b8edaf356bae1fdb5e5befd6b571fe1b6f9db6d1b7fadfb6f4edcd3d6f4d1e79de39d3c736d9ee7cdf875cf5a73a6f76fcd7969e7fa7f87b5ebd6bd77869fedadb5f1d75d73ceb8f1ee3ae1edfdef5d5e71ee7aef4d1def7d9b69f71bddee5ad3775d69cf766dcf1be39d797f7efd778d9eefde9c6b57da7756b6d9d7fbf35dbde1fdb5db6ef9f38e1eeb4d78f78d9bede6b8d5d6ddebb6bae78738eb4f3bf1cdf7e5c6f9e9ae356b5df777ae9dddae1a7f7e7dd75dda6b779ae38df6d76f75f1ed9a7b8df9f1df757f56fdd1a7dbdf477af7ceb6778d7c6dd7bbefad37dfde1bdf9e5a79df74f5de1d75bd3d7bbd9c69fe3b69fef8d1cf38f1e7dddf7dbadddf3ad9bd76e747b6e1dd1d6f6eb5e79d7cefb6b8ddee9e7ba6ddd3d6f9ddaf7771f6b577ae776bb77d7fb777e38ef8edb7b5d5c71a75adbd", + "cluster": { + "validatorCount": 0, + "networkFeeIndex": 0, + "index": 0, + "balance": 0, + "active": false + }, + "signature": "0x92fb481663e91793f8320a5607fd8b8afecd9b557d67ca4d59cf0382944256a8f9a7f2276e5be613cd5a455e87c6eb8f092ccebc3fab9da500d78e5a8e560be6457ec48de1d604b87a20eb5a96f9a96a2c155c934f1199ba0ed4e62b1d3eceb8", "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" }, - "1684342066922": { - "depositDataRoot": "0x00beb995ba93e591ed0ea8eef0f52c5daa136637cab1d3f282345ce4b92840ab", - "publicKey": "0xb61368db9bc88854d3da83b1b258c7499b1f281ec2b055688ae7163e4145929cece1ea68ac7c0b59fdfe6c4ded01fd1c", + "1684356962052": { + "depositDataRoot": "0x8008fb8977a6bec6c649ca42fcfe80b3806614b638f332a267f71a9b587b8a3e", + "publicKey": "0x8dbc75d8e9ecd3b427953943df362e16045d35270f53ee78b1f408f51e77c05f64d99ab9835ea421b006b8193251d6da", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c0a99790cbf1754998a599240c68d44ba8243da674186ec98766ffebce7f99a4971e652ca281f0a7bbe554a79bc8044b44a89799c1aac254b095e9bf6b4f5d6ba67c406f77fda6b9365cbbda4b41d33245e9a37379a5444788309f16f01a77e84f8a626842f4f3c90d22b984f5fbacfaf88c8a07f8085be4b8cc35ab2cf8b42f9890833f4902a305ff7912a77f117de5168292b588663e7a503869d029dba933e317fd3dc472ffff55b71d52149e2821108e1f88fee9f9583de2fb0babee91247471af1d73cf7473aefb7f46f56b8d37776e9ef34d38f3969d73df1f7f7f5de7bd1ae9ef76ededb775a75cdda7fc75d7b5e7b7fa79fe5dd1eefcebbd39f5ae9ed5febddf8f5fdbcf1f6bae35db6e7871a7b9ddd7b673b71b75ad796fbddfef8f1eeb477c77cd9ff5bf5bd3977af5d6dad37d1c69ae9bf3cefb6f6d1de7af78d74e1cebc6de7da6b777aef77dbd7defad346db6f4dba79ad1c73cf37d757386dfdfbdb5e78739dbd778eb6d5a7dcf74db975a738db6d9ad1ceddf3d77bf1de1c7b7d9de39d7de7ad3875bef5efcf39ddd71beb4dfb7b5dbc73b7dd69af35f5fdf46fae7579e739edfedde1de3ce1f71bd7d7bc7386b9ebde35d3aef76dee9f79c75f6df69edbdedd7bb71ed5df1f774f36d5fe9ad39ef6e7cf1a6f4e1b79ed5ee9a71fe1a7bbd9a6dd73bd1d6b97b671cedc6fb7fb6dcd7dede6f76f9eb777575f73675ee7775eef57f579be3be37779f5ae9dd7dd5d79adb8e35f7be77ebdd7cd5bf1ee9dd9d7ba69b77675c777f76e757dc6f9f5b6de69bddbd7d75ae7679ae1bdf4e397b5d5bd746bc7fde3a7bbe9fe5e7bae74735d3b737d5e79e69ff1fe7d77c7b577a6b7e1ed34dfc7b4738f78f377b5e1fe3ad9b75ae1af1b6df7367746db73defa775d37e787fd7366f6e3cd1d73cddd7f8ef6d5eedf71ddb8eb4e1a739eb9f5de9feded76e1ae9ddb4d79e1de77779d3ad3d739e1ff5f7dbe3ae5f69de7469e75a77c7b4d9e6f86fdd5b7f4e1ef38f7cdf8e9be5eedc774eba75d69ddbcd5fe36f1c6fd6f479c79f7b9df4f5be7577c6f4f3ceb8f786b56fae9f7fa75be3aede7b57bcf1ed75e1ed1ce1fd5d73cf3869fe35db9d5edb56f5e7a739f397dddf8d38d787f57b673cdddddee7af1feb469edbcd1e6b6d9b73def673def4e3d739e5ef3bedddfbf1ff5e77779d735e7c73a7f97786fd6da79f79be1be3cd3477adf875fdfcd78e78ebcdb6df7e3c71ed3b6ddf35737f38e767bcef47b9e786dee5e7db7f771ce9d7f8ddbdb7ef4e5ce5ff3d7fb7b4d1fd5af34db5f79e5ed3ae9defcd1bedee7bd5fdbc778efcf3675d6bb7bbe37d7773569e7b969a6b8e5a6b47f5d367bbeb6d9fd37ddbf3ad78ebcefd7b975ee7873df5d778db5e5be35d5cd3def977defad1adfcef7f3673ad3ad5af347f8e35df871a6b6f757f875de3adb969fe7571fd3569ce5d7da79c6bde3cd36edfe3469aeb4f7bef5f34e3ce1be9a69bd387dde36df5e746dde38f5f7b6ddee9fef46b6d7cebdddcdbbf7bf7dedd75be766b4e3cf5f7b6d5bd5b7366b6e9ee5ff7b6bbd747b77dff356f86bddb5f7cd1a7dcebcd3679c6f66f7e7dd1a7dcef679adbce9ee7c6dfd3de9fdb7d39f5fedbe5ce3577cd9b7f8d5cd786dee1e7deebcddedb8e3be5c69af3b77979cd7bd1f73a6bc69e75af796fc77bdfce74eda7b6779d9c6f5d7ce9be9ad5df5d71e6bbd1d7b8d1ed9ce5c69fd5c71df7ceda71fd34e36f5deb67fbd1aeb9776edf6bad1a7f9ef973871f7b6d3df1df5f7b4f3cdf579b6dcf7a75ee5e73b7b4738f5e6f56fbef7ddf6f8e9a7bc6fae1e6dfedc79af1df3bdb5e9fd9de3de5aefb6dfe1cd7a79cededbde7779ef7869f69ff3a7b769fef67fddb5df5e1a6dfef7734e39736e5fe1fd77d3dd1dd3ddda75a735dbad77e366b5db8e9ce7aede73673c69df7b79eeb56baddeeb7f5f77be9be5e6def3ad5be3cd5ad796ba7bae38dfbd78dda75eebaf3ad3b6f8738dbcdfbf1ceb8e37d1c75ed5d79ef77e9b6f57f4f1adfcf5a7de7fb777ef977ce1ed9f69def76df73a77a6bd75b6b7f3577cefb6f7d37d5f6f4e7bd1dd9edf971edded3575f69d79ee1c6f6f7ae5d774e5ad1ef1bedc776ddb6f5f3d73473875beb673479adf9776e9f6bad3bf5bddcedae7ae9ed3ce3a7df79b7387b76f9d5c7bdf5d6fcf1c69ddb7d5a778ddbdf9777737d9bdf9734f7c7bc7b5d7d6daeb8e1cd5d73ad9bedcf75df871d737f78e34db8e5eef4ebc6f7db87dee5d69e69dedaf77df4efb735f3cd3579b7b7e74dfd6fa7bdef57fdeba71c6fbe7c6fbf396b8ddcdf5d36d7de387dc79df3971d79ef75d75dde77de9e6bdd7cd7b77dd787f9e5cf7d69b734db473cd77e9ad5ef1ce1ed38dfcf3b69f6f6ddb6dbd35efb7de6f77bdd7579bef7f5bf5be5eefc6b6e9b73b6b579ee9c", - "signature": "0x90071d264bd8dbaa16c6ccb279f52fe86e147795dff69fd35b57fc90bde56314d0e93d07243b58f2f8f5ff247caeb1bf035566f7f043c1031bcb80e3673b601ffa296aef4d41c47a80539215a5734ba04af191fff8c73ded9e203480ff28c1fe", + "shares": "0x00c09937ee2bad85a51bdd0f8c641d3350e2bf0f1357844614bc72b68d53b355926785039b903a54da08851cd8d1b335e454a3399cf7525110ec359a71d00510758be2e7c6d8018e6aaf0623a02f8675aa668bcb8aefc2a05a05d88f3a35ff5247d6aa67d9ee8d9b731beebeb7bc3dc7ce683f08ea79bd5ce364a93cb7d0047f104ad96fbe5b17a8a47271643808239ac706826335a0faa76606f3d54f0088b4b0ab1b3fb0fb5c4953ab8190ea9421b9ced0b1158b09390e2a1db901be4643582729e7d77ae347f4e1ad37d367f677aeb8f3777b6b66dfdfcf37e7bd3ddf471cf1ee9bf3be78d1adbbd5c6fce9af5ad37d74777df775ed7ad75ddfd9d77571c75ce1e69ce9deb9ddb69ed1c6b86f57f9e3aef57f5f78dbbd39734e7df75eb9e7575b75ff3af7adf7f777f9f5defaddff7979d6fdd346fbd767dcef9e9cd9e6fd7b8738f1e6f4e9b775e7c7fb775efd69c7f86bcddde9beb5db4efaeb76bcd36f5f75ad3cef8e5b6daef9eb6ddcf38f38d1f69a6f575ce9debc69e79a7f8e5fe357de6f7db87787f9f5b73d75de77edbd7df39dda79bf3addff396df71f6bdd1bddcd3771de3871de3c7b4e746dfeba7bcd3b69cefcdf6db7ddc73473ddb9e7de5f75c7b5774d3ce3a6f9edbe1c6f5d74d376f76fd6b473ce77f3aeb8dded9d738e35d1e73b779d5fd3bf5d75bdb6d3469a71b6b96b6e5f6bcebaf3ce7b75d6b7ede75a7fc69ff5d75a75fe39e39e78efd7bcd1fe5e79bf387b8db573de5fd36d1b734db977977b79f7bbf1bdf96da75addce3769f7b5eb6e3af1af78e1bd7bf77efdefc79fd356b6e5bdbddbad9ce74edfdfaef775ce3ce7adf4ef471fe5c6bcddbd9ad1df1ff5cf5f7b8e5cdf8f34738e9cddc7df7db79e6b7e1fd1b73de9eedf6fbdf9f5ed5ee9c774f7dedd775edb7f6f1c7dcf39734738777ef8f5aebb77addfef7d7c75e7daf7be7bf3c739f3af36e1bdfbf3c75ddbae7ae7aefde5f71ad9bd35f5d6f7d9ad5fef5e7c73cd3ad1ce37e7ddbbf5adb6efd7bc77aede73969a71de9bdfcdba7dce766bce5c7dfeb8e39d1d7b871b6dfdbddba6b8d75dbb7776bc6b9f1af3dd3b73aeb7f3a739e5ee75e5ce7a75b6bcd36efdefdf7c7f6df7eb96f8e5ad38e38d1b6daf376dadba71ad5edb8eb47ba7baedc71a71cf1b7b57db7f9e1de37d36efc6df734df569cddfe756f4f7c75a6f46b477ceb8f7af76db671d69f71fe75efae3ddb9df76f4d1be5cedf69b6dbe1cedcebc738d1c79a6db7f6e1ce767796b4eb5d7979c77d6fadddd77f1bdddf7a6b9779db8df8dbd77ceb7f1e737779d1fd36f1fd9fdfbe77e9cf1aeb5d1ff1c6fbdbaf5e7f7e746bcdf6f5ddf97fbd9ad35e3ad7af5f6deefdd7ae1de7b75eedd6b8df9efc7df7b8e5ddf4e5ae36dba6b9f1bf7873b7bbd7b7f67ded5de1ff78e396daf38e1adf8d3ce5bd9dd3added9d735edc7357f56dae7b6f573875fe9d6f8e5dd3b73477af75f3c73cefbdf5edfeba75c69fe9e6bbf77efa7bbd3c6f4d7b71ce9cd35f7d6f76fad9fef9e1f75cf3be1d6f4f3b6f5e9debbe39e756f96fadf6d7c7dbe1aeb4f37f34e386dbf5ed1e79e6fa7f7eb479af7d75edf6d797bae1be1f7bdddee777bdf1bdf9edadf5dfce39eb8ddcd77d3bd39eb8e35eb5f74e5e69ff767347386ba6b56fde1febdf5cddfe1b79e777f78e1ae5a735e75eda75e79cef87b6d5a7347bcf37edaefbdf4d5de3775f71cdf4d776bc6f6f78edcd7b6f6d7bd5ad9ddf4d5df1bd3cdde6f66b4e75eb4d38e77737e35d76f5e6dfdfd79dddedfc6dbe74dbbe5d6de71ce7af3d6b7d1aeb76faeb7f1b79e7387bbe1ef7cf37dda79e6df735f39d9cdda73bdfad7677675aebbdb873d7dc737d1be7bd9a7f679adb9edaddae3c7b77def5bd3c6b977b6db6b77b871d7bbe346dd735d1aedb6b5d5d6fc7fcd1cd7771ff7df7bdfaef57b769bef6d35d5fe7969af7cefc77cf76d74df8eb4e5def779d7dc73be3579af7969af7bd3579dedef7b6bbd5ff1ce1df3a79bf7be1fd7cd5b7ddf3cf1adfbe5c6bb6b9ef8d34e3471b6fd7b8df6d9ad5ae5d6f9d9c6b46f975ddfdf7573cf366def1d6f6edbf1c71bd1ce376fcddd6b977bf3ceb86f5777f1cebaddd6f8f78edee9cddfeb4e1dd3cdb46bcd9d71ddbbe1fe78f5de5de357b5e1a6dbd7de75e7a779d1f71eeb7db5f1deb77f569ceda69de5e7ba6def7a7dd7bcd3a69d73af3adb97ba6bb69dd1bddc6b9d5fe9a776d9d69aebce9b71c6b769fdbb7dedfadbdedf777ddad386f4df6db6dbd7f469d79ad7df7c73df5ddf46f6f3be1e77979a7fae1ee75dfd6fce9ee78dfddbad5cf5befcf1df757b5e5dd1ce5ff3af74e9c69d77a7f4d796dff79e36db9eb4e3c69d6fbe9d69bd37e35d38ef471aef8e5d6dadfdeb773df7d6fdf79ef8f5df397f6d5ce7673671ef3cf397b6f3a", + "cluster": { + "validatorCount": 0, + "networkFeeIndex": 0, + "index": 0, + "balance": 0, + "active": false + }, + "signature": "0xaad2571c0e8d0f3e0c7095265bbb558daf9d07189bded28d3a9c6c77637cfdc4e3d97f8d38a65d786369b1e786110e2607e07fd6c3aacb876910c90b616db77cf34f9285ba494f9d9ad472d567dd0bf9488eb32c249b52486a51ea72b4d07baa", "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" }, - "1684342178284": { - "depositDataRoot": "0x180bf16e4787674dd32ea16bc3f0cf6b99f6eb4831ca8406f48ea7c26ac8f3d2", - "publicKey": "0xa558b01422e724b25ff477140a1dfff7a5d11a59c6da571ecfe739b7ddc47b611fc5b7ef15c2f40dc7a765befd4f665f", + "1684357828972": { + "depositDataRoot": "0xb98e9b4e411d83d956191d44d1b5faa6552d9f38c42f6d98379ca3b131c17a28", + "publicKey": "0xabb52e0c9a1af639ec05c2fb4daaf74be7b4ffd6c188828e56de78d3264e4128d02301dc3e04bcaf1c8663be4e2e2b0f", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c099216eb98dbde1f67900ce492c492d56fc19b2f41de75c963f3031070931ba4be63c529e6913c2db086a93b70d942154ad73d3d8b99746e8355604f1041ed28b943ee7cc7925d99bfa9776a9f27078af0bca16cc9da41c91e61f393276123441a0d34e5bbe1d0f2c09ebebf23c4f27e0b7d1630899b62a33ca8c3efaa3fd697a7a1fc9d717ee45de076b7e09ba8bd1f490ba3e5580999633b86c6d1d99dffe5966f24848b7b350528a9b68ed1f05dcd88ec429cef179a7f09c414aab84ae474e6fc71d6dae1eebad5c6f571e6fcd9e7b5efa69deb7df4d3a6fa6f6f1f6f76dbefd738d3a737d1a6b7f5e7dfdb479e7f4779d1ed77e9d7db6b4d356b57f46bad7dd5f7da71d738d1b6faf3adb771d77defbdf5f3d79cd78e1c7fcdfdf1de9a6f76bdddc69ae387b56f66f5df877ae1febdf75f75e367f6d5bdb47fc7b8d7beb66baeb47fde39eb8e9de5b6f4d1cf786b7ddae5af776bb6b7f3877de387f87dcd3cdbddb8df9efb7f4e75d9af1e7f4f1de9bebc6f57b4ddaedce1f6f9df5d5cdf9d777b8df5e1ee35efa73be5b79dd3b6fb69ddbdd3ddf9dfadbde386dd75cd3c69be3879be9a79cf3dddce9dd3ceb7eb8e9f7bd6b5d746da73d7b46f4e39f35e1af7dd9ff7cd1bebbe75ef679eef4ebad5b6fddf97f5db87fd6f4df96dad5ce1ed37ef5dfae38d1cf1be7575ae1fdfcd9eeb47767f8e7af7df5a6b7e77f7a75d6b97fb739738e3de74e7be7a6fa73cd1e779d7df1eef9e1c6b4f7ae1bdbde3d71ae9df5bf3deb7f39eb8f7a75cd7a7f5d5ae38e3de3d73c6b9efdf1ce5e69b7b7d1adba734db86bc7de777e9bf346b8e1af35e3ce9e6b6d74d75e79e3cf5ae1d73df37e366b9df9dbde3bf5d6f8f1d7db7f76f86bd7bce1defcd79db5e7971adfd69ce77ef4e77dfbdb5df6efa7367bcef76b8f74ddb7b76ded77ef7ef47776bc7f47ba736efdf36d9b6fbd776f579cd5b6fc6bbdf8f75e347f5f1bf34d76df5f38ddce78f3d6fadbb7787b8e38f5bddfd36f5b736e9ef77ef4e5c6b47f7edddfcf5c7f77b56f6dbcddfdba7dd75e6fbd5df3ce797ddd787dcddedb4d1bd3df5ed76776d1ee5fd386b87b6edef7ae75d5f6fb6da69ee776b7df7d3c7f96b7e7be9bd7aefcf34d377dc7db6b9f5ee79d7c6fce79d376dbe9addff1a7fcd9a75cdbde3af79d37e1e7b8d5fe1ce1fd7b7b5eda777d9be9b7f9ef5ef7dfcf5fe3c7baeb6f5bdf87b9f74d1ceddf36e79777e37e9df3ae1be76775f747dee7bd1de3573d75cd7be9ed5def67bbeb6f5ee9d6b6d7a7b679bdfb7b971ddf66b8efcefc6f8f34e9b6deefbf5b736ebb71d7fb7b4eb87367747deddd7fbf1a6ddd5e6df79fdf6edddde7ddf3cd357f5f797dc6dbedad3871d6b7e9aefde7dd766b5d757b76fae5fedfe1ef5edf869de1af78e1ee1cd79d5c6faef8e3cd7bf7c79ad9c69fe7775e77bd7677773bd35d346b4e5fdf7f7be76ebad9ef77f75f1ed9cddd7356f9d9fe3ce3cefc6f6dbbf7969ad5a7bde7bdf7d1ce9f7fd69febcf7dd79d9ae78e1d7dce39f79f7b79be3cdfbdf9d35d35ef871ed1a7dcf1be377db6dad79e37f3df376bae5cf5a6b86badbae3c75d7b5f3471f6f8efd77bf1af5df1d7777dbd7d7fb7fad1deddd34d347bcdb7e3ddfcdbde9a6b47f56fc6b769ef5e7fc71ee1fef4df5db7f5af3ceddf5a77d6dbeb6f35f3b6b7e357fa6bcefaedbdf9d9eddbddbd7a6de79fefaf5de74d5ed1f735d5c7bdf3b777e9d7b5f3ae5bd7c7b86bdf3a7777756dbefdd9d6ddd9e6dbd3af5cef4dfbd357f5eb67b8f35f79737dbdd3869de79e5c735d7af5fd7bedfdb7ebcddf73cf1cdf5f5df7b6b9f1fd9ef5cf77e1af7c6fd75ee9b71cf7dedf7f5d5b7347b7dbce3cedc7f4e1bdfaf5de37e36e9fd7bd1d7b77f46baebb79ee5bdb9d9dd797dedb7eda79be37dbddb479e7b971bef4f3de3c7bdf377377f97747f471d7fb7b67fd776ddb79beb769df39e9ed5cebadf771be7679cdf5ebdef7d77e3bd5fd757ba6f8d1adde7dd69c69d6bc69c7b9f7b77479ad1bf7c7b4edfdf971a776ef5e5e7f4d1d6bde776f46fcdf971e77571e71cdb87f86dcddc77c79bddbefcf387bbd9dd3aef8efc77af5d7fce7ce7df767fc7f7f1ce3d75b79df5de39e7d6f7d7be3bdfa6b8e9b79b7fd75d6b9f7beb87b9775f1ad9eeb7e1bdb66f8d7575e75ad1ae397db6b9d38ddcf1aefcd1febadfde7ddbd69df79e5dd5ceb6f766f46fbd7a71b6dee74e75f356b677d7f4e5fd37ddb7f7d39edf7b87dd7dcd76e37e75778f5e71addfef4e9aeb8e1cd7a7f7f5debaef6d5edfce1a69ce5f7b6f75e38e7769c75d79ef1adfde756db7df79d69a7dee3ad9d7fdebae35f37e1af386bad7d7f66bbd7ce5deb96ddd9d7f5d5ef5cd1d6f9d5be9ee3969ad776f4f7bd3673b6baf74d5def76bc778e7b77dd9cd9cf1b", - "signature": "0xa58903ac1ee94405f800a22538d3043b91c398f5aca01fa7e4f43510da9371d0fbba371e7cdd43b20648087733e3f9b90e6dcd42b716b580176920f3a433c9a9e2fcec63ab94622f639d556383c21c600d822c641498b765186530b901776d91", + "shares": "0x00c0817f81709352cf1e57a7e125aa83402aaf708eea8046d16ae35c27ed0038f0a39cc46cf91c99157a1792a439b065fce894da28ce786435658cda7abc79197f35055e3e69240747ffb8f2e1a7c1fbef8899ad52b5712bd13c4dc3f07de0297c0085556c139ff909077f92591105efc928dc3a8c383ef0e53f820bbfbed00182ab82405d5038504266f30e74d7c7a5bf1990d172a723e3b066400a1388cacbb924c4b9c74848f4a0811006b8ed52bbd92a00018abe3147730a19335c3da51c9813e9ae3c79be5df1e6dfe76e5fd5adbaf3777871df5f7f47ddd39f366db6b6db8d9ce3bf397f4ef979e6de75bdf67b8f1c69fd797dce7be1e7fdd347b4dbad5d71fdf7d9de7df3ad1dd78f3777579bd7679ad9deb5778ddee9b774e5df79f7c79be7cefd7f7d39edf6b7edddb7d7969eefc7daddcd5ad3ae76e9e7f5df979e6fc6f775fe37f5ce39e39f1cf1ff7cf3579c71cd5eef771cefd71de78f7cf5de38e38f76d1bf78d356b8f7577a6dcd5ee1c71ff3ddfaef66fd77b69ad1a6dcef66dfd7adb6f766f5e1de3c71e7f4d9bdf9e7a7bd7fcf1b71cf1d79ee5addae1d777e1bd5ddf5d3be3673d75c7bcedbddbe1fe1d75a79febce9c7f4e37f38e7969c69df78d7a774d34df6ef7f7b7da7767f9e9d69a69dddf7747da7767f9d75d5e77c6b9f77edfddaf75dfde9ad9defc71d7b7eded3aeda69bd7dd9ad5ee3cd1eddfd1deb479bdb9d1addfdf9e1f75a73df5cd7bf3969fe3adfa7b9db471cdb6d9fe5deb9e74f347fd7bb73469def77f9dfb73cd356f7f5bdfb6dc7f5e9e7b46f56dfd7ce3779be78e767757b87dbe3477d6f9dba7747747b6eb473de3ae9a6b779b7fcf5eef7dde7ba6fd6dee747b7e9bdde7b6d9a6f873defd6b975b79ae5df7beb6edfdb4d5f7b4eb86bbe7ae76e9af36f7cd776dbdb8eb469df1cd1ad3b6b479ae3bdb7d7ae3dd9cf3ae7a7bddf7e74d3d7b971be1ed1d69dd5a6bb6da6b7efa7bcdf46dee34e9fe74d9ce1ff767b67b6e1fd5d7b8d3ad3be34f5b79febce3be9edb7ef4d77e7ce7575ef36e9ddf679fe5d7fc6b575e7fbede6dddbd6f5e5feb66dde7de1a7fcd1f73bdb473ddf5efc7b7f77eb769ad7cf5cf36d9e7f475b6ddf37e36ebdd9c7da734db573b6fcd1ff1b69ddf6ebbd3c7746b875fede7dbedceb5f35f3c7f97bcd9aeb6d9c7767b875fef7f3c7bd6bbe3d7f86fb6dd775f3b69b7bb71fd5ed5bf1cef6f1c7356de79be5bd5e7bc69aefc7f6e5dd74d77ebce39f75ef7db86db7dd75bd1c7dfdb47dfd5af1feb5775e5e71bf1cdbbe9de1beb7d786fcef675f7bce5bd7d69c7dbe347daebadf8db96f5ddfe76d5f7dfddbd35e7be9edb9db9ef5dde6fcedfdf87756fdf7575f71fd5f69dd9ef1b6b777ae9ad3df3dd7969cebbebaefd7b47bdd9a6b5df6d9ae1bebb73dd5ddbae78edbebbddadf7f376bce5bd386b7dfc7f67746f9dfb79f7fde3be1e77871edddf35e796de7fae9bd78d74db96ddd9ed1dd9af5ddbd79cdb8f1f69b739f1de1ad5dedd7b471af7669ad9feb76ba79fdfbe5b6dd7ddf35d5cf5befaf79e3c7377dee79d79ddde37f78d35f1fe1d75ad3af78e79dda6dde1fdb57f471df3a7f8edae397bc777f7ddf6e36eb9e5ed5bdbd7fcd74f347f7e5d6dcd7471ae9bf1d7757366dff3d776efd7b6edf6b8e7a75a6b5db6e76d35d1ae1bd9df7971f6bae7969bf7af357fdedbef771f75e7b873aef9ebb71cedbf5aefc6bb79ce1e7faf1b6f9e1c776e5bdfb7dadb979eef871fe1fdb571f7dce1e77773c6b66fbf7a7baf5b776ebdf3877ce3bd3c7f8dde73ddf8d3c6bb79e75a69d71fdf6db4779dfb6f5d39e7a7b569b738e76ebd774f78f1e6daf1ff5feb97b77db6f7779d35774f7ce356dbefc77a6fad9d7f6d7c7f5d5fd9a73b6dfefc738f1a6dc7f87f7ddf776e5fef8eb6736f3477571cdfb6f679ff37e9dd1f6bce3b6dbf1e69cd387f869e777778ef6ddfdfae1aebcf38d7d71e6de6bdf5fd5feddf5c71a7b8f3be746dceb969ce3dd756b469d73971d7b67fddfce1f779dfdf5ff5bd9b7f4ebde37d746fdd7dd1fe3ce9eef76b76b5db973869f79ae1d776f5ce7869eef8779e7c69c75c774f35ddfe397747b5f35db8f1fe38d1fd34f77d7dd38d5ee1aebadf9e3befc6b76badb7eb67396faf1af78e7aededf9edb6ba6dae5fe5ee37df6d5ee9be1ed77ef979ad7771e777efbdf5f1eedbefaf5fdde69f77b75e7f5ef469edbddf6efc7dd6faf7af7471ce9adfdd1cf7ce1ee1af786f669eeb76def357bad7775de39d77ddd69ceb9edd7b769ce5cedd6f8d5ff1ddf569f6dbe5fe1bf1de35dda7b6f7aefd6da7faef9e1af5e69ed78f777b4d1cd1ce78e5edfcef7d38e3c69fedcddc71cf347fdd1dd3977471ad5a7f571d75cd7cdb5f776f579ee9ef5f69d7bc7deeb8d9b7dcf39e5cd77", + "cluster": { + "validatorCount": 0, + "networkFeeIndex": 0, + "index": 0, + "balance": 0, + "active": false + }, + "signature": "0xb44570059680e4397e8f278c872d0e0d05e53cccebf8acdd36fbda7c4ec4fecb89b4527f5a51ec9f05a66a56d85b413114a785dffd8847cd3aab2c2a1c401fff80a783c9d55fe2341c4aed6e2cce10074f58db382fb205db56a950ebe69d3e7b", "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" }, - "1684342203258": { - "depositDataRoot": "0x1ab76776a6fdfe0e44af5cac6e51bb4b59ed4b8cc80407aec7d9c2424e8c7daa", - "publicKey": "0xa5c0886cc57bc1514f9565f93f7c880efefd519b0f15eb6e33b8a7de862c460e59435f327ae30817fe79e1d5fca3931e", + "1684357854098": { + "depositDataRoot": "0x84dc9f76f32c0911b9be490d35a0544e297c5e3b2b1a7ac2e2f43bbbfab4f8a1", + "publicKey": "0xb8775dfa2e6247097b2e78b0f33df1576fba9bfe16af946820ac9b7fe1b5fe86d051d1703888e1925d0ed29926358940", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c0a3008afd7ea04548c203e558a8166346f3473a909145b75c83604230ff726dca38b2b8cc7aa603867eb04cf5eb7e0173929dffe0ed59d88b0594c9c26c5383b032e33d1edd1ad1f1ce288c4df2d351378fa2a97384c705c56f1127d6b0a9ce83b778b4bc4a8e82ad61196679bfcad51d83a5b1eed3454ada98a652634c82da8277202fe898daf632a628317c0614bcab81ed8906d57b1979bbbe0e13e04c9b5730579bddfbc2a902a8214e6733f4f98ed5523d4962eae55612827f5eb128c9a1db5e76dba774d77d7af38f5a75ddf4d74d786f9d1bf7b69a7f6f7cd3777bf5deb971df5dd9defc7faf1cef9e386fd75edf5779f1ed5eef7774d787756f7f7d71cd37f35f35e1bdbcebb6def5ad9b6dae7bddc6f5e5aefaef9eb579d774d3575bdb779ae9a77775df5ddfbedbd76f7675de34d9cef67bbd9fe797b6f7877beded7ae38df9e5d79bdbadfb6b5df47fc69ad776bcdb47f8dbdebad1b735f77734d7679bd78d3b69bf1a7bad7cf7bd5a6f5d3a75e77dedfdfcebbe9dd1cd7dd35f76d3ce5e7f879adb8d1dd37e9ae7bf77f5eebbe9edf5f1d6b56b579c7b5777d1be37ef6d1f7bd73def4db56b66f6df7d39f1fefbd5d739db5f7d7b475ae3469eebae7df5bd9eddbd76e5f7f76f975d71f73d6f97b7d77f1ed7ae1ed3a6b67f6f7af34d9eef5f7cdb9d5a73875f7f4ddce78d5cf5ddf7df8f74e1ce7ce36d76f35df8e5eef7dded1f6f5d5ceb6e76e3dd367f4e39e35dfaf1ad77f5cf37e9cd3d776735d9c738d9d73679ff756f5ef9dbbe7bf7ae5d7b87b9f3ce787da77b6fc6b7ef96f669f7f5eb5d1b6dc77c7f4d1a738e1de1ae76d3cd9e7b4d7bf5a7bb75d71ee37e7975b71cf5b6b7d38ebdd34d1ddfcd3bd9ed7dd39e9c6f5d796f46ddf36d3d7f8edbe1de1e73575ed76d9dd7979bd77efc6dcf1c7b7df86f47de739e7c75cf347de7f4e9ce7be1e73879a6ddddb7bbdda79fe3cedbede7f56f6ddcd5ddf8eb5e5addddbd73bf7671f69ae356fcf1eeb6e1fdb675ae5fdb56f4738ddedba75b6fcef4d1e7ddd1b6f469af367bb77875ed1c73ad1ef74735e1b7fbe5defbd5b79b7bddf6d396bad37dbbd5be1ad75e9fd36f5f77bf5ce5c6db6fad7a6b5e7571bf38f78eb8f38efbe75e1ce3af3475e774eba75c7bdf1aefad7bd5e7b5eb9dfbedddbddfd6bbe3bef569a774f7a6b6ddee3a6dcd3a775ef96da7f9f367f5dbbf1a6dad9fe5e69c75fd1df3b6ddf75e5e7b5737e1ee3475df1ddf77b4d5b71af5de5bd1ad7dd9edf6e1c73be7bd5aef9f357f4734e7dd1c69de9e774f1fedbd9fd39e7de75f1edf8eb8dfc7f86fbd9bedc77573b6f7d9ceb7e7de9d73ad1af35f5a778e7bebdf7bdf9e1f7346dd79c777d1fe39dbaf1f75cf7c6bad3cd1ee9befc6dbf1fd7def9e7a7bdd747b9d5fd35df9d74df977dddff7571de74dfc6baf77d35f3be1de9ff1b7dd7fad346f8e5cf1f7ded3aeb6d1ad9eeb8f1fe9e6f9d5ad5ed9ef3771d6f5db97dee77f3c7b5f3de3873bd5e7dfd386f871f77cd1f6ba6b5f5f7b8d9ce35f38ef4f1dd1f69e738db977b6ded9a7f7d1e6dcd1fe5d7b5d3de377fd739f1d79edfbd5e79bedee7573adb76bde7de5e7776dedf9e78f77e1ed34d39df5d9aedb6f4d7aeb56b4ebbe9dddad35f5cdf4f77d3675e7de7b6ddc6b9ddd77b77775ad35edddf86f5f7a6fce7b73479ce5ef5cf1cf77f1a6b8e35efaf1e7f56bae36e3b71ce1debbe5b7b8f5d7dde9ee9af1fef8d77f1df7aeddddfeb47396fc6f8d7ce5fd36f3cf35e36e9ef3a6fde7c71adbad34d1de35776e7adb8d7def66b7f3b6dee9f6de6bad5fd9b69adfcf74eb8d5ee5bdf5df579e739e7be5c69e73be1f7b9774f3a734eb5ddf7bd778f37eda735f357bdebde75eb671d79ff5ff5edb5f3dd7ad5cd79e396f8f1cedcededf6f1cf5c75f7bcd3de35d9f736ef7db7e7c7dde76e79e7d79a7b7f77dfbef97bbf3a7f6df4e356bae757b8e747767b87bde1ddf7f7a6f4f3d77ae5bf38d5f7b47b5e1f7f7e9f6f6d9cdb66f86f86fbdbb77ce3bd1fe37e3ddb9d9de78d36f397f7efc6fdf5ef1df7c79f79de9cd5cd76dbb6b873c7b6ebd735d3ae5b7b7f787dfddcf75ef96f7d5bddef3bf77db76b8e1d6dd73cf1f774e7a6f7f1ce1debb7dff5bdbbdfb73cf1b79c6fd6de71c7b96baefdddfefbdbdf76df4d3971b7f9eb5e3de7dd776df738e1ae34d78efddb56fbf5c7bbf7ad9ad9fd76dde6dc6fcedff7971a776d34d7ad39d7be377def7def4f1cf7af3c6b969deb8db4f1f7b7ef5e34edad5fd3a774e79e35d1b7b775ddbdedc7f76bde7bdb8f5aef47db734f7671ff36e3875f69fdb67b96bdd1cdf6d3bdb4e7ce9fe9b6dddb4ef8ddff37eb5e5ae5df7bd1ae5ed39e7c6f66dbe9bdfad78ef5e5ef377fbe5fd366df6b4e5ee5edbcf1df7d6bcd5cd5df5a6b5", - "signature": "0x9424a19ca8e1a7283f924470cd25aa7ae4a543218742ce08b155c77d24aa825f138c39af87a625d109e794ea4b66a91016c54a122f015508dc100a1662b8af88c5e40a4bac9be8da37723ed2d9c5b00329cda02e8e69895beb4536446ab072c8", + "shares": "0x00c09226b242dd4a336f8a42779b5b5f4464c0715f69e5c1b874ed8f8fd9f9406e04862187d6e6f038b1e14085254f59a42f81f029164a1c0a1ddb4c9f02ab9ad7bca8d15ef3b067fbed0afa97a4ea4aab96325daf3d1fde415ec0a2782e9537a382908a4833986209aa13dd74dc5a5de80c1e7765da9c48970117dbf66342c4e2aa1a7740cfd53334d663691a497470979388310aaf111c758b2cf5c07d3d9b47cad4c853d7ebac3405f9c102023f3bcb3d440d85cf5e8d2995453152dee8fce69bdb7ddeedb69cebcdfaddcf1fef67fb6f87bde9ae9cdfd776d1a77b6f8d9b69cdfc777f1fe787dbd9c77569fef6d396dd779df5dba6b8db5ddae9eeb7ebaf1ce3dedbddb6df6dfd38d9e7376b9d3775eddbd3b79a7357bcf766b5776f76eb977775b7f6d5a69dd5cf377ded7979ae5f79d6daf79f7c7bbf39ef6e77f3a79c7bd7f66fd7f9d7ad5af5bd9f79d75bd9a73cddedbad1fe5a75eddef36d1ed5de79dbbd1b73ceb577979ae7d69c79c6bb7b9e5deba7fb6b877c6dce35f7879fdb8f36f1fd1ed397bbdb4e9f69ff347bad376dceb8e5eedf7de6bd6f9ebc69edb875d71fdfde7cedef1e6b87fbe35d9fef87f4dfd7b7779d9f6bbdf6edcf7cd766fa737db5f39eb9ef86f7d5f77bf77d1cf34e9cf38eddd7ce78f7b734eb7e7871ed5bf3c7dcd3ae1bd1c7bb7fcdf9739d74d79f1e6bcf3677677779be3b79fd5f774efa73b71b77c7fddb4f7a7b6e5bdb67dc7386b9d1c7f86dce3be5c7bdddd6f9e766f671c77669feb9d397bae1befbf5a7b8e7aef9e74dba79ee7ad9ed5cddc75fd1aef66b57b7efbddd6b6e35dbadba7dee77f36efbd5e69d7da736d9af787bbdf5f38edad1c775d9beb877c75b7dc77cf347bd75d6f9db9db7e9fdbaedef1d71ed77db5f3c7dd79ce74d3befbdb8ef5f7b774f3ae77e9c6fd7dbe39eddd37e38ef67b9e3ad797bd69ff7a777db4ebaf1eef7777edf7f7f1bf75ef56ded3d7f471bebddb8f387f66dc75b7dcefad9bdbc69bf5be9e6dfe5df1fe3c79bd387ddd5e7df71bf77f7d778d1d79a7dc75cddbd1ef3d79ef5d7f57faf767b76bdf7ad77f386b8e1bf5e71eedc7f7d1bf79f37df5efbe7a7bcf77d34e39dde7bcd766f9e9d7f8d9c6b4eb46daeb4775f1e7b67b5edddf47dadddf1f7fbd3ce9ae3ddfa77dd39e1fdb5d34d7669c6dd7b76df7f771df37ebae5de3ae9def5db5f1cd5cd38edc6f56b7e357dfdfceba7b66b8efae79eda71d776f5d6dfe76f5ae38ebbf7b71ad78ef6d1fef46db7f8eb96fadde73b7776b7d3475ce3dd79edc75c69a6f871dddc77579adf9f1cdbcf39e7cdfb79b7fcd9fdb471df397ded5ef796bb7dcd5bdb9f5e77b75adbad757b8e9fe7871cebbeb6e3defaddaeded7877adb9e3dd7bf79f5fef77fa7b6efdd9f77cd1fd5b6f8dfcddf69a7f86fbef67dd737778f1d7dbe5be1de5ce1b79ff3c79cd1ad767346bd73adbb6b5eb6ef57bbdde6de77aebb7bb6f879eefaef57baf38e5ce1deb5df569bd1d75eef7dfa7fb71cedfd5bf746f975bd77f1ce9f77769a6bcd357bc734d7cd1af7df757f877a7fbd9cf5c6dd6deededf9dfd6ddd7dd9defd7b47346b7e386ded7de5de9be797bbedef1ddf8e5b6de6b56dff5df5dd74f7b7dcf1b75ed5e73dd1dd7ddb4d5be1b6f4ef7dfb6bbebc734f78d5ae5ee3bf5cf1fdbbf7b7dbebaedad3dd777f6d5fefb71e6fd7df7bde3cdf67f6e76ef7e37f1ce357f579c7dad78eb5edfd34e3def9dfa73871ce5bdfadb8d79d3d69ce79f3ce3dd7bd1b6fbd3873ae9f75edbb73cdbaf7d6bc6bbd787377b8d36e79eb8f7cebd6b4d37edae5dd5ff5e7fbddb69ae9bef8dbbdb97bae3af1ad7ae9ed7cef8d3c7dadb871edbcef8ede7796f479b7bdd75d1bd37d9eebd6b7d3cf3cef5e5fefb69d7fad35df8736ebd79be5ce37e5cf5c6bdeda69a75eeba6b4eddd9be1eef56f86b4e9cd77ebbebb7f6d9e7bce5d6b7dfc79ed1bd9bd787b573de9af7dd3bf37e9bf5e776736ddae5c7b7e3c75ee38eb8d9ee77e3d6fbdf5d3473b778f1de5fe5ad5df5e79ad9edba7f46b771a6bce7a7fcedaf1a7de6da7bce7bf1cdfdd9f7b675ae396fbe9bdf479bd3af5b6b5db773bd5a71aedc69a7f475c79aedd7347b5f7ce1b77bd357b67fad346f5e5b6b777d7f6efce36df4ef5f5ee3b7757faf1edfaf7a6dddb9e5f71fe3a6b97bbe3877cd37efa73af7cd9c6b8df9e1d6f679f6dfe5ae3dedef3df7b7b9e3be9ef3971ad3cf1b77b7bb79ae9df5edf4f1adfcf78f357de7fde7bf1b79bd346dfeb6efd7fce3cd74edef7cefaebb75f6df73cd76d7b735e78eb7e7dd39d5ce3ad1e69b69df356dc735ef5eba77977bebae9fd79ef9edfd9c7bae5a7b869e7f4e1f77871af3aebb737d1d7bce38d9f75ef3aebaf377397dd7db73971cd766dde3cd746f67baf7973875b", + "cluster": { + "validatorCount": 0, + "networkFeeIndex": 0, + "index": 0, + "balance": 0, + "active": false + }, + "signature": "0xa039a78ab2b030fd9a9486b95f268e9bf4c29a7cf17d5778bde89cccb85ad1dcf5e7f4284d8dc9ef47b731d684a5d4bc134e0570a2a40a6cc97148992b5c49cf810b3a59094ea6f071a308ddaae644bd8954ff0d57eea5a2ab5a3755007267ba", + "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + }, + "1684357867142": { + "depositDataRoot": "0xa3210c38e6081a61b91403d08242496fbfe178b0dc8c0710fd66554de0bcf7c9", + "publicKey": "0x94da8cd062b0138ac7ad33959902add168cc82a84a74f9f6c36ad4deb2fcc916259f0f55aba6f975ffdf726e0674cce3", + "operatorIds": [ + 1, + 2, + 3, + 4 + ], + "shares": "0x00c087a63d79ed00d008cfd376a2dfcbb96cc80984d4e68539b58d0023f454396fd06caac537a871aa7d88dc7048a9fea6e9965a046de877c2cba8853867fdae1c22b1bdf621f9b6391dd8a4d1a597ffac0be79c7309885831554869ec7b8fc6e5e7a0356f461cd83ff19665f66f884c7381269fbacb0344988d483e670b95c2629799cddd3d7137245b30d00a3b18b745ab8907bcd3354635e463bb24fcbb10677aac5a227277c4e4ebe31767ec4e043ca43ff6dd761d4bcecdabab9557c6c2e390ef4d3beb5f38dddef879ed5aef67fb7b66f67f8f5dd7b79af1ad7671e6bce3c7baf1fe38d5bf1f79d6dbeb86fdd35d5be1adb575ae7af1fdf9e9cdbad1ed5c7deefa79bdf57bb73b7bdeb769b71bf347f7f37edad3773d7b9db7f5aedfe1be1adde77b6f5d1bef6ef9f7a7f5738e5cdfbf35f5dddb6ba7dcd77f74efbd78d756f9e7a69af5dd35eb4f787bae7777973d6dbd77f5bf5d6f7f78f7a6bce9cf3d7bbdbad367bc77adf4d3c7f9ebdefde79e37e346bcedd7b4ef47bb7fad1e7df7ba69a7766ddef9f1e7b573a7fbd7aede7b4f3ad5e7ba79b77c6b775c75edf97f9eb87da69df76f5e69c6fc6dc79ae5ddbde1cd5fef777a77573d69bdb97f97b7d78d7475c7daf3ce3bdfcf3def6f7b6b7d1ff796b97bdd9dedd6ddd9ef36d3af75f34d5b7bb6f67dcefd7fb6b7e3a79ff37d7d6ded1e7fdd1f7f5eb8ef7e3aefbd9f7ded1cd75f5f75f77577deb771cf5ae5fd1b69e77d7777b471ff75f3ceb6dbde367dc6b86b7d9a6f8dfde34e5d69f75ff74d397b47bbd3cd366f9f1fd757346fcdf66f569de5dd9bf1b75f75ddf679fd9be7bf3a71b7fdd1e75be1dd3471bd1fd5d6f6d74d7c6f5ebaf7579a69f6baf34db86b5efb6b8d74f78f78ebb73a7b9e36e1e79bebae3c7dc7fbddb69de5dd7dd37f7de1b7dadf57bd77bd3cd1c7b673cd78ef9e79ddf6bad1df7cf35e1bd9c73d73d6b8f3cd39d3c6b669d7dc77d6b9f3c71ef38d1d6b96b9e3bf5febddb9d7cd7de5fe1a7fd6b8e7873bdbcdb47dbef5efdddce37ef7f1aeb4f3ad3ae3de37e757756dbef4d9fe1af3bd7a73bebbe1eedde7adbaddd7fd6faf1ee7b6f9e3cdf47b6d9ce35f1ce7cedbd1c79ae7779f69d7db7fb6b879be1b7dc7b7d78e75735ef4f74d3cef8d76ebd7dcd3a69fe5eef7ebb7de7b96fad3bf757f9e75f3dd34ef7f5f71fe79d39dde69eede778ebc7f4df46fddfdd5e77a79b6fde5f7f6d7cd78db6d1ed3d77ceb7f7b6dcedfe75f1e73a7b9efc71de39f5cf1ad9d75e75dd7ddb6e1e6b7ddcf7671ee5e69bd1af3a6b477969ad34d1ee3adbdebd73bdb469deddeb7d7ae5ddb8eb7d1cd7adf6f37f3a7dde7cf7d6f9e777fcd3c77deb8db9f1b79ce1be9ce366f7f79738e756fa7dbef77deeb4d3571a6ddd5ceb771aeb675fd79f5e79d6bb776eddd78d1ddbc774d9c7b7f74ef4d3579a75ff5f71b75feddef8f3d69f6f8ef8e5a73c7ba6db6f5ebdef9734f7c71fdfd6bc71aefbdda6b7778edcf1cef8e396dee79db9eb469ad1c71bd74eb4db7d1ee777deedc7747766b679ee1fd7de3cf3ddbc6de734dbcd78736ebd6f7774e39d3ceda7fb7b9ebbe74f5e6f8f786db6fc7dfe35d7ad5fef6e3a75af7673addef5be1b6b777bd1af1fe78f5edf7edbe3ddf675ed9a6f4dde777737d1bf357bd737e1b6bc6f86fadf7d36db5dfce9fe5debbf7c738f5fd9cdf76f4e37ef9f3b739d76d77ddcf5ddf87f8d1cef5f1cedb79a69e7fdef7e7af76f75e9e69ef3c6f96dcf38d34dbd77569ed7477675ad1bd39d5d6de79fef479c6b9d5a7fd79a7b9f3d7f4e3ad1fefd6de6b4f756b7d9fe7d6b479aebad5fe76737f5ce5fe9d7f47f9f5e6ba75fe76db9d1b7387fae7bef7ef6ebd7dddf5f5fd9fdf4eb775beb77b679ce37dbd77b7fdefaf78735ef86bc6f7f776f9e3575d7dbeda7fde3c6f9e3b73bf5b79f6db77bd1af76f3ae9ad79e7ad38dbdd7a777e37ef66f86f46daf7be36f3bddae7d69c7b86fbede6dbd3d6fde35d3bf7b7b47f6edae9ed9fd3b6bc6fa73a6bbd7ad9fef57b86b67df69f7fa75a7b8df77dc7747bdf1a779e38ef6db96b7d78dddd1d6dad9c75debdedef5f6b4d397f6d5aefce39e5fdfa6bc73c7b76fbe5c7de6b677bdfb6f4f76eb6f1c7dad5ce3bd1eeb47bdeb7f3d6f577bd3bef87b4d5c79fe7cd7cf76735f5de7775aedae3b7dbf1f7bbe37dbbdb9d5de9d6bc77ae7ae7b73bd1e6dbdfb6bcdf573bdfaf5ef5b77b735e7c736df67bdf1cd76d386b5778f7a71f69e79bf1fe1c7f46b5e767bae5a77d7f9f74e9ee34f7b739f1ed35f1e6bbdbaf3b734d9fddcdb67bdf39eb76f57b8d5feddf77f3de9feb57fa7f571b7386f46fbddadfb6f9f7a73969be3df1b6bce1aeb57756b9ebb6f8e1a7fadb6ef9737d7bdbd6dc71ed1bd9dd1bf7deb9d3c7f56faefc", + "cluster": { + "validatorCount": 0, + "networkFeeIndex": 0, + "index": 0, + "balance": 0, + "active": false + }, + "signature": "0xa1bd04fdeb5fdf27db1649f8ae12a932e38353523eba695adaa3612db59472792aeb309bb91e2862f89eb4c707aa565e19d9cb4db73bdb8155074c4d7d726da08ca05bc2ea06df4fb1ae5a81108a891e7d232a6f710bb24280401d79a744a7b4", + "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + }, + "1684357880194": { + "depositDataRoot": "0xbbcd876c2748a255905093858276c9d64cb678bd499d8f3769560ccb9ed5d783", + "publicKey": "0x98f5be29757f3f5d032e8bb09818c4b9206a88a62f246865b2fa297ba234c835c48609e821649dc70f166199e8a292b0", + "operatorIds": [ + 1, + 2, + 3, + 4 + ], + "shares": "0x00c099dacd9f678314dc9f5ad0fa26cabcf0276c111517f58b510407200aa8e9e7b79e573e7a8378cb59378a1c88a46ef4eab00d55a998612b92d8b75bf6f004424093469d17f091c3ff7b1cddc37673a76c302d346a9ea27b3475b11982bccc0e81b738400b0b575e503da66e365d5beec0f09e2b74e484c1c5eea7d318af143b15154725570c686cd7924240638e22cc57b77c3d86e275a572816b38e1efa3c7adf1d0bec4b201c4bb3b51457bdd671cb928432e84010e25ecf26a484b3dac90b6d5edde79cefdebd77adbddde6f7ef97f86f6f1aedef7dd5f6bddbadbcdbb7dcf1aef8f386b67f7d1df396f669ce3ce1de1adb7ddff75e9a7fb6b7e34efa6fddfaf1cf5e6b67dcf7577dd9aedef78e3cf36dfbf7c77bf5eefbe5d7bad9ee9b73dd1e6f4d9ae35d1dddfe7c7bdf7ae7ddfcddd6bbebbd9bd1fdf9f76f3cd7c7fbf1be1b79ddfcd3aeb5dddd1ee9f7fc75ceb977671adb9df46ddf7a77b79be1ad38f5fe76f5de9bd5af3cd3bd1fd3469bd9fe37d767ba774db87f4e787de73473debad1df78eb5dbdedceb579a79c7fb7767fce7869ddb4d7d77479b738e3d77bddc7f775bdbaeded5cf7bf7675bf1af367bd6b6ef4778e3975b7bae3de9de78df97bcf79df6f1e7ddef7d5adfadfd7f67bd75de74e1dedbd9de1d75fe74ddaeba73d69e75bd75dbcd3bd78f1d69cf3d6de6b47b46fbf77f78e3de35dbcd9fe5ae7af7cf5e6df7f9dbb73575e6f56ddf3ae9dedcd37f796b5db47bae5cf3c7dfdb86fa7bbd79d3b69af3df36e1b7f869eeb879fd3bd3ad5ed3de9b73d7b9f7be78ef969a7fb77d7b9e3ad5dedc7b4f5fe1bef8ddb6de6b5f1aeb7e3adbb6f7dde6b473adbd7fd7bb6fcd3cd1dd1ef76f5f7b7d7471dd7ce35e7bdfad74e7de7cf1ed797f46f46df6b7f5cf7a6fa69e7fdd3b7346daf5de5befd69ce1c75aebc7b877dd3ae9feb5d5b7f569ed9ae1fe5d6bbe3b7f9e9de766b6f7a69fef6e1ce74e5de9febbe756fd77defad7cdb97bdd7ad7be3cdbc7f4ebbd5c6b8d75e9aef6e9e6fbf3adddd37ef6f766fc739f36e1df1b77471bf3c6ba75fef9dbad9f75a77b75fdfa77ad3c71c774dba6fbf5d7ddf5d7fdd5c77b6f9f35df7ddce1c73579f7787ba774db8d79efd75ce767bc7f77fddb9ebdd5addf7bbebad7ce77e9e75a79ae75eb76b8f5fd9deb8d9fe9df5cd9fe5f71cd5fdb9d5bef969edf8d79ebb77c7b56b7f3adb7ebbe1ddfbdbceb8eb8e9cd1ff1ed3de34e7577569addd7b4d38e5d69a79ae9c6f66f86bb6f975fdf96da73b75ad357de7fce1dedbd75d747396b7eb56f8db9d1ce3c7bc7b7eb8d3def7d9cd5fdba6df77c71d776f74776e3bd9fd9ed1eef7edfd9fdfa779d1ddb9f5ae1e7376fd69e7bbefcedfddc6b6e776f4f77ebad7ad7973c77d7fbdbd75c7dbe9e75de5ce1f6dfe9df5c6dd79cdf7eb56de739f5e7b7f38f5debbe9e77b6f96fa79fdbaf1aedbddde77779e746dee1b6fbdb9e7af3bf38df7edb6f46b8e9a77cdb6d35e5ad74f7675f6b5edbe9e7746da6bbf38d3b73675def5e9dddb6f4e1cf777bbe7dddadfbe3d7b6dfc776d5c7bc69eeb479feda79a77bef9eb4e34dfcf78f7ad7aedbd5de34f38f35e347dfe7defdf3de5f7b66fadbc75ce797b5eb5d5bdf8d38dbc6db75d6fbe3ce38d9ee3af37d75db4dbb735f3673cdfceb86b5e1a7bd7b67f7d9b79c7f6d35f1b79deba73b69c6f8776efaf3969c734db6d39e3be77f7cd76737f1ee1ad3c7bae5bd7def9779e3be5cef56f5edbddd734739e1b7def3bd37d386b7db8d767376f57bad77ddcdf7e5ff3af7cdb4d1ddfce1dd39db5f5a6b4df8d9cdda69ce377b8f75e37f79e1e73cd9c7fdeb9f7c6dbd7d6bb75ae9cefb7fde1d7347b771c79f71b6dbf3c7ddd9ee1ff1b779dfadf9f1ef7b79fe34738f5cf75df9f1ae36f1e7bd7dde34f1f6badb875dd9b79ce3d75f7fbe396b66f8d5ed3b6dfe7b6b969aef7edcd76ddf7b8d9c6f5e74e5f75e6f8e367b675a7f879d69de5ae7df3c7f4e7ae9c738eb4776d1adb5e36ddc778e1a69d7f86b871bedd79d6bd6f479cdbdf79edaef9ddef7ae5a779d5de3dd76e7cd35f74e39f5ce5bf5a6fddb77dcd5ef356faf1f7bce9ed37e1e7ddefdd3cef8f74f39d5aefad5f77575ad3a6fd77ae75ddf71bd1ddb56dd778e9ee376b775be3b7f4f3d77769b69d7f77b46bc69ee36d9aeb5e1be3471cdb77dc7df6fdf79f1aebdf36f5e6b771bd75ddbd5be9b6bb6f7d37f5ee1f6b8e3ae36ef67daf1a7b56fadb9e9e779d1aef9ebd774f7a69ad1ff5bf5de5feb5f1bf1af7cd3779deb5ebad3975c71bd7ce5fef67fde39e1eefa7f7e7b7b4d9de3a6f77b4d1d6b8e7df3ae34dfd6deebce3477c7baf5fe9bdfc7fbd38d3dd3ce3a7366dcdf6f3ad38db7777f3b77dd1bddbf1d73971d6f5f79d9fd7d6f7dfdd7c7de", + "cluster": { + "validatorCount": 0, + "networkFeeIndex": 0, + "index": 0, + "balance": 0, + "active": false + }, + "signature": "0xaf3f43fee460de02410f7bbe2f3615b0126d88de9d61030901b751a1f76eeb4b842e2d57a346c39d7f6e00c33ba4ba1b0d76a5729238ad61de067ef379c8de0e8019a553d4a9bbd5a0f4392043cee2ea25efc44f3547145ca3b0154ef1601584", + "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + }, + "1684357893150": { + "depositDataRoot": "0x0d632c7f52733ae2941c99ad8f604785de53d30fc7a4da61fbe80441ba4ebc8c", + "publicKey": "0xb113319f6159825ad0ba3ea44a3a9ca6a67a10e122ca4bcfb2b0d63596c6f14fecb43933a4169c14108d98f907672c5c", + "operatorIds": [ + 1, + 2, + 3, + 4 + ], + "shares": "0x00c0a1162ec3924b9c31b87bf3d90f6c11725a59830145c64d2989d73973e9a74b1cfb9e65085621435d06351514dca78b2499ebf8e2ac9c896b5dcf067b6f18d4ace780f0d93f531599c9b2d8710d8bb0190ec5d8caaba56d334b9e361deb552a86a7c6be227fcbae53f2599b69ec4f2a468ef5f4e66270a99762a9ed39f2c46ede6a644f9c7daa85b69f4d080fa67a287d81c168bace70cc2b6cd1cbfc6b35fbe82a8670dfb650a8f4b22df078b37cd15c9339aa154f6ae265ec09e0a8e8f644dbd9ee5ae1cd1de9a7f577ad1bebb6fbdfdd1cf3c69d69a7fbe1aedd69f6bd6b677575c7f4e9ce5d7b56b56bd75ed5fd77e3a69be36e77f3cdb5e347f47376db7dd7f5dfddfbeb97dd7b66f4e7671de5eedd71a6b9db5e79e1ed9eedd77b6bdef66fdeb8e38edc778df67757db776e36f1cdb56fbe1cd9cdded1cef6e9bf38e5ed5af3ae5adf86b8d7c69e79d71c6f87f9e5d79b7f7e1ee9ce78dbcebc6bdf7ad3af5b71b69ddb77dbe9af5dd1a7fd6ddef5775e1c6f4d35d3ddf6d1cd7df776dd775e1fd3ddda6b675c6f6e7ad9a6f669c77b7b675ed9ad787b4d37776d3bf5d7747badbcf777f6f7cdf76b8734e79db7d1de1bd7d7dedb67f67f8ddff5c71b73a79b7ded5c7b66b5dfcd1e75c6dbf1af5ceded37778eb573de1c75bd9a7356b8df8e3be757db7da6df79bdfae3af75d1bdfa79eedde347ba7786f97f971b6dd6bbe5c69addd6dd75af1a7fbf3df7adbad377777f479c69bf3c7dde5dd1d71c7b66fdebbd77ebcddcf34d7477ce1fdbb6ddf38f1ae5ff3ae38e5c69cdb4e36f77db9efb75fe5ddfb7f4d7ce3c736f3c738e9ed9b6f5e3b7786bbe38d9adb6e38e9dd74d366def7cefaf5ae7a75d7ddd36d1a7fd79eebcf756b4efb77dd7cf5a6f96dd75dd5e6baf1ef74d5df397df73ad38e9ae3ae5fd9e7f471c738e5d7367f67db774d37f1af767b6ddfd3679bebddfc6bd79bd9d7dbd1e6bcd79efc779d35d5be5d7f87dfef46dfddbe77e5b7fbdb7f5adf4eb87b9f5eebdf1fdf9e3aefad5eef4f5e71be9ee7cf7479de5de5a6fa6b873b7f5ef96f8df6efadb8d3cf7adf4efbd3dd1b75e6f9f357b96f4e5a6bde767b4d74d3577977cf5aefadb7d3ddf5d1f6b4f79d77db5f1bdfaebc79be9ae3cefd735e76eb7eb5e387b9ddfe77dbbe3c75c734f1cf35d9fd74d5f75aedbd757f8ddae757ddd5eedd6f9db475fe9e77bf3d6f4d5e7bad9f7f57b8db47f6df5f1ef7bdfdf5ddfbd7c7bcf79d3cd1ddfd6df75de747bcf75d9fd34e35d1ad5e75bd3679b77ae5de7de34e5cf5af7469a71bf75774779dbadfc7747f8df8f7bebbeb9db76f9736df97b46df79ef7a6fc778df671ef5dd5ad3777af3c7f977cddd777e7def4efb71d77cd9dd37e3c775edbf7a71f73969f6dbe78e39edc75bf39e34f78d787fcefa7de7fdf78e1eddce796bb7f8e9bf78d7ad766bbeb477979b7dfd1dd39f3d7fbeb7f3571ce9be5a77b6dd7bde5eedbf3be9c6b46b9f3adf5f5ee34ef46bc7f47b4eb4e5a736e9de5c736d1c6b8dfb7347dd73c6f6f75f37d5f6b8e3dd78e1de9cd74f3bdbdd9fdf479beb6d5aeda75def979fdb6eda73cebc6dcd5b778f1e6dc6dff7ad3cd9f79a7bc75e77b6ba6fddbce77775e39e9ae5bd5c6db7b96b8774d7b6b9d357ddd9be5e71ddfbf5af1ce796fcede6bd6dc6ba79cf3cedcf797b7d3adb97fa7dd77579df1ad5bf78d7ae34776ef9df4dddd5d75e69e7f5d37eb679de9fddddf86b4e9be9fe39d5f7f5e5eeb8ddfd39d1e7b8dfd6b5e5af356f4d37db7f79d76e75e3d734eb6e7d6dc7dce9d6bbe78f3df78d3c6bcd75dbb69e73b6f5db5d7bf5cdbdd1cd9ef7bd9bf35e9fdbcd3bdbce3deb573973777b6f8e9aedbf1f73af77dfa71beb66fbdf76ded797f4f34eb6edf775f1b7b8e35f396df7b47dfedbedce76ef4d3befad35f357dfef97bdefa73be1ed74f5fdbde5f77673ae7869edb46f8e3b6f6dfcd346b4ebbd1beb7efb7ded39d1bf1ceddeb8eb9d36e1ddb86bde7ae356f8db56f8e9bdbadfbd3c7dce3bef9eb56f9d1fe5e6bd739e1eef67f5e7bef8736e5df1e79cd36ef975ef5ce3869c69e7dcdf8ebb69b7f4d9eefb75c75fe35d79dbcd9c69e776d9ae1ef366f969fd5f71ee7c737f39d1cf7c73cf7b71df35e1f775d9b7f4ddedbcf7d69e71fd767dcddad34ddddb5f76efcd376f6e7d79e7b4f776f5f746f777d79ff7adf86f5eb7e5d6de6bd6b8f7869cdbddde77af3ae9b7bcdf4df6ef9737dfc7b6edce386dddb6eddd5f734d1be9ae1af3c6f469e7de69deb67b5d5a7dbd766ddd3b73a77adfcf78df8d9f79ed7669ed35dfb77ad7d7fd6f76f8ef7ef8d76e1ef3a69bf5cf7b7776dd79dd3473869bd1e7dce797f879ad1aeb571c6dc75cef4ef7d9ad9ce5bf1edf871de3a69be1ae3d7787fbd9dddaf3a71fe7b6fc", + "cluster": { + "validatorCount": 0, + "networkFeeIndex": 0, + "index": 0, + "balance": 0, + "active": false + }, + "signature": "0x81a3a8a17153832df5096ef904cc2626b958d6ef9d6095f3fba1081c59fd9902c5c857de5a88984ff0a75c76e44079290598f172bfbe3e61639c1b8a35d16089e6fb4cd9df2dd817c3a19522d002023eb2485a77922ec466ffd15465f59b5422", + "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + }, + "1684357906265": { + "depositDataRoot": "0x69c653e233a0f57aa0ca4a69ebe3786f08366833350f3248e8c1dc5984ea1c35", + "publicKey": "0x9745c87e2ceb9fd55bf81d0974b325fab08a6294142da7996521697a17ce6379f8fe73155d8a6954231d7b8e4ffec34e", + "operatorIds": [ + 1, + 2, + 3, + 4 + ], + "shares": "0x00c098a0a043fcd3b5db59da3f53278d03ec486d67034890413169f03a979159dd55d54199812e45d07bab360e982d1fb57da39307046d3f17d832218fb37ede86a693e113a7ce0182ba5c051853825882ef2e62f1452a335326c0540ee2cd67f80a96dca2f210022aea4bca49be1eb81b119887f372c152752167587001d5d8c5c9df20d2303117c79892b6906d78e51e17909643b428ecc2b8a801ee21f172795a839d32c5ba6ace984273e85eba8aa532e463b5c4432fa9ef9ca990eed4ccd5d9db4f7df7ce7be1d7fbe35dfd7db6df73cddfdbc69cf39e1ef1f77bdde735f76ef77ba75f75bdf9f1bd9f734d79edb6b47bdd3d7b5d747f8d37df6db4f37779f1df1df3c69cdfd73be38774ddad9dd5b6b6ef7e5dd5cedbe9c71e6fcd7ce7b6bcebbd5cf3cf787356ded9ddf871f6bcef4d1b6dc69e71addde9d6bdd3c6b577773879cdb469df3bd5fdb57796f877ae77eb6e9cd1f7f4eb9d39db47fdd7be37db67fd6f5d3b71cf38edb7b77dbf1edbbe77ef879fdf57b6f37ebbf7b79d7bd738ef56fcebce367b7ebcf5ff38f37f5dd5cedee78dbd6f4f1addc6f56b6e7775e77adf67fddfcdbbf7679edb9f35ebbf74d1f75addc7ba6b973cdde79aedfd1d7dd79bd5c6bae5cd7bd38eb8e5cdda7fad9d736e5adda6dd7dbeb7d9adf87b7d786f9f1adfdd5e6b7efb79bf7cf5dedadf8d1fedf6b76f9f5d69fd7ad1be7bdfcd777b66bbef7edaf1cdfbedb79fd3be9e6b6e5dd3675f7b4e1dd5f6fcedfe79d7be36e767b4f1f6dedb4738e3bddaef8d1beb7e9e7fa71fedbef77baede71d73469b79f75fe5ee5af386f6ede779f7d7fb7db6fbf5fe9f69fd9ce1df1fd7cefbd7775bd7b6fddb977b7f7d75edc79b7b977af1deb971ef5c7b7f7b7fd7de71eefa7396b46fad5d75c79fd3dd5c6dae5cf3dd5be5e6da735d34e387f9edde37e79e757776b4e36dbdf76df4ddddb8734edae76776f5ef1e79f7b9f5addaf76e77e7ddfa6bae36ddaf1b73be3a778dbaddfdde778df7736d3af39e78dbddbd6bdeb7edadb8efd7b9ddcd1aefaf7969ae3ddb57b875c6dfdbde5befddfde36e1cf78e7d7dcebaf5cf1cdb475fe3dd5c6ded5c6fa6fbd3df3d73475de5c778dfbe9aedaf366db6df735d3969aef5ef571b776ebad1c6f56b6f5cd1ce5bd5cf76e74d7cf1de1c79ed9a71ce7ddfc79dd1cd3b7346dbdf7efb6bd75af1af1bef7d787daf38efdef4e9c6b47b96f469f7da69cd79f37efc7fde9f7dbeb4dbb75adf6e9ddfa779f5ed5dd9e7f76fd69d6fc6fcd9ce5bd7bdfad7d69fede73a7b7e7c6f5f3779c6fdef6e7a7b6dbdd3cd7dd1de3adbc79f7bcdb8ddc79c79eddeef8e77d1f69eebbd7a79bf7a6f7f1de1ad39efa734e9e7db7f97366da6f4f1bd3a75a7f4dfd6bd73a7756f57f5d9b7bbd5bd9dddcf7bd39db8d77db573cf1aef4d9e75be7ae39d5f7fce39e5fef6f34775f3c6b66def7873769fd7cd5ee78d76d1b7b6d7ddfce5d7ba77cd75ebadde6dbddd6bd75af1c7de77dd3debb6fd7fbe39d9dedd75d71e7766deddee75d9edbd69fefb6b9f1ae1a6b5e767dbf77f1b7347b56daef9ef9e1d75c71b6b879ce9e7ba71fd9fe5cf1f7fadb6d37e5a69de5dd356f879b7f4ef46da6bc7b56b4f38775d7c79feddd3cd376f869dd5c6da6f4ebbdf6d9bd7deb571fd1c71eef5db9e9ce7ae1ce1df5be7d71ff3d6f5e7adfcf7a77bd7de9dddedf673ce77edde3675a7b7e3577ce1ed5dd5def67dd7def34779f5de767756fae9fe1b6fb75e7fbef47bb6dce5bf7bd1df7cebad1f735d3df3b7b46dfedd73cedadb9ef979b79aefbe7d6dfd5aebbede79adf67b8e9fd366bbd9fe7c6b6e5c7bdebcefc69df1bdb66b9d9e6f4d3c6bdef66de6fdf7ae347b5f7aef9735db7dbae3d737e1ff36efd7bcef9d9cf79ef7d9c777ebbede7baeb46b5d77f78f7d7badfdf7bd3cf77f3cf5eddb7b8dbdf7d73be5c778d35e35ef9f3c75ddf5eb76dd6b66dee9f735d7b79ceb8ef4f7bedee1ef3873d7f9d1ef1ad747df6b4e9ae5af396bbef7dbaddf7367dfd3a73869e6da7b6ebbe1bd9c7fddf4dbbdb6e1edb5f79f776f979dd9b6b8d3d7b571fe34d1f7db77cd7469edf6e9ae5df1ff5ed39d1d7347dc75deb47f66b47b673c7ba71f79f6dfd5ed3aefc69fd75f3bd39e7d79fe76d35e9d69d6bdd1e775eb5f7777571e6b9df4f37eb7d1ae3673c71bdda7747dfe79d7573d7fbef46bcdfd6dc69ed1ff36d79db475e6b6e3cd5ee5df5e6b4e1de7ae78edef3871f735d7d7fc6b8d37e77d5dd7d6bce3d735f5def9d3cf5df7571cef6ddeeb66bd6f5735d5d6bdd5ed35d1e6b96f9d5de396f6d5eddfe1e71cefcdf6d9b71de7bd357f469cd3cebd77771be38738eddd5a6fcd1fd3d737f7bf1b69dd1ce7ddf76f87ba7b979c7f671a6b5eb4e9ce34d79ef47777f57dfd7aeb9", + "cluster": { + "validatorCount": 0, + "networkFeeIndex": 0, + "index": 0, + "balance": 0, + "active": false + }, + "signature": "0x8c93d278bc2b1f9957171a28c0bdacdf0bec1519388d7ada76e7a5e80c3ebe73a3a57a3706e2cbc97440090c2b0971e2070e6eb2e1448cc425d2bea148b64aa2933d910f9140ef0f548cec419f4c9cd4fe135fdd4deb25fed14c0f93aa2f57dd", + "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + }, + "1684357915429": { + "depositDataRoot": "0x18dc4906fcd6bf3e58e1b94acb39115335b695a8aadaa753093af14442dd141c", + "publicKey": "0x96be7df0a97ca5866509ef8d87110306398de6f079ed7adc1038db864ec6244834b80ddbc7844e60a963f5e9c2c0ff34", + "operatorIds": [ + 1, + 2, + 3, + 4 + ], + "shares": "0x00c0a51c9bebcf36d02505faacdc6cbdbbd877bc7f09827d867f0623303333057351b21beb8d865b2820128ce732c2cd456999d001a1c1c5675992ba5d89e31061a846d1a69e9c996ff730f1a24b8549b87815e8c4e88e7a45011e6110a9eebae2ccad34550d9d2d2cd79eba4765339bc120c7af37dda3fb4483a96f945f4c458534dbab1cd81c11947b610c4e7e56ef9226b38558ad495c8fa9116bfb17e160d38898c9deac635f104dce2c3f5c49b75f379e8054e4374dc1452b18836b643a7acceded9f6db69bdba75bdf773bd356da6bcd7c77a6bc6f6f3bedef3a6b66b6e75ef8df7d74f39ebb73c69dd9c774d38f7c6de75ed5ed3777cdf775f73b69ddb6dbdedbe5b6b8d387dbf5dd74f39d3a6df7bb73de3dededdbf5b6dbd5b7bd79fe1e71ce5e79ef1af1df1cf1a7dc7f4f7bf5dd3ae5edfbe1fe75eb7e36e5b7b6f1eedf71bdba6f77dff3a71b73dd37ef5eddf74ddcd5cdf9e5dd1ed5fdb56bdddc7bc79cf39f7cf3d71ae9cf1ceb7d3d7df7de71fd7971d75ee9f6faf38d78e756bd734f7cf7571e7b57bbf7975f7b9eb871d7ddd9f69cdb4eba77cf74d3deb9d77f7d71ddb5d7ae7cefcd9d7f9f5fef4d7673b75be3a7dae9ee3bef6d9d6b6efde7bf35ddfd77f1f6b677ddf8e5ce9bdbcf1fe37e79736ddd6bbef6f77f7973dd1a79aef7d7cdb66f8e1cd787bce5b6dcd5b779d74d74df6ebaeb4eddedadf579de797f7ef97dd7bb7dbd3c6bd6dbef6df773b7dd6dcebdf3c71a6fb6dce35d78e5cf1e7dfd78f3ae9dddee7b7dadf673477cdf76bb6fc71b7dadf4d78df4ef67db6bae7ce1be75e5a6b7f5b79e734737d5ed3df1cf3977d7f97f66fdef9d3bdfce9ef1b7dbdfb79a7baeb4e5f7f969a736e7675be1bddd6f7efa735f5ae9a77c779ebc7b87367fae39db4f7bd9cf7b7b8e5cd5d71f6fc75a69c7dcd35f3775edf6d7d6f5dfb7db75d6fc7b6efc75dd3b7dd6fde9fe5adf9f386fa7bb6b77b9e78f7869ddbbf7befb735e796fce797bb69ed7cf5ae9cedadfdf3bdf4f37e39ef4df7f7be5deda79ee7777875df5cd79eb873c71d6b7ede6f6d78f3cf1d7f479ef1edbc7f96f669aeb9f5edb475fdf87bbd747db6b5d79e3ad1ed38eb671cf36eb669f6b5f3be35d777f77746f9df8ef9ef7f3a77ae1ce34eb475bd1ed1c6fde7ceb46b76f7f1cd5ee79dbdddb69fd777767b469ee5ee9fe5bedbeb7776efb75bd1beba6dd71dd386b97f66b5d1b69b6b975f71c6bc6b97797bbdbb69f69b77aeddf7b71ce7b7397dcd9d73bedd69ff7dd9fe1ce5eedf6f56dad1edf96b6f38d7dd7869fe5ef3bf1d6b7d1c77c7f473cf7ce5e71ed38e3beb47b7db47bbf76ededb9f75d9a73deb6e9df7473973ad7473b77af7ae1be5d7de71eedd77af376bce7a75b7f7ddd7777b8f3c6faeb8db5db871af5fd3c7f7df46fbe7c77de7a79f7bad78d1f7dedb9ef9ede7fcd7bf1aedc7dfe5f7f4d74d74db86f5d786b7f35d397b879fd1c79d7dadfbd5f7dad38e9a7b4dfc7fde3bd5de9b775db8db877be7a6dee3deb9e5d71af76d9e79ee1edbc69df3cd7ddb8f79d7979bf767faf7bebad9e79dd7de1c777e5f6f7ddd71d7ddf5fd7ae9e7b76dee5ff1dd5d6ded3adb46f4eb4db7d3bd1a75d6f8e35e36e9a6b7db56bd71c69b79ed5ff767fcd5e7f8e5cdde77af7675e69c79b739e7deb4e3ae75e9d6dcf7c69c6def1ed9de1aef8d3adb7d9eeb77ded9de36db4ebdef475ff79e5a7fceba71d75ef1cf79edc7dae787dbddfdb5e34e5fd7869b6bbe7cddfdb86f8e35eddd78d9b6b569c7ba71b7f6dbbdf47dbe5fd36e3a73a7b97f5d3b7fde9ee9dd9dd5aef4db8f38e3af7df1adf47797db6f8d5a7fbd9ef7d6baf3d6de7f5e1ad76d346f8777e7bd9ae5a6b971be7ad776db7fcd7573dd5cdb96de77a7bb7fd77dedee3df5d75ad7c75cef7e397def5c7fd7bc7fc69a73671ee346b9d9f75e69fd9b6df6db7b8ebdf1bf7d77477b7f4e3ae7dddadf4efa7deeddf5cd5bd5bd3b6b6e39edde9d73de78e1ee34f79edb6f4e36d1d6b579dd1d6da7396f6edc75def5ef47bae5adb5f3479ddf9f75f3c71b7fd75c7f47b7d3cef5f3bdbae5f6da6b9f5fefcf1b79d6daef7d5de5cefd71fe1edbbd34f3df5bd9fd366dd7dee37df9df6f34738f5fd9fe3debdedee5ff5ed76d35d1edfde3ad9bf1af5dd7be39e1f6f4777e1ff1edbd6f9ebcf3c75bd7bd38d75d5b6f9e7bf79e5c69f7b67bde9e75b7fb75b7fc7bde1a6f4f79e36eb7e7869fdf8f7be5fdfdd387f6f5b77a6fc6dd71f77adbd75c7dfddbdbdd1bd79df47b77b9d5fefce757deeb8d357b9e5df35e1b71edf6d1d6bcddf77573a779d3a7b7f1dd5b6fad5beba77b7f5df5e7dd3471bd347dc6b97dc79dd1de7ce39e7c7fc6f5e78dbbeb8d5edb669dd5bd3de3bd3ae78df975e6bdf7873ae35e5ff7b71bdbd", + "cluster": { + "validatorCount": 0, + "networkFeeIndex": 0, + "index": 0, + "balance": 0, + "active": false + }, + "signature": "0x91f45b18ad23067c19ff619303b9c134e99b4aa638747d667536376897309241ef2a9b7f888f4c3afabbd19189e9aa7c082e7f6a9cd5c3771723f27eabe621e7941e1bde80efce61ad19ff995be062b916a59e0742f66fd0551b6fa68548b8dc", + "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + }, + "1684358027067": { + "depositDataRoot": "0x8bee5c8e42f4300579a9ea807d127957d49e944147f3030f46b5767dcd3875a0", + "publicKey": "0xa1f382a1f9b4ff7e8d89b545bf6ede6452f6408dde63607d11cc65bff1e00590b8a07c02835e425cf355a4eb35e2016f", + "operatorIds": [ + 1, + 2, + 3, + 4 + ], + "shares": "0x00c0856f3c80d6f7419eefd43834802aea0d401932aa47fdc41325167809f2505fb2df74ac2fee166515cb8624e3ac3cfe0e90a0da3b474ff32daaeaadaafd313eb2731e49c3ad8bea4c50f66bc07d0997c974a25be950fe38c448b87d870c334fa68567d73f13dbcd04ce00c98a0076b81a4ab70c8558d6fc11a95981b5cfa745811538a0ef47cc50135477d43984da12bf908384d45e013f67776a423845b3e540406aaec25fb515a2ef51abc9a532b5f4e125381ec74d169061594a54b7e2730be1ceddd9bddfeb76fad396f7f7a775e5dd9bd5aeb4e78f37dda77ddb5739ebcefb71e71cd9eebbd1a7b4e747b4df66f4ef775fe7c7f4f34e5d77879df5a71dd1cd74eb8e76ef6e1f7df77c6f66df77475adbd7b8ef9d75e5fe5de36ef66deefb79ceddd9ee3be1befb775e5ff5af75d3b6b56b8f3adfd6f4f3c7bcd5dd76eb5d5ce3d7ddf3cefd6dd7376df6f66b9ebbe38e5fddae7de7675f7747f7edb71f734ddd69c6bbe7beb66ddddfdda7396b8d5de79df9dfcd3a69ad38ef4df5f1b7dedbcd7d6dcdfbf767b4dfcebd6db79aedf738d9d7f5d77f3be3a75c6b7f1ce7877dd7b69ae9cf38d7af5edbbefdf3cd5fdfceb8d1c735f1f79febcd76db8f74edd69cf7ae75d9f7df7b87fcf36e77d39734f1c6bae1cd3ceb671d734d39df8d74d7bf5bddfdf475be7dd3bd5d75aefc6dde1aef977d75c7b7db5777d1aeb77f771fddcf1d7f7e5a77ad5e7787b9f39eb8ef6f3de9edde79a7bb6db77d6b7f75eb975fe5d6faf36edd7dadbd734f37e9eddb6b779f75bd7dd9de7d6ded3ae7bebcddaf78e9af1adbddba7fcef6e1d739eb4775ef577773b734e5fef46baf7ce1eedde7dd5a73ad9cf79db97dcf1adfaddd73d6db73a7bd6f57b575ae7bdfa7b8e7bdbdd5e79ce9beb6e7ddf6e3bf3971d7b7f39774d3bedaef5db4d3977bf39d1de367f6f74db4dbb6ded38d34e9e6fad9a738e7dd5e69b7ded9c7b76f577d75bf74e36d776f5d5cf7aef5d346f87bd6fbe7cf7bdf669ee5ddfd6f76dedf76f7ebad3ae9b79f6b8f747b5e7bf5bd1c77d7f9ef7f1ddddef7d1e75cf7ad7679ff3aebd71e71ad3d6fb75ee77d5a7f679d75ed7cf75d78737739d9fe5b77a7dee77f77e9cef679be9adba71af78f356dfd9a75fdb57dbd7ae5feb5f397767f87f7d7a6f8f3a7f571ddf577df1d73973bdba77b7bde3cf3ae797de7fa7f5d9fe1be9f6fc75d69e7b7d5be9bdf6db5ebcd7bd1d6bdd1de7a73ce5f75eef675dd7b7b67f5d38ef8df8d1df786de774ddc775e7cf37eb66f475af76e34f34e3cdb9ebdd7dd5bdbae1e739dbb7fcdbc6dfd387fb77cdbb6b67786bcf1ed1f778739ef5d75ddf7377bceb4e1e6fad5e75af76e38ebbf7773979fdfcddbe1cf79f7869f7ded1fdb7e5fe5fd9bddbeda739df57b4e9d6f4e9c77477be79dde6b9e9dd5adf46f7efd73c7f47bb73beb77de7b5d5ed37f386dee9c75cd9df78778ef7735ddfdb8f78d1f7ba7fbe5ff5bd5ce37e39d9ee1ae1e6fae3b7dc774df871ddf7efdd39e78ef7dde6b6df8df673be76ef6f1f7756fc75d6dfe7473b71ad397f4e9cdfa79d6fbdf7ddee38f3ae9d7da69d71bdb7e367dfdfb6bbe75f797fadfddb569f71cdb96f76b479cd9ee5c79d7ba7f4ebb75cd9fe1d7fcf1ae7bd36f5df7df1b776d77734e1e6ba6bcf3be9fdf5f37e1d7bde1e6bae75d9af7979ce34ef5df6f5ddb9f38eb7f5d7deedad1bdbc71d7dff36dbdf5eebc735e38ddd75bd1bdf7d38eb6d7b7f4dda6f56fbd346b6f1fedb7b5d7ce7ad3473dd1fd3c71fd5bddff3b7da6f4e5cdb4dba6f9db6db67f9ddce9a69cdb6eda71cf38e3ae3ae3cd9e6f8dda75cd746f5d1d73c77cebcf37f7bf39f36e346f6f756bae7ae1be38e75e5ad5def4f39d9dd9a774d34df4d1cdbdeb5ef975bef8ef8edad1fe3bef4f3ad7d73dd9d7f6f7bf7dd75efae9ce1f73b7b5d36e9bddfe9c6df77b6bdd7bd3bf3bef8e36f1feb7d1e776d9cf1febd79c73df376bce5bd787b66b873c6f779c75dd7ce776fddba7b4d3b6f5e3a77b6f7e34efde5a6b5eb871d6f469dd7def9ddf6b869fe75f78f7d69dd34f75d5e69cdb86bad1e7fb6b66bcf1c7fb77ae3c6b7f7de5a6b8f34eb769a7b8edc6dc7fae1c7b6f5b6b8d757b8f7de7ae3b69e7fbd9bdb6f77d3ad38dbbef5e5ce3adbcede778d1cd1addef1e7f8738d9bd3dd9b736ededf4f7cd74f75df5779e3be9be9dddae37d3bd9c774f7aeb971fe1a6fce5ee37f5d77dd9fedd7df7396dde1b6fc7bcedeede6df7dee76e9feb97dff78d1bedaf7c69b7fbd79e9cd79f5bd5bd3dddef36e5ed9f6de7b6d1b7f7735db6d7bdf6f1cef5d9ce5dddfd7ce5ae7de347ba6bdebcdbdd5ae1cdf5d7cebbf3bd79e9dd77eb6e5be1ee1e7b56dbe7d6bce5a79d6da69e7deef86b66b6e39e7b79eddd71d79ceb87bc", + "cluster": { + "validatorCount": 0, + "networkFeeIndex": 0, + "index": 0, + "balance": 0, + "active": false + }, + "signature": "0xb1c168f4772b9a07746dc2f348e8e667b385f588693b7c5f1eb1c6a4b9995a0a5ef986b6ca8f18a775539e9eed3667ab179cf1d9014984a098f83a11af9c7bf6a165a0df1411493eebd73101426717917be1add753cad47e998d3414dd93627a", + "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + }, + "1684358234792": { + "depositDataRoot": "0x4b5e8d666cdf848732102ef685bc36c76b9d737ec1dda83ff14be7f45e854526", + "publicKey": "0x840cc5ef78bcf3d7ab29d348d2f85320bc79e2e4aed622b0594aff8658af1dbe1f606da52684ad07f6ed83b2e8faac17", + "operatorIds": [ + 1, + 2, + 3, + 4 + ], + "shares": "0x00c0b6adeee8452ff4d0f791b8d62c9d4b24fb8524a92a14fe61ba6fa25cdcb5aac2d3a001090bf5a565d4e9378f45d00327a51e45082e703cc0d706eb8920a48aa8cacfe32e8ed49758aec0cb8d7a99b5eb5cdff1ac799248fb651cb1f509ce0bd98e5cb8fd3c0081b586ae61fd6498281d12d7d99dd1646de704efa406547236db606f8b7855f671b4ae972353028666a88ae95ff58a2bc9155c893ff1ab9ea4ca4222922bfb52e2e28fd127a59e29b51a951b2a16632c4073b22c69c40f5ad56ce1dd756dd71d77de77eb9d9df1cd34e5ddfbd9cef4e1de1f7357b9f7cedcf1beb7edddf8e3beb7f1b73a71de7cd3cdf7e7d6f8f39f1e6bb6b869deb9f1df36d9ef5fd35f3d73ddf66fa77bf1b7377bd7baedce1f7b47dcd1adf4d7b7bbd38d77d7d6f86fbf3de7c6bc71fd1eeb9d1ae5f69c6b57bbf7cd78f3bd5dd5de7de5d73d69c7b4f5a6b775ae75d5cd746fbedf79b7767f7e7d6fb71edf971d6fbf1ce5ae3c7fdf75d7de35df87fcdf771c73a7f5d79edcf1cf3def4ef6e5ad1df37f7cdb9f1ee5b7786da7f873dd7a75d7df6bbd5d7bd6dbef6eb6d3a77be1ed7cd5df7ce1dedad1bf3df75f34f7b7f7efbf366fad9deb86df6fae34eb977b7b9f1ae9e73573be3de9aeb9e796f8d747fd7367fcf7c79a73a7dfd79ddc71be1bdb6ebaddcdf7e3cd9febdddb7bb6bb734d1fd5bd1ed366b875c75cd5cebc6f4d36e76e9fe5ceb4dfce76e7a6bae78db8f5e7ddf39efaf1cd9edb97f5738d3a7bad7b778e786bad5ad3c7bb6dfd9fefaf38e9ff5c73addf776dbd71ae1ff7c7f4e5debdf5a6f46bde9d6b7739d3cd9be77e7475cebddf4e5ad38ef4e5ae1a71deddf36df9eb7736ddeeb5f7ad1d7b46bcddef5f7bae5ad34d5ef5e6f4d5af34d7b7b8efdf1ddf473bef5779d9dede75ce9cddfd38dddf5cd1df7af3dedbf1b775778f36df7e3beb7d9aeb7d78edde7bd3a69f774dfa71cf3969f7f6d7aedae3b79fdb5edbdfae9febde7c69ce3aebdd347bc7dbd78d9f778df47b9df97796fad766dff78ddee1f6da69ae7ddbbd9dede71fe34edfe34e1ed1ad76dfd734edfd3ceb6d1bf75e78db7d9cd74dded3ad1e7fb7dde9edf87367da69eddc775f3ae34779d1d75fef5eb6d79f5ce35d34d5adb777bf7adfae387dcdba7f8e9b6fbeddedcf3bd1ae35d1ddbde5a7dfdbcdfbf35efbebcf3b7b675ff3b69fdb67fdf767f4d79efddddf76f3ae7c774e7ad356deedadb873bdfbeb475c7b6d5de75d75e9c7bae5ae1f6f77dcef4dba7b9d9eedcf5fd3573a69ae786f66fb7fa71dd7dd3dd7ddddd79e77d9a7b779bd35db67bbe3c71bef4f5dd3673be1c774e37e1be9cd746b8f5ee1bd5ff77f7cd756f8ef66f67367b8eb9e9d6b76f56dbe7bf356b9ef6e1c75af3b75c6f77fd75d7f8ddfef9d5a7387b4dfa7dc6fcdb9f7d69dd1a7b8d5b71defddbd7daedd6fd75f7fad9fe1e6fb71bd7cd5fd1a778df67dee7cf1c739d3cdfb69aeb4d5aebaeb6d37d1b6f56f6f5d69bdda6b8dbdd74f1f7ddf1de38e3ce7dd1eeddef7e777b6ddef347b8d767bce5d6f4dda6b569af3cf7cef5f1a75fedbe3cef4eb7e76e5f7f671dd3b6da7faf5f73dd1b7bc7ba6de7db7df7bc7367dedb67bad3d77969cdbcd3df77f74e367bc779f7debbef96f7d7de36dfa7dbdf56f9d9f7b6df4f757dee1debdeb7df575e7f6e3979fd5ed3a7f67f56fa7f7e1e75ddfbf1df37eb6e387f5e5bf1aef8f5a79fe9ceb9d9debb79df5addde1fe397bcd7cf5cedae5dd1dd5c6fc6ded7df1c77d69fd9cd1cebcd3bf1cf35d9ddf96bcdb579e6de79dd7bd747fcd35e3779ddf97fbe5be767b87fae5a79cf74d9a6db7bdeb5d5fdf671a69bd9fd76f78e9aefdef5f5ef78d3d6faf3c69c7da7dcd9a7dfd7a71b6dd7b9d5a7347fb7f66f6ddfddae75f36e37d75e5e6dddb6eb8e1cd5ee77e9fe7cf747f57796f86ddd74f1b71c6bb737d36ddaeb67fde79f74f5e6b6e9d7357b8ebad37f776f879bd1ce7475def875c71adb4f3a77a75a6f86faf7ceb871e6dbd38db8edbe34e5c6bd71a77ad39e3d75dddc6b6f1a7fad74e79eb4e5ddfa7bb6b6db9eb6f3bf5e6fbd5bddee77f7a75df3af5b69be75d3cd1befbdfd77b7b8d79779d1d6dce366da777d36d77ebcd5b7f8f74df57f66dbe366ddedfdbce3a777db579f71c7fddfae7a738e9b73d6ddddd75d69de3ae7479af3873b7b7f7adbae37edcf36ef8e1ff1a75f6bdf5debb6fdd9de756bc7f9edfe396fd7ddd1a6bb6b6e1bebbe7d7f469deb4e36f5cdb4f79ddc6f87f56b4eb4e1a7da77877479fd34e5bd34ef979b75fddeefc75ce9e71ff3b79aefcefad747b77f6e787f5d9a69e739dbae1d777d5befb6b6d7beb6d1ee1b73bdf7db4e1dd35d7a7faf75f5dddcf5ff5e6f57de69e77ae3c7bcedfddde7a6f5f34f38e7bd1df77efcdfaedadbc", + "cluster": { + "validatorCount": 0, + "networkFeeIndex": 0, + "index": 0, + "balance": 0, + "active": false + }, + "signature": "0x933b60910e53c116acff229ec961d9adca85a5dd7a51fe685091dab7e19ca3cadbf8e957cf8f20cbb63200444f73966602bd017c0892002b7edd15534fbf65fa5fa45a3c6998b62fa6e32fe14752b0b2789d6870e20b61da30b8e96f5ad8d4ac", "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" } } \ No newline at end of file diff --git a/common/types/src/index.ts b/common/types/src/index.ts index 265e388f3..4a462d76d 100644 --- a/common/types/src/index.ts +++ b/common/types/src/index.ts @@ -2,6 +2,7 @@ import { Account } from './interfaces/Account' import { AddAccountOptions } from './interfaces/AddAccountOptions' import { BalanceSnapshot } from './interfaces/BalanceSnapshot' import { BrowserProviders } from './interfaces/BrowserProviders' +import { Cluster } from './interfaces/Cluster' import { ContractArgs } from './interfaces/ContractArgs' import { ContractConfig } from './interfaces/ContractConfig' import { Currency } from './interfaces/Currency' @@ -25,6 +26,7 @@ export type { AddAccountOptions, BalanceSnapshot, BrowserProviders, + Cluster, ContractArgs, ContractConfig, Currency, diff --git a/common/types/src/interfaces/Cluster.ts b/common/types/src/interfaces/Cluster.ts new file mode 100644 index 000000000..63bddb0c8 --- /dev/null +++ b/common/types/src/interfaces/Cluster.ts @@ -0,0 +1,7 @@ +export interface Cluster { + validatorCount: number + networkFeeIndex: number + index: number + balance: number + active: boolean +} \ No newline at end of file diff --git a/common/types/src/interfaces/Validator.ts b/common/types/src/interfaces/Validator.ts index 6859c4df3..b3977a684 100644 --- a/common/types/src/interfaces/Validator.ts +++ b/common/types/src/interfaces/Validator.ts @@ -1,8 +1,11 @@ +import { Cluster } from './Cluster' + export interface Validator { depositDataRoot: string publicKey: string operatorIds: number[] shares: string + cluster: Cluster signature: string withdrawalCredentials: string } \ No newline at end of file diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 76331d6be..e7853f391 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -162,7 +162,7 @@ Complete a given count of pending withdrawals ### initiatePoolDeposit ```solidity -function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials, uint256 feeAmount) external +function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes shares, bytes signature, bytes withdrawalCredentials, uint256 feeAmount) external ``` Initiate the next ready pool @@ -174,8 +174,7 @@ Initiate the next ready pool | depositDataRoot | bytes32 | The deposit data root | | publicKey | bytes | The validator public key | | operatorIds | uint32[] | The operator IDs | -| sharesEncrypted | bytes[] | The encrypted shares | -| sharesPublicKeys | bytes[] | The public keys of the shares | +| shares | bytes | The operator shares | | signature | bytes | The signature | | withdrawalCredentials | bytes | The withdrawal credentials | | feeAmount | uint256 | The fee amount | @@ -226,7 +225,7 @@ Register an operator with the pool manager ### resharePool ```solidity -function resharePool(uint32 poolId, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys) external +function resharePool(uint32 poolId, uint32[] operatorIds, bytes shares) external ``` Reshare a given pool's validator @@ -237,8 +236,7 @@ Reshare a given pool's validator | ---- | ---- | ----------- | | poolId | uint32 | The pool ID | | operatorIds | uint32[] | The operator IDs | -| sharesEncrypted | bytes[] | The encrypted shares | -| sharesPublicKeys | bytes[] | The public keys of the shares | +| shares | bytes | The operator shares | ### setFeePercents @@ -816,8 +814,7 @@ struct Pool { bytes32 depositDataRoot; bytes publicKey; uint32[] operatorIds; - bytes[] sharesEncrypted; - bytes[] sharesPublicKeys; + bytes shares; bytes signature; bytes withdrawalCredentials; } @@ -952,7 +949,7 @@ function completePendingWithdrawals(uint256 count) external ### initiatePoolDeposit ```solidity -function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes[] sharesEncrypted, bytes[] sharesPublicKeys, bytes signature, bytes withdrawalCredentials, uint256 feeAmount) external +function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes shares, bytes signature, bytes withdrawalCredentials, uint256 feeAmount) external ``` ### requestPoolExits @@ -1242,50 +1239,6 @@ _Send ETH to a user_ | user | address | The user address | | amount | uint256 | The amount of stake to send | -## MockFunctionsOracle - -### constructor - -```solidity -constructor() public -``` - -### getRegistry - -```solidity -function getRegistry() external view returns (address) -``` - -Returns the address of the registry contract - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | address | address The address of the registry contract | - -### sendRequest - -```solidity -function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) -``` - -Sends a request (encoded as data) using the provided subscriptionId - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| _gasLimit | uint32 | Gas limit for the fulfillment callback | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | A unique request identifier (unique per DON) | - ## IDepositContract ### DepositEvent @@ -2039,6 +1992,68 @@ error OperatorsListNotUnique() error OperatorAlreadyExists() ``` +## IWETH9 + +### deposit + +```solidity +function deposit() external payable +``` + +Deposit ether to get wrapped ether + +### withdraw + +```solidity +function withdraw(uint256) external +``` + +Withdraw wrapped ether to get ether + +## MockFunctionsOracle + +### constructor + +```solidity +constructor() public +``` + +### getRegistry + +```solidity +function getRegistry() external view returns (address) +``` + +Returns the address of the registry contract + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | address | address The address of the registry contract | + +### sendRequest + +```solidity +function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) +``` + +Sends a request (encoded as data) using the provided subscriptionId + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | +| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| _gasLimit | uint32 | Gas limit for the fulfillment callback | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | A unique request identifier (unique per DON) | + ## ISSVNetworkViews ### initialize @@ -2151,21 +2166,3 @@ function getLiquidationThresholdPeriod() external returns (uint64) function getMinimumLiquidationCollateral() external returns (uint256) ``` -## IWETH9 - -### deposit - -```solidity -function deposit() external payable -``` - -Deposit ether to get wrapped ether - -### withdraw - -```solidity -function withdraw(uint256) external -``` - -Withdraw wrapped ether to get ether - diff --git a/contracts/ethereum/functions/API-request-source.js b/contracts/ethereum/functions/API-request-source.js index 42b6a0a52..2794b57cb 100644 --- a/contracts/ethereum/functions/API-request-source.js +++ b/contracts/ethereum/functions/API-request-source.js @@ -28,11 +28,12 @@ function lpad(obj, str, num) { return repeat(str, num - obj.length) + obj } +const getSweptRewards = "0x9d816764" const managerAddress = "0x07e05700cb4e946ba50244e27f01805354cd8ef0" // We want to get a string (not bytes) array of length of the number of validators // See PoR Address List + const getValidatorPublicKeys = "0xeab1442e" -const getSweptRewards = "0x9d816764" const getPublicKeys = await Functions.makeHttpRequest({ url: 'http://localhost:8545', diff --git a/contracts/ethereum/hardhat.config.ts b/contracts/ethereum/hardhat.config.ts index ae7ad45e4..71f480b80 100644 --- a/contracts/ethereum/hardhat.config.ts +++ b/contracts/ethereum/hardhat.config.ts @@ -42,7 +42,7 @@ const externalEnv = { FUNCTIONS_ORACLE_ADDRESS: '0x3de1bE9407645533CD0CbeCf88dFE5297E7125e6', FUNCTIONS_SUBSCRIPTION_ID: '1', LINK_TOKEN_ADDRESS: '0x326C977E6efc84E512bB9C30f76E30c160eD06FB', - SSV_NETWORK_ADDRESS: '0xb9e155e65B5c4D66df28Da8E9a0957f06F11Bc04', + SSV_NETWORK_ADDRESS: '0xAfdb141Dd99b5a101065f40e3D7636262dce65b3', SSV_TOKEN_ADDRESS: '0x3a9f01091C446bdE031E39ea8354647AFef091E7', SWAP_FACTORY_ADDRESS: '0x1F98431c8aD98523631AE4a59f267346ea31F984', SWAP_ROUTER_ADDRESS: '0xE592427A0AEce92De3Edee1F18E0157C05861564', @@ -95,9 +95,7 @@ const config: HardhatUserConfig = { ganache: { accounts: mnemonic ? { ...hid } : undefined, url: 'http://127.0.0.1:8545', - allowUnlimitedContractSize: true, - gas: 'auto', - gasPrice: 'auto' + allowUnlimitedContractSize: true }, mainnet: { accounts: mnemonic ? { ...hid } : undefined, diff --git a/contracts/ethereum/helpers/dkg.ts b/contracts/ethereum/helpers/dkg.ts index 76a8d49ce..a5a3fe1e5 100644 --- a/contracts/ethereum/helpers/dkg.ts +++ b/contracts/ethereum/helpers/dkg.ts @@ -13,6 +13,7 @@ export async function initiatePoolDeposit({ manager, signer, index }: { manager: publicKey, operatorIds, shares, + cluster, signature, withdrawalCredentials } = mockValidators[index] @@ -21,6 +22,7 @@ export async function initiatePoolDeposit({ manager, signer, index }: { manager: publicKey, operatorIds, shares, + cluster, signature, withdrawalCredentials, ethers.utils.parseEther(mockFee.toString()) // Mock fee amount estimate ~ 10 SSV diff --git a/contracts/ethereum/package.json b/contracts/ethereum/package.json index b9a1af429..254353cd4 100644 --- a/contracts/ethereum/package.json +++ b/contracts/ethereum/package.json @@ -29,7 +29,7 @@ "@types/node": "^17.0.45", "chai": "^4.3.6", "esno": "^0.16.3", - "ganache": "^7.7.1", + "ganache": "^7.8.0", "hardhat": "^2.12.2", "localtunnel": "^2.0.2", "minimist": "^1.2.8", diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 9c3638486..087f2ede7 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -8,6 +8,7 @@ import EventEmitter, { on } from 'events' void async function () { const [, , , , fourthUser, keeper, dkg] = await ethers.getSigners() + let config: DeploymentConfig = { CasimirManager: { address: '', diff --git a/contracts/ethereum/scripts/ganache.ts b/contracts/ethereum/scripts/ganache.ts index 5cbb925e5..cd1b5a9a5 100644 --- a/contracts/ethereum/scripts/ganache.ts +++ b/contracts/ethereum/scripts/ganache.ts @@ -5,7 +5,10 @@ const mnemonic = process.env.BIP39_SEED as string // Mining interval is provided const miningInterval = parseInt(process.env.MINING_INTERVAL as string) -const mining = { blockTime: miningInterval } +const mining = { + blockTime: miningInterval, + defaultTransactionGasLimit: 'estimate' +} // Local network fork rpc is provided const forkingUrl = process.env.ETHEREUM_FORKING_URL as string diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index 16ff60f93..826bc3427 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -149,7 +149,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { address beaconDepositAddress, address _dkgOracleAddress, address functionsOracleAddress, - uint64 functionsSubscriptionId, + uint32 functionsSubscriptionId, address linkTokenAddress, address ssvNetworkAddress, address ssvTokenAddress, @@ -180,7 +180,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function depositStake() external payable nonReentrant { require(msg.value > 0, "Deposit amount must be greater than 0"); - + uint256 depositAfterFees = subtractFees(msg.value); reservedFees += msg.value - depositAfterFees; @@ -214,8 +214,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param sweptExits The swept consensus exits */ function rebalanceStake( - uint256 activeBalance, - uint256 sweptRewards, + uint256 activeBalance, + uint256 sweptRewards, uint256 sweptExits, uint32 depositCount, uint32 exitCount @@ -227,21 +227,34 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint256 expectedDeposits = depositCount * poolCapacity; uint256 expectedExits = exitCount * poolCapacity; - int256 expectedEffective = int256(stakedPoolIds.length * poolCapacity + expectedDeposits + expectedExits); - int256 previousExpectedEffective = int256(stakedPoolIds.length * poolCapacity); - int256 previousActiveRewards = int256(latestActiveBalance) - previousExpectedEffective; - int256 actualActiveBalance = int256(activeBalance + sweptRewards + sweptExits); + int256 expectedEffective = int256( + stakedPoolIds.length * + poolCapacity + + expectedDeposits + + expectedExits + ); + int256 previousExpectedEffective = int256( + stakedPoolIds.length * poolCapacity + ); + int256 previousActiveRewards = int256(latestActiveBalance) - + previousExpectedEffective; + int256 actualActiveBalance = int256( + activeBalance + sweptRewards + sweptExits + ); int256 actualActiveRewards = actualActiveBalance - expectedEffective; int256 change = actualActiveRewards - previousActiveRewards; if (change > 0) { - uint256 gain = SafeCast.toUint256(change); if (actualActiveRewards > 0) { uint256 gainAfterFees = subtractFees(gain); - stakeRatioSum += Math.mulDiv(stakeRatioSum, gainAfterFees, getStake()); + stakeRatioSum += Math.mulDiv( + stakeRatioSum, + gainAfterFees, + getStake() + ); latestActiveStake += gainAfterFees; - + emit StakeRebalanced(gainAfterFees); } else { stakeRatioSum += Math.mulDiv(stakeRatioSum, gain, getStake()); @@ -249,12 +262,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { emit StakeRebalanced(gain); } - } else if (change < 0) { uint256 loss = SafeCast.toUint256(-change); stakeRatioSum -= Math.mulDiv(stakeRatioSum, loss, getStake()); latestActiveStake -= loss; - + emit StakeRebalanced(loss); } @@ -346,18 +358,12 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { openDeposits -= withdrawal.amount; withdrawal.user.send(withdrawal.amount); - emit WithdrawalCompleted( - withdrawal.user, - withdrawal.amount - ); + emit WithdrawalCompleted(withdrawal.user, withdrawal.amount); } else { pendingWithdrawalQueue.push(withdrawal); pendingWithdrawals += withdrawal.amount; - emit WithdrawalInitiated( - withdrawal.user, - withdrawal.amount - ); + emit WithdrawalInitiated(withdrawal.user, withdrawal.amount); } } } @@ -394,17 +400,18 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param withdrawalCredentials The withdrawal credentials * @param feeAmount The fee amount */ - function initiatePoolDeposit( + function initiatePoolDeposit( bytes32 depositDataRoot, bytes calldata publicKey, - uint32[] memory operatorIds, - bytes memory shares, + uint64[] memory operatorIds, + bytes calldata shares, + ISSVNetworkCore.Cluster memory cluster, bytes calldata signature, bytes calldata withdrawalCredentials, uint256 feeAmount ) external { require( - msg.sender == dkgOracleAddress, + msg.sender == dkgOracleAddress, "Only DKG oracle can initiate pools" ); require(readyPoolIds.length > 0, "No ready pools"); @@ -426,7 +433,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { pool.signature = signature; pool.withdrawalCredentials = withdrawalCredentials; readyPoolIds.remove(0); - pendingPoolIds.push(poolId); + pendingPoolIds.push(poolId); validatorPublicKeys.push(publicKey); beaconDeposit.deposit{value: pool.deposits}( @@ -437,17 +444,29 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ); ssvToken.approve(address(ssvNetwork), ssvFees); - // ssvNetwork.registerValidator( - // pool.publicKey, - // pool.operatorIds, - // pool.sharesPublicKeys, - // pool.sharesEncrypted, - // ssvFees - // ); + + ssvNetwork.registerValidator( + pool.publicKey, + pool.operatorIds, + pool.shares, + ssvFees, + cluster + ); emit PoolDepositInitiated(poolId); } + function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) { + // If the _res length is less than 68, then the transaction failed silently (without a revert message) + if (_returnData.length < 68) return 'Transaction reverted silently'; + + assembly { + // Slice the sighash. + _returnData := add(_returnData, 0x04) + } + return abi.decode(_returnData, (string)); // All that remains is the revert string + } + /** * @notice Complete a given count of the next pending pools * @param count The number of pools to complete @@ -550,19 +569,16 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function resharePool( uint32 poolId, - uint32[] memory operatorIds, + uint64[] memory operatorIds, bytes memory shares ) external { require( - msg.sender == dkgOracleAddress, + msg.sender == dkgOracleAddress, "Only DKG oracle can initiate pools" ); Pool memory pool = pools[poolId]; - require( - pool.reshareCount < 3, - "Pool has been reshared twice" - ); + require(pool.reshareCount < 3, "Pool has been reshared twice"); pool.operatorIds = operatorIds; pool.shares = shares; @@ -582,7 +598,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint32 feePercent = getFeePercent(); amountAfterFees = Math.mulDiv(amount, 100, 100 + feePercent); } - /** * @dev Process fees @@ -602,10 +617,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { tokenAddresses[Token.LINK], Math.mulDiv(amount, linkFeePercent, feePercent) ); - linkToken.approve( - address(upkeep), - linkToken.balanceOf(address(this)) - ); + linkToken.approve(address(upkeep), linkToken.balanceOf(address(this))); linkFees = swappedLINK; unswappedTokens[tokenAddresses[Token.LINK]] += unswappedLINK; @@ -614,10 +626,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { tokenAddresses[Token.SSV], Math.mulDiv(amount, ssvFeePercent, feePercent) ); - ssvToken.approve( - address(upkeep), - ssvToken.balanceOf(address(this)) - ); + ssvToken.approve(address(upkeep), ssvToken.balanceOf(address(this))); ssvFees = swappedSSV; unswappedTokens[tokenAddresses[Token.SSV]] += unswappedSSV; } @@ -679,8 +688,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param _ssvFeePercent The new SSV fee percentage */ function setFeePercents( - uint32 _ethFeePercent, - uint32 _linkFeePercent, + uint32 _ethFeePercent, + uint32 _linkFeePercent, uint32 _ssvFeePercent ) external onlyOwner { ethFeePercent = _ethFeePercent; @@ -758,7 +767,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @return balance The manager swept balance */ function getSweptBalance() public view returns (uint256 balance) { - balance = address(this).balance - getBufferedStake() - getReservedFees(); + balance = + address(this).balance - + getBufferedStake() - + getReservedFees(); } /** @@ -794,7 +806,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function getRequestedWithdrawalQueue() external view - returns (Withdrawal[] memory) { + returns (Withdrawal[] memory) + { return requestedWithdrawalQueue; } @@ -805,7 +818,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function getPendingWithdrawalQueue() external view - returns (Withdrawal[] memory) { + returns (Withdrawal[] memory) + { return pendingWithdrawalQueue; } @@ -813,11 +827,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Get validator public keys * @return A list of pending and active validator public keys */ - function getValidatorPublicKeys() - external - view - returns (bytes[] memory) - { + function getValidatorPublicKeys() external view returns (bytes[] memory) { return validatorPublicKeys; } @@ -874,9 +884,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param poolId The pool ID * @return pool The pool details */ - function getPool( - uint32 poolId - ) external view returns (Pool memory pool) { + function getPool(uint32 poolId) external view returns (Pool memory pool) { pool = pools[poolId]; } @@ -908,11 +916,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Get the upkeep address * @return upkeepAddress The upkeep address */ - function getUpkeepAddress() - external - view - returns (address upkeepAddress) - { + function getUpkeepAddress() external view returns (address upkeepAddress) { upkeepAddress = address(upkeep); } diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index f96b2dec0..9b343936a 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: Apache pragma solidity 0.8.18; +import "../vendor/interfaces/ISSVNetwork.sol"; + interface ICasimirManager { /***********/ /* Structs */ @@ -19,7 +21,7 @@ interface ICasimirManager { uint256 reshareCount; bytes32 depositDataRoot; bytes publicKey; - uint32[] operatorIds; + uint64[] operatorIds; bytes shares; bytes signature; bytes withdrawalCredentials; @@ -76,8 +78,9 @@ interface ICasimirManager { function initiatePoolDeposit( bytes32 depositDataRoot, bytes calldata publicKey, - uint32[] memory operatorIds, - bytes memory shares, + uint64[] memory operatorIds, + bytes calldata shares, + ISSVNetworkCore.Cluster memory cluster, bytes calldata signature, bytes calldata withdrawalCredentials, uint256 feeAmount diff --git a/contracts/ethereum/src/vendor/interfaces/ISSVNetwork.sol b/contracts/ethereum/src/vendor/interfaces/ISSVNetwork.sol index 62edd23ad..0f9a16565 100644 --- a/contracts/ethereum/src/vendor/interfaces/ISSVNetwork.sol +++ b/contracts/ethereum/src/vendor/interfaces/ISSVNetwork.sol @@ -170,8 +170,7 @@ interface ISSVNetwork is ISSVNetworkCore { uint64 declareOperatorFeePeriod_, uint64 executeOperatorFeePeriod_, uint64 minimumBlocksBeforeLiquidation_, - uint256 minimumLiquidationCollateral_, - uint32 validatorsPerOperatorLimit_ + uint256 minimumLiquidationCollateral_ ) external; /*******************************/ @@ -216,7 +215,7 @@ interface ISSVNetwork is ISSVNetworkCore { function registerValidator( bytes calldata publicKey, uint64[] memory operatorIds, - bytes calldata shares, + bytes calldata sharesEncrypted, uint256 amount, Cluster memory cluster ) external; @@ -290,65 +289,4 @@ interface ISSVNetwork is ISSVNetworkCore { function updateLiquidationThresholdPeriod(uint64 blocks) external; function updateMinimumLiquidationCollateral(uint256 amount) external; - - /**************************/ - /* Public State Variables */ - /**************************/ - - function validatorPKs( - bytes32 validatorId - ) external view returns (address owner, bool active); - - function clusters( - bytes32 clusterId - ) external view returns (bytes32 clusterData); - - function operators( - uint64 operatorId - ) - external - view - returns ( - address operatorOwner, - uint64 fee, - uint32 validatorCount, - Snapshot memory snapshot - ); - - function operatorFeeChangeRequests( - uint64 operatorId - ) - external - view - returns (uint64 fee, uint64 approvalBeginTime, uint64 approvalEndTime); - - function operatorsWhitelist( - uint64 operatorId - ) external view returns (address whitelisted); - - function network() - external - view - returns ( - uint64 networkFee, - uint64 networkFeeIndex, - uint64 networkFeeIndexBlockNumber - ); - - function dao() - external - view - returns (uint32 validatorCount, uint64 balance, uint64 block); - - function minimumBlocksBeforeLiquidation() external view returns (uint64); - - function minimumLiquidationCollateral() external view returns (uint64); - - function operatorMaxFeeIncrease() external view returns (uint64); - - function executeOperatorFeePeriod() external view returns (uint64); - - function declareOperatorFeePeriod() external view returns (uint64); - - function version() external view returns (bytes32); } diff --git a/contracts/ethereum/src/vendor/interfaces/ISSVNetworkCore.sol b/contracts/ethereum/src/vendor/interfaces/ISSVNetworkCore.sol index 7f5bc6f92..e7a5562ce 100644 --- a/contracts/ethereum/src/vendor/interfaces/ISSVNetworkCore.sol +++ b/contracts/ethereum/src/vendor/interfaces/ISSVNetworkCore.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.18; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + interface ISSVNetworkCore { /***********/ /* Structs */ @@ -37,8 +39,8 @@ interface ISSVNetworkCore { uint32 validatorCount; uint64 networkFeeIndex; uint64 index; - bool active; uint256 balance; + bool active; } struct DAO { @@ -61,7 +63,7 @@ interface ISSVNetworkCore { error CallerNotWhitelisted(); error FeeTooLow(); error FeeExceedsIncreaseLimit(); - error NoFeeDeclared(); + error NoFeeDelcared(); error ApprovalNotWithinTimeframe(); error OperatorDoesNotExist(); error InsufficientBalance(); @@ -81,7 +83,4 @@ interface ISSVNetworkCore { error TokenTransferFailed(); error SameFeeChangeNotAllowed(); error FeeIncreaseNotAllowed(); - error NotAuthorized(); - error OperatorsListNotUnique(); - error OperatorAlreadyExists(); } diff --git a/contracts/ethereum/src/vendor/interfaces/ISSVNetworkViews.sol b/contracts/ethereum/src/vendor/interfaces/ISSVNetworkViews.sol deleted file mode 100644 index 12ee7a065..000000000 --- a/contracts/ethereum/src/vendor/interfaces/ISSVNetworkViews.sol +++ /dev/null @@ -1,100 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity 0.8.18; - -import "./ISSVNetworkCore.sol"; -import "./ISSVNetwork.sol"; - -interface ISSVNetworkViews is ISSVNetworkCore { - /****************/ - /* Initializers */ - /****************/ - - /** - * @dev Initializes the contract. - * @param ssvNetwork_ The SSVNetwork contract. - */ - function initialize(ISSVNetwork ssvNetwork_) external; - - /*************************************/ - /* Validator External View Functions */ - /*************************************/ - - function getValidator( - bytes calldata publicKey - ) external returns (address, bool); - - /************************************/ - /* Operator External View Functions */ - /************************************/ - - function getOperatorFee(uint64 operatorId) external returns (uint256); - - function getOperatorDeclaredFee( - uint64 operatorId - ) external returns (uint256, uint256, uint256); - - function getOperatorById( - uint64 operatorId - ) - external - view - returns ( - address owner, - uint256 fee, - uint32 validatorCount, - bool isPrivate, - bool active - ); - - /*******************************/ - /* Cluster External View Functions */ - /*******************************/ - - function isLiquidatable( - address owner, - uint64[] memory operatorIds, - ISSVNetwork.Cluster memory cluster - ) external returns (bool); - - function isLiquidated( - address owner, - uint64[] memory operatorIds, - ISSVNetwork.Cluster memory cluster - ) external returns (bool); - - function getBurnRate( - address owner, - uint64[] memory operatorIds, - ISSVNetwork.Cluster memory cluster - ) external returns (uint256); - - /***********************************/ - /* Balance External View Functions */ - /***********************************/ - - function getOperatorEarnings(uint64 operatorId) external returns (uint256); - - function getBalance( - address owner, - uint64[] memory operatorIds, - ISSVNetwork.Cluster memory cluster - ) external returns (uint256); - - /*******************************/ - /* DAO External View Functions */ - /*******************************/ - - function getNetworkFee() external returns (uint256); - - function getNetworkEarnings() external returns (uint256); - - function getOperatorFeeIncreaseLimit() external returns (uint64); - - function getExecuteOperatorFeePeriod() external returns (uint64); - - function getDeclaredOperatorFeePeriod() external returns (uint64); - - function getLiquidationThresholdPeriod() external returns (uint64); - - function getMinimumLiquidationCollateral() external returns (uint256); -} diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index f0a72ddbe..fdfbdd1ad 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -7,11 +7,11 @@ import { initiatePoolDeposit } from '@casimir/ethereum/helpers/dkg' import { round } from '@casimir/ethereum/helpers/math' import { ContractConfig, DeploymentConfig } from '@casimir/types' -const getSweptBalanceFunctionSignature = ethers.utils.id('getSweptBalance()').slice(0, 10) -console.log(getSweptBalanceFunctionSignature) +const getSweptBalance = ethers.utils.id('getSweptBalance()').slice(0, 10) +console.log(getSweptBalance) -const getValidatorPublicKeysFunctionSignature = ethers.utils.id('getValidatorPublicKeys()').slice(0, 10) -console.log(getValidatorPublicKeysFunctionSignature) +const getValidatorPublicKeys = ethers.utils.id('getValidatorPublicKeys()').slice(0, 10) +console.log(getValidatorPublicKeys) /** Fixture to deploy SSV manager contract */ export async function deploymentFixture() { diff --git a/package-lock.json b/package-lock.json index b22a5a1f1..9c8ca0ef5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -270,7 +270,7 @@ "@types/node": "^17.0.45", "chai": "^4.3.6", "esno": "^0.16.3", - "ganache": "^7.7.1", + "ganache": "^7.8.0", "hardhat": "^2.12.2", "localtunnel": "^2.0.2", "minimist": "^1.2.8", @@ -313,6 +313,11 @@ "constructs": "^10.0.0" } }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.0.tgz", + "integrity": "sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ==" + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -4112,7 +4117,6 @@ "version": "1.7.1", "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", - "dev": true, "funding": [ { "type": "individual", @@ -7097,6 +7101,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -7105,6 +7110,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -7279,6 +7285,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, "engines": { "node": ">=8" } @@ -8910,6 +8917,7 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", + "dev": true, "engines": { "node": ">= 0.8.0" } @@ -9349,6 +9357,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -9359,7 +9368,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==", + "dev": true }, "node_modules/colorette": { "version": "2.0.20", @@ -13103,6 +13113,7 @@ "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, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -14840,6 +14851,7 @@ "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, "engines": { "node": ">= 4" } @@ -17503,7 +17515,9 @@ "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "peer": true }, "node_modules/lodash.uniqby": { "version": "4.7.0", @@ -21305,6 +21319,7 @@ "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, "engines": { "node": ">=0.10.0" } @@ -22763,6 +22778,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -23168,6 +23184,8 @@ "version": "6.8.1", "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "peer": true, "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -23216,6 +23234,8 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -23230,12 +23250,16 @@ "node_modules/table/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==", + "dev": true, + "peer": true }, "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, + "peer": true, "engines": { "node": ">=8" } @@ -23243,12 +23267,16 @@ "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", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "peer": true }, "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, + "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -23265,6 +23293,8 @@ "version": "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, + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -27132,6 +27162,7 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "dev": true, "engines": { "node": ">= 14" } @@ -27420,7 +27451,7 @@ "name": "@casimir/dkg", "version": "0.0.1", "dependencies": { - "ethers": "^5.7.2" + "ethers": "^6.3.0" }, "devDependencies": { "@types/cors": "^2.8.12", @@ -27432,6 +27463,22 @@ "zx": "^7.1.1" } }, + "services/dkg/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/" + } + ] + }, + "services/dkg/node_modules/aes-js": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.3.tgz", + "integrity": "sha512-/xJX0/VTPcbc5xQE2VUP91y1xN8q/rDfhEzLm+vLc3hYvb5+qHCnpJRuFcrKn63zumK/sCwYYzhG8HP78JYSTA==" + }, "services/dkg/node_modules/esbuild": { "version": "0.15.18", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", @@ -27469,6 +27516,57 @@ "esbuild-windows-arm64": "0.15.18" } }, + "services/dkg/node_modules/ethers": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.3.0.tgz", + "integrity": "sha512-CKFYvTne1YT4S1glTiu7TgGsj0t6c6GAD7evrIk8zbeUb6nK8dcUPAiAWM8uDX/1NmRTvLM9+1Vnn49hwKtEzw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.9.0", + "@noble/hashes": "1.1.2", + "@noble/secp256k1": "1.7.1", + "aes-js": "4.0.0-beta.3", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "services/dkg/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "services/dkg/node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "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 + } + } + }, "services/users": { "name": "@casimir/users", "version": "0.0.1", diff --git a/services/dkg/package.json b/services/dkg/package.json index 786b660cf..c836c591c 100644 --- a/services/dkg/package.json +++ b/services/dkg/package.json @@ -11,7 +11,7 @@ "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { - "ethers": "^5.7.2" + "ethers": "^6.3.0" }, "devDependencies": { "@types/cors": "^2.8.12", @@ -22,4 +22,4 @@ "esno": "^0.16.3", "zx": "^7.1.1" } -} \ No newline at end of file +} diff --git a/services/dkg/scripts/dev.ts b/services/dkg/scripts/dev.ts index 8e6988063..eb27c0b83 100644 --- a/services/dkg/scripts/dev.ts +++ b/services/dkg/scripts/dev.ts @@ -3,6 +3,9 @@ import { fetchRetry, run } from '@casimir/helpers' const resourcePath = 'scripts/resources/rockx-dkg-cli' void async function () { + process.env.BIP39_PATH_INDEX = '6' + process.env.MANAGER_ADDRESS = process.env.PUBLIC_MANAGER_ADDRESS + process.env.SSV_ADDRESS = '0xAfdb141Dd99b5a101065f40e3D7636262dce65b3' process.env.CLI_PATH = `./${resourcePath}/build/bin/rockx-dkg-cli` process.env.MESSENGER_SRV_ADDR = 'http://0.0.0.0:3000' process.env.USE_HARDCODED_OPERATORS = 'true' diff --git a/services/dkg/src/index.ts b/services/dkg/src/index.ts index 32c639288..38596e036 100644 --- a/services/dkg/src/index.ts +++ b/services/dkg/src/index.ts @@ -1,28 +1,26 @@ import { config } from './providers/config' import { getEventEmitter } from './providers/events' -import { initiatePoolDepositCommand, initiatePoolExitCommand, initiatePoolReshareCommand } from './providers/commands' +import { initiatePoolDepositHandler, initiatePoolExitHandler, initiatePoolReshareHandler } from './providers/handlers' -const { manager, signer, cliPath, messengerUrl } = config() - -const commands = { - PoolDepositRequested: initiatePoolDepositCommand, - PoolReshareRequested: initiatePoolReshareCommand, - PoolExitRequested: initiatePoolExitCommand +const handlers = { + PoolDepositRequested: initiatePoolDepositHandler, + PoolReshareRequested: initiatePoolReshareHandler, + PoolExitRequested: initiatePoolExitHandler } -const eventEmitter = getEventEmitter({ manager, events: Object.keys(commands) }) - ;(async function () { + const { manager, ssv, provider, signer, cliPath, messengerUrl } = await config() + + const eventEmitter = await getEventEmitter({ manager, events: Object.keys(handlers) }) for await (const event of eventEmitter) { const [ id, details ] = event + const { filter } = details - console.log(`Received ${details.event} event for pool ${id}`) - - const command = commands[details.event as keyof typeof commands] - if (!command) throw new Error(`No command found for event ${details.event}`) + console.log(`Event ${filter} received for pool ${Number(id)}`) - console.log(`Executing ${details.event} command for pool ${id}`) - await command({ manager, signer, cliPath, messengerUrl, id }) + const handler = handlers[filter as keyof typeof handlers] + if (!handler) throw new Error(`No handler found for event ${filter}`) + await handler({ manager, ssv, provider, signer, cliPath, messengerUrl, id: Number(id) }) } })() diff --git a/services/dkg/src/interfaces/ClusterInput.ts b/services/dkg/src/interfaces/ClusterInput.ts new file mode 100644 index 000000000..41824ac86 --- /dev/null +++ b/services/dkg/src/interfaces/ClusterInput.ts @@ -0,0 +1,13 @@ +import { ISSVNetwork } from '@casimir/ethereum/build/artifacts/types' +import { ethers } from 'ethers' + +export interface ClusterInput { + /** SSV network contract */ + ssv: ISSVNetwork & ethers.Contract + /** Operator IDs */ + operatorIds: number[] + /** JSON RPC node provider */ + provider: ethers.JsonRpcProvider + /** Withdrawal address */ + withdrawalAddress: string +} \ No newline at end of file diff --git a/services/dkg/src/interfaces/CommandOptions.ts b/services/dkg/src/interfaces/CommandOptions.ts deleted file mode 100644 index 3bfa0c683..000000000 --- a/services/dkg/src/interfaces/CommandOptions.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' -import { ethers } from 'ethers' - -export interface CommandOptions { - /** Manager contract */ - manager: ethers.Contract & CasimirManager - /** Command signer */ - signer: ethers.Signer - /** DKG cli path */ - cliPath: string - /** DKG messenger service URL */ - messengerUrl: string - /** Pool ID */ - id: number -} \ No newline at end of file diff --git a/services/dkg/src/interfaces/CreateValidatorInput.ts b/services/dkg/src/interfaces/CreateValidatorInput.ts new file mode 100644 index 000000000..dce846295 --- /dev/null +++ b/services/dkg/src/interfaces/CreateValidatorInput.ts @@ -0,0 +1,13 @@ +import { ISSVNetwork } from '@casimir/ethereum/build/artifacts/types' +import { ethers } from 'ethers' + +export interface CreateValidatorInput { + /** SSV network contract */ + ssv: ISSVNetwork & ethers.Contract + /** Operator registry IDs */ + operatorIds: number[] + /** JSON RPC provider */ + provider: ethers.JsonRpcProvider + /** Validator withdrawal address */ + withdrawalAddress: string +} \ No newline at end of file diff --git a/services/dkg/src/interfaces/CreateValidatorOptions.ts b/services/dkg/src/interfaces/CreateValidatorOptions.ts deleted file mode 100644 index 924250dcd..000000000 --- a/services/dkg/src/interfaces/CreateValidatorOptions.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface CreateValidatorOptions { - /** Operator registry IDs */ - operatorIds: number[] - /** Validator withdrawal address */ - withdrawalAddress: string -} \ No newline at end of file diff --git a/services/dkg/src/interfaces/DepositData.ts b/services/dkg/src/interfaces/DepositData.ts index c64e2787c..cd3aa4de7 100644 --- a/services/dkg/src/interfaces/DepositData.ts +++ b/services/dkg/src/interfaces/DepositData.ts @@ -1,7 +1,7 @@ export interface DepositData { - depositDataRoot: string; - publicKey: string; - signature: string; + depositDataRoot: string + publicKey: string + signature: string /** Contract address formatted as withdrawal credentials */ - withdrawalCredentials: string; + withdrawalCredentials: string } \ No newline at end of file diff --git a/services/dkg/src/interfaces/DepositDataInput.ts b/services/dkg/src/interfaces/DepositDataInput.ts new file mode 100644 index 000000000..0f22396f8 --- /dev/null +++ b/services/dkg/src/interfaces/DepositDataInput.ts @@ -0,0 +1,6 @@ +export interface DepositDataInput { + /** Ceremony ID */ + ceremonyId: string + /** Withdrawal address */ + withdrawalAddress: string +} \ No newline at end of file diff --git a/services/dkg/src/interfaces/HandlerInput.ts b/services/dkg/src/interfaces/HandlerInput.ts new file mode 100644 index 000000000..d0616796b --- /dev/null +++ b/services/dkg/src/interfaces/HandlerInput.ts @@ -0,0 +1,19 @@ +import { ethers } from 'ethers' +import { CasimirManager, ISSVNetwork } from '@casimir/ethereum/build/artifacts/types' + +export interface HandlerInput { + /** Manager contract */ + manager: CasimirManager & ethers.Contract + /** SSV network contract */ + ssv: ISSVNetwork & ethers.Contract + /** JSON RPC node provider */ + provider: ethers.JsonRpcProvider + /** Transaction signer */ + signer: ethers.Signer + /** DKG cli path */ + cliPath: string + /** DKG messenger service URL */ + messengerUrl: string + /** Pool ID */ + id: number +} \ No newline at end of file diff --git a/services/dkg/src/interfaces/KeyGenerationInput.ts b/services/dkg/src/interfaces/KeyGenerationInput.ts deleted file mode 100644 index 50ffb1269..000000000 --- a/services/dkg/src/interfaces/KeyGenerationInput.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface KeyGenerationInput { - /** Operator map with DKG endpoints */ - operators: Record; - /** Withdrawal address */ - withdrawalAddress: string; -} \ No newline at end of file diff --git a/services/dkg/src/interfaces/KeygenInput.ts b/services/dkg/src/interfaces/KeygenInput.ts new file mode 100644 index 000000000..c8397208e --- /dev/null +++ b/services/dkg/src/interfaces/KeygenInput.ts @@ -0,0 +1,6 @@ +export interface KeygenInput { + /** Operator map with DKG endpoints */ + operators: Record + /** Withdrawal address */ + withdrawalAddress: string +} \ No newline at end of file diff --git a/services/dkg/src/interfaces/ReshareInput.ts b/services/dkg/src/interfaces/ReshareInput.ts index b65dedb65..0f3c9db02 100644 --- a/services/dkg/src/interfaces/ReshareInput.ts +++ b/services/dkg/src/interfaces/ReshareInput.ts @@ -1,8 +1,8 @@ export interface ReshareInput { /** Operator map with DKG endpoints */ - operators: Record; + operators: Record /** Validator public key */ - publicKey: string; + publicKey: string /** Old operator registry IDs */ - oldOperators: Record; + oldOperators: Record } \ No newline at end of file diff --git a/services/dkg/src/interfaces/ReshareValidatorInput.ts b/services/dkg/src/interfaces/ReshareValidatorInput.ts new file mode 100644 index 000000000..f80fb9078 --- /dev/null +++ b/services/dkg/src/interfaces/ReshareValidatorInput.ts @@ -0,0 +1,17 @@ +import { ISSVNetwork } from '@casimir/ethereum/build/artifacts/types' +import { ethers } from 'ethers' + +export interface ReshareValidatorInput { + /** SSV network contract */ + ssv: ISSVNetwork & ethers.Contract + /** JSON RPC provider */ + provider: ethers.JsonRpcProvider + /** Operator registry IDs */ + operatorIds: number[] + /** Validator public key */ + publicKey: string + /** Old operator registry IDs */ + oldOperatorIds: number[] + /** Validator withdrawal address */ + withdrawalAddress: string +} \ No newline at end of file diff --git a/services/dkg/src/interfaces/ReshareValidatorOptions.ts b/services/dkg/src/interfaces/ReshareValidatorOptions.ts deleted file mode 100644 index 7bbdfa81c..000000000 --- a/services/dkg/src/interfaces/ReshareValidatorOptions.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface ReshareValidatorOptions { - /** Operator registry IDs */ - operatorIds: number[]; - /** Validator public key */ - publicKey: string; - /** Old operator registry IDs */ - oldOperatorIds: number[]; - /** Validator withdrawal address */ - withdrawalAddress: string -} \ No newline at end of file diff --git a/services/dkg/src/providers/commands.ts b/services/dkg/src/providers/commands.ts deleted file mode 100644 index 558c62afb..000000000 --- a/services/dkg/src/providers/commands.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { ethers } from 'ethers' -import { DKG } from './dkg' -import { CommandOptions } from '../interfaces/CommandOptions' -import fs from 'fs' - -export async function initiatePoolDepositCommand(options: CommandOptions) { - const { manager, signer, cliPath, messengerUrl } = options - const newOperatorGroup = [1, 2, 3, 4] // Todo get new group here - const ssv = new DKG({ cliPath, messengerUrl }) - const validator = await ssv.createValidator({ operatorIds: newOperatorGroup, withdrawalAddress: manager.address }) - - // Save validator for mocks - const validators = JSON.parse(fs.readFileSync('./scripts/.out/validators.json', 'utf8')) - validators[Date.now()] = validator - fs.writeFileSync('./scripts/.out/validators.json', JSON.stringify(validators, null, 4)) - - const { - depositDataRoot, - publicKey, - operatorIds, - shares, - signature, - withdrawalCredentials - } = validator - const initiatePoolDeposit = await manager.connect(signer).initiatePoolDeposit( - depositDataRoot, - publicKey, - operatorIds, - shares, - signature, - withdrawalCredentials, - ethers.utils.parseEther('0.1') // Mock fee amount estimate ~ 10 SSV - ) - return await initiatePoolDeposit.wait() -} - -export async function initiatePoolReshareCommand(options: CommandOptions) { - const { manager, signer, cliPath, messengerUrl, id } = options - - // Todo reshare event will include the operator to boot - - // Get pool to reshare - const pool = await manager.getPool(id) - const { publicKey, operatorIds } = pool - - // Todo old operators and new operators only different by 1 operator - const newOperatorGroup = [1, 2, 3, 4] - - // Get operators to sign reshare - const ssv = new DKG({ cliPath, messengerUrl }) - const validator = await ssv.reshareValidator({ publicKey, operatorIds: newOperatorGroup, oldOperatorIds: operatorIds, withdrawalAddress: manager.address }) - - - // Submit new shares to pool - -} - -export async function initiatePoolExitCommand(options: CommandOptions) { - const { manager, signer, cliPath, messengerUrl, id } = options - - // Get pool to exit - const pool = await manager.getPool(id) - const { publicKey, operatorIds } = pool - - // Get operators to sign exit - const ssv = new DKG({ cliPath, messengerUrl }) - - // Broadcast exit signature - -} \ No newline at end of file diff --git a/services/dkg/src/providers/config.ts b/services/dkg/src/providers/config.ts index 70d23bcb3..6dea4cd97 100644 --- a/services/dkg/src/providers/config.ts +++ b/services/dkg/src/providers/config.ts @@ -1,21 +1,27 @@ import { ethers } from 'ethers' import CasimirManagerJson from '@casimir/ethereum/build/artifacts/src/CasimirManager.sol/CasimirManager.json' -import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' +import SSVNetworkJson from '@casimir/ethereum/build/artifacts/src/vendor/interfaces/ISSVNetwork.sol/ISSVNetwork.json' +import { CasimirManager, ISSVNetwork } from '@casimir/ethereum/build/artifacts/types' -export function config() { +export async function config() { const url = process.env.ETHEREUM_RPC_URL if (!url) throw new Error('No rpc url provided') - const provider = new ethers.providers.JsonRpcProvider(url) + const provider = new ethers.JsonRpcProvider(url) const mnemonic = process.env.BIP39_SEED + const pathIndex = process.env.BIP39_PATH_INDEX if (!mnemonic) throw new Error('No mnemonic provided') - const wallet = ethers.Wallet.fromMnemonic(mnemonic, 'm/44\'/60\'/0\'/0/6') - - const signer = wallet.connect(provider) + ethers.Wallet.fromPhrase(mnemonic, provider) + const accounts = await provider.listAccounts() + const signer = accounts[Number(pathIndex || 0)] - const managerAddress = process.env.PUBLIC_MANAGER_ADDRESS + const managerAddress = process.env.MANAGER_ADDRESS if (!managerAddress) throw new Error('No manager address provided') - const manager = new ethers.Contract(managerAddress, CasimirManagerJson.abi, signer) as ethers.Contract & CasimirManager + const manager = new ethers.Contract(managerAddress, CasimirManagerJson.abi, provider) as CasimirManager & ethers.Contract + + const ssvAddress = process.env.SSV_ADDRESS + if (!ssvAddress) throw new Error('No ssv address provided') + const ssv = new ethers.Contract(ssvAddress, SSVNetworkJson.abi, provider) as ISSVNetwork & ethers.Contract const cliPath = process.env.CLI_PATH if (!cliPath) throw new Error('No cli path provided') @@ -23,5 +29,5 @@ export function config() { const messengerUrl = process.env.MESSENGER_SRV_ADDR if (!messengerUrl) throw new Error('No messenger url provided') - return { manager, signer, cliPath, messengerUrl } + return { manager, ssv, provider, signer, cliPath, messengerUrl } } diff --git a/services/dkg/src/providers/dkg.ts b/services/dkg/src/providers/dkg.ts index 88d647d36..485e67cd6 100644 --- a/services/dkg/src/providers/dkg.ts +++ b/services/dkg/src/providers/dkg.ts @@ -1,13 +1,18 @@ import fs from 'fs' -import { KeyGenerationInput } from '../interfaces/KeyGenerationInput' +import { KeygenInput } from '../interfaces/KeygenInput' import { DepositData } from '../interfaces/DepositData' import { DKGOptions } from '../interfaces/DKGOptions' import { ReshareInput } from '../interfaces/ReshareInput' -import { getWithdrawalCredentials, runSync } from '@casimir/helpers' -import { CreateValidatorOptions } from '../interfaces/CreateValidatorOptions' -import { Validator } from '@casimir/types' -import { ReshareValidatorOptions } from '../interfaces/ReshareValidatorOptions' +import { getWithdrawalCredentials, runRetry } from '@casimir/helpers' +import { CreateValidatorInput } from '../interfaces/CreateValidatorInput' +import { Validator, Cluster } from '@casimir/types' +import { ReshareValidatorInput } from '../interfaces/ReshareValidatorInput' import { operatorStore } from '@casimir/data' +import { ClusterInput } from '../interfaces/ClusterInput' +import { DepositDataInput } from '../interfaces/DepositDataInput' +import { ethers } from 'ethers' + +const lastPoolId = 0 export class DKG { /** DKG CLI path */ @@ -22,20 +27,16 @@ export class DKG { /** * Create validator with operator key shares and deposit data - * @param {CreateValidatorOptions} options - Options for creating a validator + * @param {CreateValidatorInput} input - Input for creating a validator * @returns {Promise} Validator with operator key shares and deposit data - * @example - * const validator = await createValidator({ - * operatorIds: [1, 2, 3, 4], - * withdrawalAddress: '0x07e05700cb4e946ba50244e27f01805354cd8ef0' - * }) */ - async createValidator(options: CreateValidatorOptions): Promise { - const { operatorIds, withdrawalAddress } = options - const operators = this.getOperatorGroup(operatorIds) + async createValidator(input: CreateValidatorInput): Promise { + const { provider, ssv, operatorIds, withdrawalAddress } = input + + const operators = this.getOperatorUrls(operatorIds) /** Start a key generation ceremony with the given operators */ - const ceremonyId = await this.startKeyGeneration({ operators, withdrawalAddress }) + const ceremonyId = await this.startKeygen({ operators, withdrawalAddress }) console.log(`Started ceremony with ID ${ceremonyId}`) /** Wait for ceremony to complete */ @@ -45,14 +46,18 @@ export class DKG { const shares = await this.getShares(ceremonyId) /** Get validator deposit data */ - const { depositDataRoot, publicKey, signature, withdrawalCredentials } = await this.getDepositData(ceremonyId, withdrawalAddress) + const { depositDataRoot, publicKey, signature, withdrawalCredentials } = await this.getDepositData({ ceremonyId, withdrawalAddress }) + + /** Get SSV cluster snapshot */ + const cluster = await this.getCluster({ ssv, operatorIds, provider, withdrawalAddress }) /** Create validator */ const validator: Validator = { depositDataRoot, publicKey, - operatorIds, + operatorIds, shares, + cluster, signature, withdrawalCredentials } @@ -62,23 +67,13 @@ export class DKG { /** * Reshare validator for new operator key shares and deposit data - * @param {ReshareValidatorOptions} options - Options for resharing a validator + * @param {ReshareValidatorInput} input - Input for resharing a validator * @returns {Promise} Validator with operator key shares and deposit data - * @example - * const validator = await reshareValidator({ - * operatorIds: [1, 2, 3, 4], - * publicKey: '0x8eb0f05adc697cdcbdf8848f7f1e8c2277f4fc7b0efc97ceb87ce75286e4328db7259fc0c1b39ced0c594855a30d415c', - * oldOperators: { - * "2": "http://0.0.0.0:8082", - * "3": "http://0.0.0.0:8083", - * "4": "http://0.0.0.0:8084" - * } - * }) */ - async reshareValidator(options: ReshareValidatorOptions): Promise { - const { operatorIds, publicKey, oldOperatorIds, withdrawalAddress } = options - const operators = this.getOperatorGroup(operatorIds) - const oldOperators = this.getOperatorGroup(oldOperatorIds) + async reshareValidator(input: ReshareValidatorInput): Promise { + const { ssv, provider, operatorIds, publicKey, oldOperatorIds, withdrawalAddress } = input + const operators = this.getOperatorUrls(operatorIds) + const oldOperators = this.getOperatorUrls(oldOperatorIds) /** Start a key generation ceremony with the given operators */ const ceremonyId = await this.startReshare({ operators, publicKey, oldOperators }) @@ -88,14 +83,18 @@ export class DKG { const shares = await this.getShares(ceremonyId) /** Get validator deposit data */ - const { depositDataRoot, signature, withdrawalCredentials } = await this.getDepositData(ceremonyId, withdrawalAddress) + const { depositDataRoot, signature, withdrawalCredentials } = await this.getDepositData({ ceremonyId, withdrawalAddress }) + + /** Get SSV cluster snapshot */ + const cluster = await this.getCluster({ ssv, operatorIds, provider, withdrawalAddress }) /** Create validator */ const validator: Validator = { depositDataRoot, publicKey, - operatorIds, + operatorIds, shares, + cluster, signature, withdrawalCredentials } @@ -104,77 +103,27 @@ export class DKG { } /** - * Get operator group from operator IDs - * @param {number[]} operatorIds - Array of operator IDs - * @returns {} Operator group - * @example - * const group = getOperatorGroup([1, 2, 3, 4]) - * console.log(group) - * // => { - * // "1": "http://0.0.0.0:8081", - * // "2": "http://0.0.0.0:8082", - * // "3": "http://0.0.0.0:8083", - * // "4": "http://0.0.0.0:8084" - * // } - */ - getOperatorGroup(operatorIds: number[]): Record { - return operatorIds.reduce((group: Record, id: number) => { - const key = id.toString() as keyof typeof operatorStore - group[key] = operatorStore[key] - return group - }, {}) - } - - /** - * Start a new key generation ceremony - * @param {KeyGenerationInput} input - Key generation input + * Start a keygen ceremony + * @param {KeygenInput} input - Keygen input * @returns {Promise} Ceremony ID - * @example - * const id = await startKeyGeneration({ - * operators: { - * "1": "http://host.docker.internal:8081", - * "2": "http://host.docker.internal:8082", - * "3": "http://host.docker.internal:8083", - * "4": "http://host.docker.internal:8084" - * }, - * withdrawalAddress: '0x07e05700cb4e946ba50244e27f01805354cd8ef0' - * }) - * console.log(id) - * // => "b7e8b0e0-5c1a-4b1e-9b1e-8c1c1c1c1c1c" */ - async startKeyGeneration(input: KeyGenerationInput): Promise { + async startKeygen(input: KeygenInput): Promise { const { operators, withdrawalAddress } = input const operatorFlags = Object.entries(operators).map(([id, url]) => `--operator ${id}=${url}`).join(' ') const thresholdFlag = `--threshold ${Object.keys(operators).length - 1}` const withdrawalCredentialsFlag = `--withdrawal-credentials ${getWithdrawalCredentials(withdrawalAddress)}` const forkVersionFlag = '--fork-version prater' const command = `${this.cliPath} keygen ${operatorFlags} ${thresholdFlag} ${withdrawalCredentialsFlag} ${forkVersionFlag}` - const startKeyGeneration = runSync(`${command}`).toString().trim() as string - const ceremonyId = startKeyGeneration.split(' ').pop() as string - return ceremonyId + + console.log('Running command', command) + const ceremony = await runRetry(`${command}`) as string + return ceremony.trim().split(' ').pop() as string } /** - * Start a resharing ceremony - * @param {ReshareInput} input - Reshare input + * Start a reshare ceremony + * @param {ReshareInput} input - Operator IDs, public key, and old operator IDs * @returns {Promise} Ceremony ID - * @example - * const id = await startReshare({ - * operators: { - * "2": "http://host.docker.internal:8082", - * "3": "http://host.docker.internal:8083", - * "4": "http://host.docker.internal:8084", - * "5": "http://host.docker.internal:8085" - * }, - * publicKey: '0x8eb0f05adc697cdcbdf8848f7f1e8c2277f4fc7b0efc97ceb87ce75286e4328db7259fc0c1b39ced0c594855a30d415c', - * oldOperators: { - * "2": "http://host.docker.internal:8082", - * "3": "http://host.docker.internal:8083", - * "4": "http://host.docker.internal:8084" - * } - * }) - * console.log(id) - * // => "b7e8b0e0-5c1a-4b1e-9b1e-8c1c1c1c1c1c" */ async startReshare(input: ReshareInput): Promise { const { operators, publicKey, oldOperators } = input @@ -183,62 +132,46 @@ export class DKG { const publicKeyFlag = `--validator-public-key ${publicKey}` const oldOperatorFlags = Object.entries(oldOperators).map(([id, url]) => `--old-operator ${id}=${url}`).join(' ') const command = `${this.cliPath} reshare ${operatorFlags} ${thresholdFlag} ${publicKeyFlag} ${oldOperatorFlags}` - const startReshare = runSync(`${command}`).toString().trim() as string - const ceremonyId = startReshare.split(' ').pop() as string - return ceremonyId + const ceremony = await runRetry(`${command}`) as string + return ceremony.trim().split(' ').pop() as string } /** - * Get key generation shares and public keys + * Get combined shares * @param {string} ceremonyId - Ceremony ID - * @returns {Promise} Arrays of shares and public keys - * @example - * const shares = await getShares('b7e8b0e0-5c1a-4b1e-9b1e-8c1c1c1c1c1c') - * console.log(shares) - * // => { - * // encryptedKeys: ["0x000000...", ...], - * // publicKeys: ["0x000000...", ...] - * // } + * @returns {Promise} Combined shares */ async getShares(ceremonyId: string): Promise { const requestIdFlag = `--request-id ${ceremonyId}` const command = `${this.cliPath} get-keyshares ${requestIdFlag}` - const getShares = runSync(`${command}`).toString().trim() as string - const sharesFile = getShares.split(' ').pop() as string - const sharesJSON = JSON.parse(fs.readFileSync(`${sharesFile}`, 'utf8')) - fs.rmSync(sharesFile) - return sharesJSON.payload.readable.shares + const download = await runRetry(`${command}`) as string + const file = download.trim().split(' ').pop() as string + const json = JSON.parse(fs.readFileSync(`${file}`, 'utf8')) + fs.rmSync(file) + return json.payload.readable.shares } /** - * Get key generation deposit data - * @param {string} ceremonyId - Ceremony ID + * Get deposit data + * @param {DepositDataInput} input - Ceremony ID and withdrawal address * @returns {Promise} Deposit data - * @example - * const depositData = await getDepositData('b7e8b0e0-5c1a-4b1e-9b1e-8c1c1c1c1c1c') - * console.log(depositData) - * // => { - * // depositDataRoot: "0x000000...", - * // publicKey: "0x000000...", - * // signature: "0x000000...", - * // withdrawalCredentials: "0x000000..." - * // } */ - async getDepositData(ceremonyId: string, withdrawalAddress: string): Promise { + async getDepositData(input: DepositDataInput): Promise { + const { ceremonyId, withdrawalAddress } = input const requestIdFlag = `--request-id ${ceremonyId}` const withdrawalCredentialsFlag = `--withdrawal-credentials 01${'0'.repeat(22)}${withdrawalAddress.split('0x')[1]}` const forkVersionFlag = '--fork-version prater' const command = `${this.cliPath} generate-deposit-data ${requestIdFlag} ${withdrawalCredentialsFlag} ${forkVersionFlag}` - const getDepositData = runSync(`${command}`).toString().trim() as string - const depositDataFile = getDepositData.split(' ').pop() as string - const depositData = JSON.parse(fs.readFileSync(depositDataFile, 'utf8')) - fs.rmSync(depositDataFile) + const download = await runRetry(`${command}`) as string + const file = download.trim().split(' ').pop() as string + const json = JSON.parse(fs.readFileSync(file, 'utf8')) + fs.rmSync(file) const { deposit_data_root: depositDataRoot, pubkey: publicKey, signature, withdrawal_credentials: withdrawalCredentials - } = depositData + } = json return { depositDataRoot: `0x${depositDataRoot}`, publicKey: `0x${publicKey}`, @@ -246,4 +179,97 @@ export class DKG { withdrawalCredentials: `0x${withdrawalCredentials}` } } + + /** + * Get operator URLs + * @param {number[]} operatorIds - Operator IDs + * @returns {} Operator group + */ + getOperatorUrls(operatorIds: number[]): Record { + return operatorIds.reduce((group: Record, id: number) => { + const key = id.toString() as keyof typeof operatorStore + group[key] = operatorStore[key] + return group + }, {}) + } + + /** + * Get cluster snapshot + * @param {ClusterInput} input - Operator IDs and withdrawal address + * @returns {Promise} Cluster snapshot + */ + async getCluster(input: ClusterInput): Promise { + const { ssv, provider, operatorIds, withdrawalAddress } = input + + const DAY = 5400 + const WEEK = DAY * 7 + const MONTH = DAY * 30 + const latestBlockNumber = await provider.getBlockNumber() + let step = MONTH + let cluster + let biggestBlockNumber = 0 + + const eventList = [ + 'ClusterDeposited', + 'ClusterWithdrawn', + 'ValidatorAdded', + 'ValidatorRemoved', + 'ClusterLiquidated', + 'ClusterReactivated' + ] + + const topicFilter: ethers.TopicFilter = [] + for (const event of eventList) { + const topic = await ssv.filters[event](withdrawalAddress).getTopicFilter() + topicFilter.concat(topic) + } + + let fromBlock = latestBlockNumber - step + let toBlock = latestBlockNumber + + while (!cluster && fromBlock > 0) { + try { + const result = await provider.getLogs({ + address: await ssv.getAddress(), + fromBlock, + toBlock, + topics: topicFilter + }) + + for (const item of result) { + const { blockNumber, data, topics } = item + const log = ssv.interface.parseLog({ data, topics: topics as string[] }) + + const checkClusterEvent = eventList.includes(log.name) + const checkOwner = log.args.owner === withdrawalAddress + const checkOperators = JSON.stringify(log.args.operatorIds.map((value: string) => Number(value))) === JSON.stringify(operatorIds) + + if (checkClusterEvent && checkOwner && checkOperators) { + if (blockNumber > biggestBlockNumber) { + biggestBlockNumber = blockNumber + cluster = log.args.cluster + console.log('CLUSTER SNAPSHOT', cluster) + } + } + } + toBlock = fromBlock + } catch (e) { + console.error(e) + if (step === MONTH) { + step = WEEK + } else if (step === WEEK) { + step = DAY + } + } + fromBlock = toBlock - step + } + + return cluster || { + validatorCount: 0, + networkFeeIndex: 0, + index: 0, + balance: 0, + active: true + } + } } \ No newline at end of file diff --git a/services/dkg/src/providers/events.ts b/services/dkg/src/providers/events.ts index c6bcbdf3e..cd6856032 100644 --- a/services/dkg/src/providers/events.ts +++ b/services/dkg/src/providers/events.ts @@ -2,10 +2,17 @@ import { ethers } from 'ethers' import { on, EventEmitter } from 'events' import { mergeAsyncIterables } from './iterables' -export function getEventEmitter({ manager, events }: { manager: ethers.Contract, events: string[] }) { - return mergeAsyncIterables(events.map(event => getEvent({ manager, event }))) +export async function getEventEmitter({ manager, events }: { manager: ethers.Contract, events: string[] }) { + const iterables = [] + for (const event of events) { + const iterable = await getEvent({ manager, event }) + iterables.push(iterable) + } + return mergeAsyncIterables(iterables) } -function getEvent({ manager, event }: { manager: ethers.Contract, event: string }) { - return on(manager as unknown as EventEmitter, event) +async function getEvent({ manager, event }: { manager: ethers.Contract, event: string }) { + const emitter = new EventEmitter() + await manager.on(event, (...args) => emitter.emit(event, ...args)) + return on(emitter as EventEmitter, event) } \ No newline at end of file diff --git a/services/dkg/src/providers/handlers.ts b/services/dkg/src/providers/handlers.ts new file mode 100644 index 000000000..4a2d7a80f --- /dev/null +++ b/services/dkg/src/providers/handlers.ts @@ -0,0 +1,85 @@ +import { ethers } from 'ethers' +import { DKG } from './dkg' +import { HandlerInput } from '../interfaces/HandlerInput' +import fs from 'fs' +import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' + +export async function initiatePoolDepositHandler(input: HandlerInput) { + const { manager, ssv, provider, signer, cliPath, messengerUrl } = input + const newOperatorIds = [1, 2, 3, 4] // Todo get new group here + const dkg = new DKG({ cliPath, messengerUrl }) + + const validator = await dkg.createValidator({ + ssv, + operatorIds: newOperatorIds, + provider, + withdrawalAddress: await manager.getAddress() + }) + + // Save validator for mocks + const validators = JSON.parse(fs.readFileSync('./scripts/.out/validators.json', 'utf8')) + validators[Date.now()] = validator + fs.writeFileSync('./scripts/.out/validators.json', JSON.stringify(validators, null, 4)) + + const { + depositDataRoot, + publicKey, + operatorIds, + shares, + cluster, + signature, + withdrawalCredentials + } = validator + + const initiatePoolDeposit = await (manager.connect(signer) as CasimirManager & ethers.Contract).initiatePoolDeposit( + depositDataRoot, + publicKey, + operatorIds, + shares, + cluster, + signature, + withdrawalCredentials, + ethers.parseEther('0.1') // Mock fee amount estimate ~ 10 SSV + ) + await initiatePoolDeposit.wait() +} + +export async function initiatePoolReshareHandler(input: HandlerInput) { + const { manager, signer, cliPath, messengerUrl, id } = input + + // Todo reshare event will include the operator to boot + + // Get pool to reshare + const pool = await manager.getPool(id) + const { publicKey, operatorIds } = pool + + // Todo old operators and new operators only different by 1 operator + const newOperatorGroup = [1, 2, 3, 4] + + // Get operators to sign reshare + const dkg = new DKG({ cliPath, messengerUrl }) + // const validator = await dkg.reshareValidator({ + // publicKey, + // operatorIds: newOperatorGroup, + // oldOperatorIds: operatorIds, + // withdrawalAddress: manager.address + // }) + + + // Submit new shares to pool + +} + +export async function initiatePoolExitHandler(input: HandlerInput) { + const { manager, signer, cliPath, messengerUrl, id } = input + + // Get pool to exit + const pool = await manager.getPool(id) + const { publicKey, operatorIds } = pool + + // Get operators to sign exit + const dkg = new DKG({ cliPath, messengerUrl }) + + // Broadcast exit signature + +} \ No newline at end of file diff --git a/services/dkg/src/providers/signer.ts b/services/dkg/src/providers/signer.ts deleted file mode 100644 index 4125cfd49..000000000 --- a/services/dkg/src/providers/signer.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { ethers } from 'ethers' - -export class SignerWithAddress extends ethers.Signer { - public static async create(signer: ethers.providers.JsonRpcSigner) { - return new SignerWithAddress(await signer.getAddress(), signer) - } - - private constructor( - public readonly address: string, - private readonly _signer: ethers.providers.JsonRpcSigner - ) { - super(); - (this as any).provider = _signer.provider - } - - public async getAddress(): Promise { - return this.address - } - - public signMessage(message: string | ethers.utils.Bytes): Promise { - return this._signer.signMessage(message) - } - - public signTransaction( - transaction: ethers.utils.Deferrable - ): Promise { - return this._signer.signTransaction(transaction) - } - - public sendTransaction( - transaction: ethers.utils.Deferrable - ): Promise { - return this._signer.sendTransaction(transaction) - } - - public connect(provider: ethers.providers.Provider): SignerWithAddress { - return new SignerWithAddress(this.address, this._signer.connect(provider)) - } - - public _signTypedData( - ...params: Parameters - ): Promise { - return this._signer._signTypedData(...params) - } - - public toJSON() { - return `` - } -} \ No newline at end of file From 5513cf24dfab1505df16e02b96c5c9cca6af8be7 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Fri, 19 May 2023 18:35:37 -0400 Subject: [PATCH 33/78] Integrate JIT clusters with testing --- common/data/src/mock/validator.store.json | 172 +++--- common/ssv/.gitignore | 2 + common/ssv/package.json | 16 + common/ssv/src/index.ts | 3 + .../ssv}/src/interfaces/ClusterInput.ts | 7 +- common/ssv/src/providers/clusters.ts | 95 +++ common/ssv/tsconfig.json | 19 + common/types/src/interfaces/Cluster.ts | 10 +- contracts/ethereum/docs/index.md | 286 +-------- contracts/ethereum/helpers/dkg.ts | 10 +- contracts/ethereum/scripts/dev.ts | 50 +- contracts/ethereum/src/CasimirManager.sol | 8 + contracts/ethereum/test/fixtures/shared.ts | 8 +- package-lock.json | 556 +++++++++--------- services/dkg/package.json | 2 +- services/dkg/scripts/dev.ts | 1 - services/dkg/src/index.ts | 17 +- .../src/interfaces/CreateValidatorInput.ts | 10 +- services/dkg/src/interfaces/HandlerInput.ts | 10 +- .../src/interfaces/ReshareValidatorInput.ts | 12 +- services/dkg/src/providers/config.ts | 27 +- services/dkg/src/providers/dkg.ts | 101 +--- services/dkg/src/providers/events.ts | 12 +- services/dkg/src/providers/handlers.ts | 12 +- 24 files changed, 615 insertions(+), 831 deletions(-) create mode 100644 common/ssv/.gitignore create mode 100644 common/ssv/package.json create mode 100644 common/ssv/src/index.ts rename {services/dkg => common/ssv}/src/interfaces/ClusterInput.ts (54%) create mode 100644 common/ssv/src/providers/clusters.ts create mode 100644 common/ssv/tsconfig.json diff --git a/common/data/src/mock/validator.store.json b/common/data/src/mock/validator.store.json index 57de97bad..7834341b1 100644 --- a/common/data/src/mock/validator.store.json +++ b/common/data/src/mock/validator.store.json @@ -1,262 +1,222 @@ { - "1684356213848": { - "depositDataRoot": "0x0211d3ed43d9a5566930d4936c51ce62b023b840e5bb1636d0743be3dc568292", - "publicKey": "0x9526a90f15cab7042c23563ea581c28baecb64c1c92a6818e0fc4b1ba19126fdec247dbf72f788c16443bfa495435dab", + "1684509224373": { + "depositDataRoot": "0x229bd3661012d438aaa2ab03b2091cae4ddc68554c7ef14c97f59a1514df0eb4", + "publicKey": "0xafa0e91b0c37c7e94c347fab9b08d0812067a09f7796a0329ce6060a847b4ce3be43684932e1b98dad1286ee8b4a6147", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c085daf774c63eebd61857388894bfaf6e95b11fb07b634d617243920d92d703a0cc5316bd54779c2521b07f0cf39e27a486d0652b7656f5c8c5d801bc054c79f433cb5b695d89ede42dfb71185a24e756dd6c3ad514c386262316d8f366bfee14a424e76bc75842ed3c9fe49ae4622a773118a4b0f7a31493acb05603b24f895071132515ffe4804ac2ca6ff55e1280bab7b1302a83939f4f262d57d8a59a40a92b00c9878b7b3879f578838f4ac29186ede0105dc04c2574c8079fc8b10bd5e6e767746dcedd7b87b671ae38d9fd3977cd7beb4ef5e9a75ce9b77a6f8d74dbde9f7346dbf7bedb6dc77b79bf356f7d1b71a6de778d3c7b575fe37d3871ad74d9f79fd7bd9af776b9d74d7773979ef5e75a73c7b46fcf1ef1f7f9db6777d1af1ee1c7f6f1b7bbd9d77beb87bad7addfeddf3af1aefbe9fd9cf74edfedbdfbf5be366f6e78f7b7387fc6bce347b8eb473aeb57b57b96ba6bcdddd1ad3bdbb7f4e1d7f66b7db97f869a736f5c777ef9d5a6ba7b6eb97f8d3679f6bbd5c77ae1d7f8efde37ebbe3cf1ad38f35d5ee1a6b5e34db77badf67b46b97b8db9eb4eb7e387dedf77776b9f35f77d9ed77ef5d7aeda6fbf1de5d77df3cd9b6f577d6bcef57f9e9fd3ad3877a69f7bad3cd1e75ee77f1d6bd7f4d1f7f77dbe3977cddfeb969eef7d397b7f78f5f6f877ad7bedff7bf7875c7796df7db75fddff1cef5db57bde376fa7f6775d75d3877c775d9bd34d35d79ebb6b47fbf36e7871b739f1fe79e767f7dda736f1de76efc7badf4d9f7dad37e1ce74f3a79cd1cf356b873cef5738d75d5ee1b77b6df77bdb8db9e3d73873bf5feb6efc7b8e3b7fbd7675dd3b77a79cd7c7f8e5b71f7387fadbcdf7d5cd3bf5ff74d1bf1c775d5d6b7d9bebbefcd1cd1a6db7fcd76d5ad7cd7b6fce3cefd6bb6bcf1deb8f74f38dfce76dbddb4f5aede6bbd5beb86f477df38dfa7f5df6e76e36f1a6f46b9df57fc7f769adddedfdfbd74e7c69d6b5f5c7b77fdf7ce757db79edb8edcedcefc71df75eb969c6f6f5bf1b6daf1a69d6f5f1df36d78d5c7387fcefaeb7e9bedee79d38d9bd3a79b6fc7b675cf747badf9dfcdfcd9be1fe7dd7b75d6f4e9df3cd5c7b4e9a6b5e3973c6b5e3dd74e1c6da7fb6b5d787766bae7dd357757bbe74dbd73be5ceb7e79d9a6bb79c69af5f6b4df8d35dbadfad75d77e3879ed5ae5fd7adfce1d776d76779e77ef5d5c6fa6da6dbdf8dfdf78e1d6bae39d3c73cd5d6bdf1fe9c6b6e7bd5cf37ef5d3c7f769fddbf77e34d78d3be3875af35edc6f7eb6d34d5ad1fdf97386bcd5bd1c6ba6dee7af5fedbe1de5fe767dbe1ed79d35ddfe39efaf1e69f71ed1eef473cdb4e3d6dcdb779ad37dbaf37d35d3ddf6ddbeb4e5b6b6df475fd367bddfa75b738e76e77d9f6db7fddf671dd1be1a6fce1be1adfdd5fddedfbe5bd1f7f4e3ce78eb8ebcd78f5c6ba7da7fcf776dfedbe7c6fb79ae9af5fd1cd75f396bc775e9ee5f6dcedadb675defaeb977471ff1d75dddcd5f71d79ff3bd3a6f869e7ddedf77cdb475f6f96b479b6b9ef46b46dfdbce79e5fd3a7f6e1cf5c7dff7ad34d34f76dbae1bdbbeb969d7dee5b71b7b96f8f1b7b8e35ebbd37736e3a79b69ae5ce38739d3debbf79e3ae34eb6eb6f3be37e7573dddcf5bebde7971ed7ad5a7f5e7a6bb7366b7e1be9af38f7ce1cdbb77be76d7aef6e9d69defae79e5fe1ee37d9ee3de35734ebdd1c7deef56dadb9736e1e7f7ddbf3ce5df75d74eb97746bcf76d1ce7bd75ef56dcddf6b67fde9cebc6b8e75dfcedad3c71b7def7dd9ce9bd7debce75db9d766b8f3c79af7b73d73a7f77baebdebadb469fdbdf347fcd9d71ff74e9fe366dfddbdde73bf38e5b73de7c7db6f7776d5cef7d5a6b7d3d6fb71fe9ddfb7dc737d9dd3775bd39e76f3869be5aef7e7a6fdefbe1ceb7edf73671ae3bd5be1e75b777e34db9d38d9be3569a6f7d3bf5cdf4f3d6b971ad9b77d75fddbd5cd5d735e7b6b56da69bd9b6daedef7c6f8edbe79e5a79cf3b7bddb77ddef8f3cd9e7f5f7777beb8d36ddee757f9ddbe5d7b673bf3a6b879d73af34e37f1cf7ad1aef8d1bf74f7c778e77ef56bbf3a6bad9edb67dfd9f7f8d1defa737d77e9cd1bddf7f8dbcddbe7bddc7ba71aeb9dbadf46dff1cf77d5cdf7dbad7a75a7376ddf75edce1aeb6d3bf377baebbd746b76b86b5d37f746f76f9f5dd34dba79ed7deb8f5de1de9b6bcf5c6f9df4f1be78e77e3aebd69c79ef78e74737e36eb4e38e5de9dd376f6d9ee7c6b96ded776def7d6dc7357df6f46db71be5fe5f71d6ba6b5ef8ebbd1c7f5d7675d7777756b5735df6f78f3771ed3769deba7fbd7d71cd38f796b56f4e9e774e7669ef1cd7975e6b96f5ef979fd1adb473adbc7dce9be5e73df5ed9eef8e1e73be1d69b7b9f3bddadbce7c737dfb69dd35e5ce9b735eb4e3a", + "shares": "0x00c0839973c79a95ceb6aa08cc3520583b96b8b0ccfcd419aad053904dbf6b8f4b655bdaf742a41e087b732623ef279bfa968b7fa56ab6e498f1b12c3968ee43e0813c6631389d15d39a1eb24b84d72d9a7726e33fe1be227994bc26f52340c74d45ab82dcf81da9ca0f81750b0f6c68d9971631b733c36d6bee654fd1a35e6d1719a68d656d4db5269765514a49a0c7a936a9566392aa7cb9632c6d22b985f87563c6397820b1d0fbb6c598c78dfad31bf8cbc43ccc80dd6aa303d7cceaf2e91e68ddde37f7df7769fe3479d7fad75d9e6ddf7ad7befb7b8735d38dbd7fbe3773a71ce75e3dd9a6fc75b7f6f5adf4d3d79cf74775ebcf1fd39ebb73477cdb8eb4f77dda77cd5fef86f6ef5f3a79fd3ae77d7ae1f737f7ae1d75deb7df8d9cdfbf5fe78e7a69ef79e7473bdfadf9f5a6de73b7b7d9c6b66b7d5e7fc777f3ce7d75dd1cd79eb4e9f7b5df76b7737e1c75ed1f7fdf5de3669b69ef5f69b7f57bad3bebc79aefb6b4ddddf9f7ae1adf57f5d77d77e34df8d3be7c7bdf1fd9dedb7f771cf5b7fb7b7ddee7b73c6f56df7777dbe3cd7b73c6b871f6b5eb8e3669f71adbd6f9edd75adb9eb669de76f5c7dfd3ad1b69a7bc6f9eb66bad5e77adbb73c6bae9de796fc75ce766f6d5be9bf35edc735d1c6dad37d5cdfae9fedde79e7b7b46fc6daf5f69f7fbe7ce9d71ad79f5aef4f35e9bf347dc73bd9ae776ddd78d7df35df573dd1cdb9d756da6dadf9df96f67ba7386ded1e69de77dfa774efbddf7bae77d7af5cd376fc71f7377fae1e7dc7fae3675a7f4d376bae3ad5e6b7e786ba6dddb8736f5dd1de1f7f4f3ae9e75e7df774e1b6b971c6b5f7bdb5dfde7771e6bcdb5f37d1defdf3cf3beda6bd71eef56bbef9edb6fcf36f1b6f9e7d6f973beb7efad1fe7c79cdf869b6b76ded7dd3cf3b6fde3875c7b5d9bf3d6fc6da75be5f79a6fdf7b71fd5fd386f569ae7b7bcf377baedf776f3971cefbdf4f75eddf7573a736dbae7c6dad34e3cf3bd34d1dd5af36d9a774d38ebaf7b7f7df8d5aebdf5b7b5ddb6fbf37dfa75cf5b71adf5d75eb873bd9cf746b6dbdf35f3cd5c6b5e9c79de3bedc71b736df47dde1de9debbedef36efcddfef5df77dbf38f37d9d79fe7d7da7776f8e3969be1fe3c6f6e5f77bf367b4e1fdf4f5f7fde5e7faddbf1ee1de397dfe9f7b479e6b6edb6b9e78ddb79bdfaddbf3dd9fd1b71f7b4f7ce5a71e73bdf8e77d1bedcf7ae9e7b46fadb9f5b77df3c736f3b7fd75adf5df8dbddda79ef38e347f579edbbd9dd5ae5cedeebcd5fe76f74eb7d3ae3671fd38e3deb6d9d7b7db67bd734edad77d9fd3a7dbe5ce3a73ae9b73be75eb96b7db5ef66fa7f5e34e7bef8f5b73d79c77b6dcd9c7f675c79fef9dbc71bdf9d35df8db8e1ee9deb4d9cdbde3dd1fe36e7defd7796b9ddcf1e7b969f7b8df5d5ee38e77779f5ad36dfc736d77f5fd9cddbd3adfb6b573ad7479fdf6db4778f79db7f1c6fde78f3adfdedbe5b69eedddb4ef4efde3677def4e5e7bcf1d6f8ebd739d36dbdd7d779e9a735e1a79df5fd9be36e77ebddddddbf1bdf8dfbd1b79bd9def67b67ba7b6edaddcf7beddd3cf7deb57b8f3a6dad3bf777bc7f8edfd9dd75e3b71c7dfe34d3bf766f87b87f4d757397f67dc6dbebbe5d6f47f9d5a6baf747bb6deef6df9f36f76e9bf5d6b5f1def4d76f1d7757f7d77f35d5bd9f71a7b6ddef1cd75e5bf3969df36e1a7dcd9ef3bd36d7871ff5cd9f7f5edff37d367b7f1c7dcd1af7cf7ad5b73573971edbc6b7dfdf5b6b675e77b71e7b4db4e1e7ba6fde79f39efc7daf1de7869feddd9cd9d7766f57f8d79df8d3677573dedcd5cd3df3ae9d73d734e3b7da7f4f1d79c75ad35ef971bdb4f5f7bbe5ceddd5e69fd7679eeda77769e7b4ef9d1de5ee1bd5f7377fc7fcdf66bbdddefdd5de1f71e6b6f76d75f5ce38df8774f5c7776dbe79ddf6fbedeedee7d7b7f1cf1fd7bd9fd7dd79d1e7dad5f6b9eb4edd6f6e3dddee9ce7b6b66b9dbcd7b73b79b71ef7ddb777af77df8eb7f74ebce1fdfcddcf78e3ce7769addef5ef3af7a6deedf7f469bf1cdb777cdbc7dddf7e35d9aefdef6e9edf8d37f1e7777bb6dfe9f7f8d356bbe3b7dff7cd1f75d75ff7debbddfd9fd1ddb56f6db7f1d6bcef7e9befcdb971f7b47746baf1af3cd757f6eb9eb6f38d5ee9e7dfd36edf7b5776e9e77dd5eddbd7775e75ee35e747dd75bdb76b6ddde3cf78ef76dd75ed7dd7dddad5ad9ff77ebce36d3cdbbeb8d367dbd37d9ad1be3473779ee746baef6d1a7b8d5d7dd79dd3c75ae3ae7c6f57fdd75dfd73d77bf7d77c7dee9de5fddad5e71f6fce74f1ddbaedfd7b6fbf7be5cddeedad7c75de1beba71af77f1cf1c7bd73a73473dd7b7dadfcebcdbcf1b71fefc7f76b7df7dbd75cf7defad7ad78d3de35dba71ddb679a79e69cddfe35f1bebbe5ad1de75e79", "cluster": { "validatorCount": 0, "networkFeeIndex": 0, "index": 0, "balance": 0, - "active": false + "active": true }, - "signature": "0x86a81495d27683ff098c1bb1096b9b2f10c24a6e512a67e2a53701bd4beec0db40f7db0a0df989c1c59a786f82baa78716b14b78e331c1328f3d66080e83829c4e745633f2e6d9480d6451d9448cd653ecdfc02620054b7d71e5856bf0a92402", + "signature": "0x8c8c903b56917a6f08d8070edc7db7f8babbb25a7f053d99c83a5cb714a2072090d38c133d467a0e23c13e946348c9010a49965812b4bee59d9ba07449f5c76542b3cbd975907b4d2cf192a5ab05f9bee2bc1932ee95040d2bd2a4880b33c872", "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" }, - "1684356578112": { - "depositDataRoot": "0x5304d296562a22bda92a2b411155e403c06fa79008895b186041c6a31c29bc9f", - "publicKey": "0x886bf7502e43c2bd5e883be3261b8547bf11da628e202b4b0abccfbbd4491e7a8c240242c53346640709b49aabdf4907", + "1684509253158": { + "depositDataRoot": "0x6aa44799022e541c3efd9dc29da2f4e3de2449b8e31c064099a0fc6bee4302af", + "publicKey": "0x898e8a3508f8f2fda73cc57bdb03e1fa957d1507700caedf5dcde6933c282b2585ba0e9fdfcd957ee89caa83309aada4", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c08b9d8ed8f89734251e4b308e8a4d9796a5226c7f7236f58b7ab4149fc5910722cc1425fb9f068278ad2a79e389553093a54821b839f249440d3e89e223fd6ba0b407421a3196b403ac5fa1ec39768b7db17b2a9226859e8a0ea74a493c57e82d8fb83483fdd54d756c9c90fc3ffbb178852e25467644911981552a7b6222a91a48a4cc0a19abcd67fa615a0505f63484868b95fb29a708f0cde44eab92de8a16ee6688dc9f6f3ec88cb486a8d95c54c273bad05dac014b3bcb935c0e5ec6df126b4ede69f736ef877befd79ed1de5cf5cd75734db6eb975d69a6dc778eb575fd9b6da71fd766b773a69b75cd5d75b69dd1de34ddf75df7c7bcddd75bedde3b7bcf37ef975a71ae39d9cf7be9cdb6d7a735f7dd1eeb5f75edc778e3b75f75a6fddfadbbe3477773675fe38d1df3cf7bd9dd1bdfb69cf7d7b679cefb69cdbb7b6e5eeb5dfbede7bdd7a6f679e77ad38f1d7fcddee36d3871cd9c77c7bb734f37f78ddbf36f7a7776f7f1df5b6f8d9b6f6db86f8e76d3ce1cf1f7f8e78d786f46f573577ad3775ce796ba71a69eef6f5f6b4efce75e7b6f971a7fb778e34e9adddd1bd1f6f477971d7bce34d7d6bad7de3cf34d9ee79d5ed1ce9bf5d739d9bdb67787bdf39e9cf3c6f9d7477875c6dfebbd5c735777d7cf1f79cd9eddef7af3ce76edceb8f1c77d7fd6b66bd7b4d7d7dc6b8dbd7386fc7fae9fd3c7ddef7e1ad9feb4ef879bd1e7f7f3775ddbde1fe38f1d79edbdefdd9c777f1ee9b79be38f1e75de3ddbde9bebcd3be3bf367f57f4e3be9b77769df3ce1dd38dbc6f4d76e5fdb4f3879fe387f4ef46fdeded367766f6f3de5ef367dce5dd9fef4e7d69a7da73a736e9a7bad9af5bddd6dde9e75ed79eb771aef4e75f75f39f3b71cd5ed35db9d7d737e78e3c6fcebbddfdb5eb5d5e7f9f3c69cd76df8f1eddddf671fe5addd777d3be376ded357faf5cedf7fd7dfd5ff3b75dedd7f66b7f1fe366f4ddf6bad5ee35d9be3ae77f1ae3973af5ef79d9ae5beb97377b46ddefbdb8efc7bd7bc6b47b7d7bf7677d75af5ce5befc7db7dd7347bb7da6b869cf79df5d76ef86dcd74ebce77e5ee386f871e71be7ad37e7d73cedbdb8df4d7af1bf5aefddbbf35eb6d1ef7cdf4f3471cef5ef4dbbd1a79f6b8d9bf346f679e7fcf1df7873dd1a6b4e7b7b4e76f35f36f1e6dad9ae5f739734d746bad3df7a6fde35e34eb7db671cf7469c73873df3a739d756b4d1fefcdfa7dd7ddf5cd5d7dad1e71f75cf3a7de6fd6b66b9f1d7f6f39edfe377bdd35df4edd73a77c6dcf3de39ef76bde9d7fb77ceb673d77b71a6fa79fdf6d1af7adf6e5de7b6badfa7f777d77bd1bdfad5a7dae3af1c6f56bde7875ed79d5ae3bd7bdf77b5ddcdf569a6de774eb979d71cedbe7cdf9ebc7dc75ce74f5dd3bd3c6daedde7b7f9d7879d6dde7bdfae5d77af35d7c7b86fb7357dc73adfb7b9d3679af7ad1ee35f5fd3b69ae9bdbcd767f87756fa6fbeda7badb8ddae9bf3575af3873a6f87bddb7d9de5d79ee5c75dd7d7def38e1ee5a73ddfbeb5d5f6faeb9d76db479adf871ee9cdf9eb573673cdb5e5c71cf37ef8e9af37f1cf5c77ae1b77bedfeb9734e7a7f977873cf7bf1ee1bd367db7f76b6f1d7f87fbe3dedaefa7f7f5f69fd9cd75d77e9cd5b71ce39e1ce79db5f3b75b7dbeb7736dda71c69b7fcdf47bcd9af7c7f777b71ed9ed39f7d75dd3bf37d5f6dc75f7b4f3adfdf37edeebaddbe9b79de7a6b775edb97fcf5ce3677c734ddfd74e75f1ff7777c7bcf1adda6b86f4eb5f3dd7cd1dedbf357daf36d3be7bd1a6b86f6efb6b9d7df7d71ed5a7347ded7dedbe3bf3d7b57786bcef87f9ef67dee5ad9ed9de1edb5f5bf5cd77e35f1ed3cdfaeb8f75d5ee796b5ebde9dd9e6fa7f5d7679dd5bedb7b5776d1feb97ddedc7bd6f8d1df74e36efadb56dcf5d73c7767f46ba6b977a6b66df7f969ae9a6bd69dd1bd9d79be79db5e9edb769fe9ed787b8f5c7b671b71ed37f5b69edfad7a7bd6bcefb7bd7b6df779dd9a69d79ed9f6b87b9ef57daf397f4ddd75ad34eb9dbd79e6dc7b5f5cd7a75f739dfbf3b776db67df6b8f1cdbb75a7fddb8f5a71cf77f3b6b871bf5ad9beb5e776deddf79af3ad34739e77f5e777e1fe7a6fceb4f5de79d9c77bd38db4e9f776d3475a73875e69d75aebbe9be1b7bdf76d7569ae3b7767786fc6b6d7b7bb69bdb6779f347fce777f4779f3671dd3877cdf7775f356fa79dd78775dbdeb773ce9ff1eeba7b8dfbf1ef3cf376f9d1de5bd5be1e71a6b675e69fe3cefdf79f3af1bd5f71d6bceb4d346fde7bddfe1af776dde9b77df5a73c6fbf78df6e78f3cdf979fdb5eb6d1b77b7757dc7f96b8e9bf5ff5a6fcf7dd3b7b5dba7f6ef9ef5e34f1bf39d7c7dd7f8d7ce346fddf46b87dde5c6b479ef1deb4edbf5bd1a7fdd3c7f4d1f69edbce76d777f6f3b", + "shares": "0x00c0811bcbe8200ba25f4e2ceb0b5e0820c718ef3ce5b8e1d8aa2535e07f255224eafb87c4b3200e808305a222da21c94ea198ee871e7c02ad940cb8a3e4b66423eb8d74f055939e0828fbc60c0105d130bdf64d246225b4b8680fc354ea5ff7bf9db94822974d99c03369b756f37803549f0431d8899c574b1593fa1cd8562b3cedee3293c080e2db5d7806cfef4fea14aeb8dbfd7d68d22c4c4ee13bb99e557e9502ba9537963a64db79ff41db9e8d9d9f94d8864d850874948881490e7797a7fcd7b73cebce1b69af1ce776b4d1bddddb66fb73a777e74e5c7dae3dd9cd9de7973d7fbe5d6fb73d7f9ddf6b5f5be1adfbe5cf3bdb97f875f7b773b775e7ae9f79ae74df975d6fce9cd7ce1be5bddad1e734db8d9defa73671adf6db675ddb9d757ddefad35dbbf7d79ff1f6f5f78ebb776d75d7973cd1ce7a7dfe7b77873b7f869b7b5f5ad346b475ff3af786f4dbdd5cdfc69ee3b6b7e7b7f97ba73bdb5d5ef5e79befcd797daeba7b86bc69cefbe3471aef6f1ff5edb9e1eef4df7e7c73ae34eb47bd7f66b96faedddf6d1ef1ed376f8d9fe797bdf5cf7adba7b7e7871f7b9dbc79ef3475ff387dee1ff3cd7c777e3a7dcefcdb5d9e7bce1fef76de77aef4df8d9cd3b7b8ebce5be3cf76dbaf387b67f5e7ae75db6f3469ad1a73be7ae3469ee5ff5cf5ce9adb8f7bd1e7b86baf5bdbc6de6b8e3d6f76fbd39df4dbc6db7dbe9ed36df869b71d71cdf7f74736edadf9774ef97bdf5f79bf5b7dff74d3b6de6bae78f36e7de5e75cd377f6d9c7b7e5cf74e5e7ded9ae79d7df1f71ef1f6f7eda6b675ef3bd9cd9c737e9a778d5f7397bdd3cedbf3aefddbbd9bebce1df5de7673ddbd79fd77e3bf7879ce5d69bd5a73b7f87de6bbe5a7f7f796da7f67346fbd38dfbe5cebbd5ef7cdbb7b5d9f7b9e3769bf3671f6fbe36d9c6f9e747396f9d9cd7469fdbb6b5d7b7fbe9bd1e6fddfa7b97dff1d71c6b7d7dd5f7f5dbcdda6b4f1cf5df5f75d77ae9b77975df5c6dfdb77767f5d1e6b6f1c79cd7dd5d7db75ae34f5aeb4e9cef9ddce77e7bd1bf746b97b8db86fd6f7e3bef5e5ed1ae35eb4e1f75de5bd74efcdf7779dbc71f739f3af5e6bae36d77735f5ce3bef76dfe777f5dfa71fd1eef6f3cf3d73bd1bdf9e3ad9de78f7873cd5a736edfdf6dbde7a7f571e7dae77d1fd76edadbde5ef75db8edcd9cf347b7df5efdf1e7daf7675c779f7b79fe74e38ef4f5ee5c7fcddae7cf1fd1fdfc79df1c6b8dbaf3defd75d75d7dce7b75b7dbdb4d77eb7e79f5e79a69fd1be1a6f5edfe5ae1cddb69ef75d7d75deb7db5f3c7ddf37ebcd1aef66dbd1bf7a75d778d39e757f5d3dedee5cdbdf7bdb8ebb69d79fd74e9fd1c77df37dded5bedddb4eb5ddb7fb6faebd7deebaf78edc6fcd9ef78f77df7f1ed5f71e6b57f5d76d5be1ee9cf38e39d3779dd79efcd357fcd5be3cf1dd1cd9de1fdb77dfd5ed9fd777f477ceb9f38d7975a79f71e738d36e1d6dfd9bd7d77addeefbdf86dbedcebdefde5feb4df971ef7d77a77ddbbe75e76df9e7bf36efbeb8e5ff3aeb9e9a7fdd357b9e3de75dbc69bdddeb46b87b56ded34778e3ddbd77469f734d5fd5f6fae79f7d777e3cd37e34778e1addcefdd35ef87796fcf797dc75ef38d3b6f6f3dd7a7baf3669f7bcd5deb775c7b7d3beb6d1c7f777adb5d3bef9f3d774d1f77979adf67bce3a6dc6f569fedd7f977c69d7fd6dae387377f6d1de9bd5eef87f9dba69dd39d78f7d77475fe5f6b97b4d7a7bae76f7775df5e73ce1cddd6f9ddcedee1ad3b69d6f57b7f79df47dadbc6f77f66f771fdb7f5e6b8e757f5e7869b7b669b776d7bdda73d7f5f7cd3ce77e7cd1fe747dc79bf1f6dbf7669c79e736f1bf3673c71fd1d7fcd386df6dfeb6db77bcf38e1d69addfe3ae1ed79d5b774dfcf346de7397bc6b6df9f7873ad9f6b777ad76d5de39db8d35d5ee9af3cd1bf37db57f5db8e1bd7cedfd9edf7eb96fbe7ad5e7bb6b4d756f57ddd1ee1bebdd9ae74ef4d5ad9fddbd9c79ddbcdfbddaf5cd7c6b5d9b7f571e77bddae5ff5e6fd7db7dad9af3d738d1de5ce9cef8d5fd3ae1f7fde77e36d9c6b6f34f3dd7779cdbad5b6ddd74d5d6fbe5b775e346b5735e5bddddfde756dc73ae7a6dbe7cd37ef97ded9fd767bb69a69e7746b77f9d5fd1fef7f34eddedd7b6e3ad1bd36e7ae39e7de9ddf4d5e71a6dd6f8d39d5cf7bd9d7357f4e756fc77af7471bf77e787f5d5edbbebd73d79edb46f76fadb9efbd1ae5ed3d6f5738774d37776d7873cd5ce9de757b8db6e1b735e9a6f67b56fbdf97badbb778d1fefddbdf3b7f4ef67bbd9cf3c71ce5dedd6f8774f5dd1ef1e7376da7bde3ad1af7b7bae1bf5e7bce5f7f66f9ef6ebde75eb5e5f7dc69d7dbe5fd38edaeb469febae3b69aef7d1f7fbeb9e9eedcd796f96b8778f1ed3addde3b7fc6bbf5c7ba", "cluster": { "validatorCount": 0, "networkFeeIndex": 0, "index": 0, "balance": 0, - "active": false + "active": true }, - "signature": "0x84500b9d90568f788be589ce104c40ba1e24d68878713276f578fa6db56decd7551597aacabcd26385d60069b125daa0115a16547ea8c9de8a1f460585eb8904d0d83c6aa4ee682e14b8a7f2e1589ec4be63bb0073e394e94fa5e7da7178143b", + "signature": "0x9538f13d3a51611cf73b32854027dafa7d999c53355b94aadb117502e635fdfcda1275c0dc50a9afd229b11e07085301020af941ea0b61d2597c0fef2ccda8d6cd6288970d3705f24d9c76e505a384302299829f817c759e8cf03f6c73c86b0a", "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" }, - "1684356840468": { - "depositDataRoot": "0x4a35d79522d6f744f949956269e78df53517f613570745dc30d99d4b963422a4", - "publicKey": "0x8ab7b66615bd961d10634ca287e63a6101894e7a2f16ff32ecd3fd0563391cfbd6c19631c9c18a4043f3f511419f7afb", + "1684509268115": { + "depositDataRoot": "0xe6d9327fb55c33ea1c0d14240e89d1f09aceca759a6e5cd75859f23a485bf35c", + "publicKey": "0x95a57ffe410d67e281df9b64ef58ee6dfc8813932042e9d7be09b2e6ac316182f352c56b033acbe192722002278dbeac", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c0b20286d5625a6a6f8368d16ab50838d89ea522ce7d837c69544d8f34e345e49b898858a54062987612b78bcda45e6d57b528c45523e5f3759c06a7dd4c016d7c23eb9262287fac18a2bdb2dd097d40c9ccfb7fd9ad583e29cde85dd09dd1bc02a21146423e7e047adb311d40cf20245c7d794d2d7befc2d5539bb4190f5a282935027cd73e240d1a1e213097a571e359a3861281c0ef9960ddc0aec4b1e6e1508ba73aec0849360fa5cdf3096ba675f65e3e516c6d1e582d07c396d3492e1848f3adb7ddfef7eb6f3bf7a7756b5e5ed9e7b5db7ddc71bd9bf1d736f3dd1bf1a736dbd6b66dcdf4e79d5f71f73c738df46def5feb4e9fd5ae5a71defddf773debd79bdfa7b77f5f5d777edc6ded5ed9cdb46bd79f69af78e78dfcf38ebb6f479befd6ba77d6b87bb6db6b97f5e38775f3be3ce3779c6f86fa6bdf38df771ae7dedee75dfdf34774efbe37e1fdfddb4efae5dd3c6dcd376f67fcf5aedeeb7e79e3af7cd396f7737f7cf7469c69dddc6b87fdeb9e39f776f6d75779e3b77be5b7daef4eb4dfae74db47b7d9fe76db6d796b6ede6dfe5debce9bd3dd7cd5eddfdfc6b4737d35efbddcf5beb57f475f75be5ce35d38edc73975ff78d5e79af3c775ddcd7973c69fdfdf7b75ed3ce1ed9d7dce74f74d35e39e38f76e1ee9ed1cf5cd9d7b97f6e9df1ce7df3dd1ed78f38efd73ceb57dfd39eb6ef4d3cf78e34778f3cf5cf77e5fedcd1cddbd766f9dbcf346f479de1ce38e5ad37ddcf1eef5dbaef87f971f6b6f7aeda71cd9d7b9f3c7f77f57bcddee3ce36e79d36dfcdb67f5e7b7faeb96f4e1befde38d9ad9d6dde1a6b8d9d7797f8777779ef8777eb97fa7dee9f75e73df77778ef4d36f1bdf4f5f6bce5de5eebc6b5ddee1fd1ae7573a6f9e3d6b675e79d7f9e9a7f4db66b873669c73a69feb46bd79ad3ad35d9ce35db5d787dd736f76e5b75ae9de9edb9db86b471d6b979aeb7eb4e1dd9d69aeba71fe1bd5bf1a7fbd35774d9ef5cd1bd9bd9e6dcef77f57347fbd5ad5fd36ddee3de5adbc6dedbcd3ae1d69ef3d6b975cf1e7787f67bb6dedf67b7edcefbe35f5e7f5f34e7de37d9c6fa6dbd3469e75cdf7dda77cf7a776f7befad5bef7db9ebdd75e1ddb579b6dc7f8737f5ee3be7af1ef3ad3571a6deddce7571eeb9f397b6ddc7b76bbdb86bc69df5f6fb69ad7979cef86f5f787fcefb6fae7bd1de78e5a6da6bd7b8f1cedce77d1aef9e9edfc6b5df777ae3573671ee9d7386ddd1ce9bdfde9f7796b577d6fbf5b73cd1d73877d6dff747fcf5b7ddd1af79db5e37d9e69af777def1b69fedaeb86fd69a6f9dfbe3de7b71ed3ae3de776deef5eb879a7fc7dc7b4e5d6f569b737774db7736f377fde7677bf78d1eef6d74e38d78df8e7b7ddeb5d3af3aef7d9ee39dbb75dd7ce3be767fa79d73b69eeb97f9d74774735f1ef1b6bdf1ed3dd75f5adfce5c73ddba6b7d3c79e7786df736d9dd3979ddf47fbdb871bd9ff77f1b75b69f7fcedfe376f87bbdf5d3a7bd73a71aedc6b5f78efce3c778dfad1adf9d5ce39f1e69c77af77eb7d7dd35f35efd6fbe34ddcd7b778ef9d796fcd5c75f77adb8d38e9ce5cd3ce38d78e5edda735eb975adb7777ddc7b7f3cd3be5ff347f6eb579f79c6f4f766ba6f9efcf377f8eb7d9ad5ddf769ef1e7746bbd7bd36d75e7ad7de1ae1cf1d6f87f46f87f7d7879f71aefbe1b7b5df76df7bd7f8f3ad79d3bd39f7cf5fdbdf3a737e9e7367bddfdd9d79e7f7f77db8f786b9ddee5b7bbe9a6b473cdf8e9c6ddf34f7c6b673a73d69d79ef7cdf77baf7d75aef57f6d7b7347da6b8df8e7b6db6fdf38d34df6f1b7daf1defde5df1d6f673bd75df87bbe9f71b73c71ae9d69cef8e9fd79ef7d9ee5cf35f3bd7be9bd7bf3d75cdfcdb8739f7dd76e77e3771d69d77cf5bf3aedbef7f5d7f8e3769b6b6ebd75ed5cf397dfe5ff5fd3cdf4e9f6bc77bd76db7ebc6deddde1b71ff1fd3def8f75e37d9be1dd34ef7db66f4d7671c6b8edaf356bae1fdb5e5befd6b571fe1b6f9db6d1b7fadfb6f4edcd3d6f4d1e79de39d3c736d9ee7cdf875cf5a73a6f76fcd7969e7fa7f87b5ebd6bd77869fedadb5f1d75d73ceb8f1ee3ae1edfdef5d5e71ee7aef4d1def7d9b69f71bddee5ad3775d69cf766dcf1be39d797f7efd778d9eefde9c6b57da7756b6d9d7fbf35dbde1fdb5db6ef9f38e1eeb4d78f78d9bede6b8d5d6ddebb6bae78738eb4f3bf1cdf7e5c6f9e9ae356b5df777ae9dddae1a7f7e7dd75dda6b779ae38df6d76f75f1ed9a7b8df9f1df757f56fdd1a7dbdf477af7ceb6778d7c6dd7bbefad37dfde1bdf9e5a79df74f5de1d75bd3d7bbd9c69fe3b69fef8d1cf38f1e7dddf7dbadddf3ad9bd76e747b6e1dd1d6f6eb5e79d7cefb6b8ddee9e7ba6ddd3d6f9ddaf7771f6b577ae776bb77d7fb777e38ef8edb7b5d5c71a75adbd", + "shares": "0x00c096e7b88e81aba5ac3ce38cd593a49686c21b526525178c52d490b3c8c0cdf79176b37c2e51fe3164ee520a85eb9658189074fc1dc57ddcbd2ca68aa2b44fe549855f64c0e5fab9327921d7ed53e0fc932610960dd8f45d4b25b62166202c3a65ad993702bbb7b573adf6b0936837cbd282b89f8e82ba4766a41b38d3e9c6be84905f0c691db8b79ec1c521321b5474a4946b2ffe57b5027d7c5fc6e1194c2452935351d1057db98ff3c6196eda1c55bc18bb25846f353bb8cfdd72f1c6bae184dfd7fbe9b6fd6deeb873c7b6f78734e5edbc6b5e9eebbf5ee5edfae74f1b7f8d7dd37735d3de5ff3de3d71df1beb9d36d3bef7dfce5ceb5779d1dedaeb8e5fefad7d6ddef679ddfaeda7faf1e7dc7dfeb6eb4777e7d7b8d1dd9bd1d69ed397b9edf6dc6da6dff1e77bd1dd1bf77dfdd9bdfc73de1cedfe5ff3cdbaf1f75e79e75c77adf7735e5e77777b71fe7cd39f7defa75e7fc6dde36f1df1af797db6b5d7771b6fd7f9dde7f7ebd6fbd5e7f8ef5f39ef6ddef1bd39df577cd796bbe5ad1ed7aefb7fbd1cd76d1e7dcedef1cd3cf1d79de9cedfdbddf5e3cd3c6b6efaf39e7bd78d3b69f6dcf38e5ad5b75df1f69b73b7dde746faef4e35d35738efbdfa7bde1a6f67dd7fad1b7bbe3d7bd71ce36d77e7669eedee5ee7b71a6bcd9df5fe1ef35f1fdbddf5e1a6dfd78d1ae9ee35e5d7b6f3975cf1bef4f3c777d9e77a7dff347777b571de9def7f5e7db6dce78e39f7cefc774e5a7ba7fdeda73c69ad1a6b5d9d7fb77cdb7dfd73d79dd9fd76dda69ee7a71ce1e69defcdda6bbebaf5deb8d37db769fedfdfdddfd77db6e5ce757dcd78db8735e5d6fae78d7a7dff76db67f4e3c73cdf973ad38738d7a6fcdb5e3bdf5734d9b7dc7dc7ded5ef5ed74eb56fa734d34737d9ff34f1aedcdf9d9d6fb7b9ebdd7bd1ef3bd9f7da6b9d7adf5e356fc7f4e3b7776f97b9e1bdfaf77dbb7f66b47def36db6ef56fd75cdbdf3971fd1defbf77f38e5cf35d1a6bcefddf66daefc69ee5cddd79fe9be3b7f6e9af77ef7734e3dd3de7ce5d6dbe357b877cf1cf3775b7f96fd69bf39d1edf4eb7ef47fcef87b475addf77a71e69af5cd5cf386f875d6bbeb47f879be77d5ee37d5ad7bf5bf757f9e7dd1a7fd77dd9be77edbf777766f773673defb6f4e36f3675b69c73c7fc734f7ce1e7bc77d77df5ee38e9be3de7a7ddf34efaef6f3ad3de9addf779e38ef677679fd7a7fb6f5e36e36e9fe746dce5bd5cebd7fc75f6fd6dbd377baf1ae9dd38db7739db9774e1df79f5d69e734edae9ed9de9c7b9f74e7cdb9d9e6f9f5e6ba71b735dbc69ed5b6f873975fe37f3575e7dff3b776f1a7fad78d1e7fde3cd9ae5b7bc7b8e9ce7adf5f7979c69b6bbef469edf6d39e746df7b5d34e3deb9e5bd1ae3bd9e6bae36dfce5be1ce9ff3ad39e7ae78e3be3af5b75d7366fd6b56b9ef96f46f6efd7f9efd7ba71d6fce3a7f4f5ef75e9ed74eb6ef46faf5c7fc6bddfaf1bd5fedf7387dedf979e6b769cedcd5de346b7d5ed37ddbf5d7ddd9ae347f671fdfc6b6e9adf9d1be5be5fe7cd3475d75d7dc79df3b73a6bde7aedb777f3adf4e5befdeb9f7ce37d9f71e73bd5d6f67ded9c75a7dce3969bf7cd3471c6f47baef5d3cd5f6faf767746f9e3c7bbedbd1fddeddcd3df79d78e5cdb77bbdf9d1fd5edded3869dd3a736df971dd75eb8df479cdbd7dddf8eb5e5d7ba77bdfce9a6f56b7d357b4dfde3c6b9e34f756fbdbbd3571ee3be1e6f777bd7cf5e7dfe5de38f7979aeb6ddce7aeddd9a7db6fb79a6fbe9ef3ae7971a79aef6f5defdeda7797776f5f3b6da6f87da7dbd5feded5adb6dbcd9a71de1fd1d75beb4eb877ce76ede69b7ddf5c7f4f5c7dceb67dc6b5ef7e9ce9e7f4dfa6dfdfbd7af34f78e9fd7defa6ddd34ebdf1b7fbf5d7b46b7df6f39d9def87fadf97f47f7edc7f4df5776db7e5eedcdf66b9e1fd35f5d776e79d3d6f4db6d9de1fe5cddde1e7dcd5bd3975b6f7f5fef6d7df757347bbdb5d376bd6f47dbdb76f6e1f7b4edc6bb79fedfe1ee9deb7e5dede7b6d9a7b4f37db5d36d1ff37ef5e79e1de7b6dddf777ad9a6dff1ee7bef6e7bef9ef6d39eb47fbf36dfae5edfd6fbe76eb87f5ddde1be9bf1e7dadb87de7797b7e1bdb4eb67f569ef1ad9e6f87fb79de79f366ba7f6dbce1ae38e9ae7def47f9df47da7bd777d5ed79df873477adddd1ee37f7a6f5f39d78e3975d7bbe1b73471cf1ce3ce5eebdd7aef8735ef57dcf7b7fcd9e79cd1a69aefceb5ef573b7f5d7b71ee1df3ae7a7b6778f1fe756f7ef66da6fce356fcdde7bce9ae1fe1c6b77dfe7af1cefb7b66b4db6e1eefd79a6b47dce5b779f3469a6daefc7b871e71fddddba7f96fce9bf7de1fd767f5e7bd78dbb77b7bcdba779f1e7b86daf39edaf7dd3b79e7f777775c6db79c75adb4d1fddcdb6e35f3bf38df8", "cluster": { "validatorCount": 0, "networkFeeIndex": 0, "index": 0, "balance": 0, - "active": false + "active": true }, - "signature": "0x92fb481663e91793f8320a5607fd8b8afecd9b557d67ca4d59cf0382944256a8f9a7f2276e5be613cd5a455e87c6eb8f092ccebc3fab9da500d78e5a8e560be6457ec48de1d604b87a20eb5a96f9a96a2c155c934f1199ba0ed4e62b1d3eceb8", + "signature": "0x8333cd81f27293828ca7e3a29b45f9489befcae41a3afc611ed67bc0636700db1153e38c88a48a9a15e6d4bae193decc0bac5264a29c936211d2212e4086fb92b037b08760a6c6fb4e50b9812116c62923d2f1e85e25afe54e662c96ca55c8e9", "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" }, - "1684356962052": { - "depositDataRoot": "0x8008fb8977a6bec6c649ca42fcfe80b3806614b638f332a267f71a9b587b8a3e", - "publicKey": "0x8dbc75d8e9ecd3b427953943df362e16045d35270f53ee78b1f408f51e77c05f64d99ab9835ea421b006b8193251d6da", + "1684509291313": { + "depositDataRoot": "0xc51ea3a91b77186b53429d907eedf8a00a94606c9536e8a49ec6cf46216d78fd", + "publicKey": "0xb539b00532b0ec5475290e1144441463803476e136ed1fc2988cca5687623ca9fee42efd4043f009e9765fd266297497", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c09937ee2bad85a51bdd0f8c641d3350e2bf0f1357844614bc72b68d53b355926785039b903a54da08851cd8d1b335e454a3399cf7525110ec359a71d00510758be2e7c6d8018e6aaf0623a02f8675aa668bcb8aefc2a05a05d88f3a35ff5247d6aa67d9ee8d9b731beebeb7bc3dc7ce683f08ea79bd5ce364a93cb7d0047f104ad96fbe5b17a8a47271643808239ac706826335a0faa76606f3d54f0088b4b0ab1b3fb0fb5c4953ab8190ea9421b9ced0b1158b09390e2a1db901be4643582729e7d77ae347f4e1ad37d367f677aeb8f3777b6b66dfdfcf37e7bd3ddf471cf1ee9bf3be78d1adbbd5c6fce9af5ad37d74777df775ed7ad75ddfd9d77571c75ce1e69ce9deb9ddb69ed1c6b86f57f9e3aef57f5f78dbbd39734e7df75eb9e7575b75ff3af7adf7f777f9f5defaddff7979d6fdd346fbd767dcef9e9cd9e6fd7b8738f1e6f4e9b775e7c7fb775efd69c7f86bcddde9beb5db4efaeb76bcd36f5f75ad3cef8e5b6daef9eb6ddcf38f38d1f69a6f575ce9debc69e79a7f8e5fe357de6f7db87787f9f5b73d75de77edbd7df39dda79bf3addff396df71f6bdd1bddcd3771de3871de3c7b4e746dfeba7bcd3b69cefcdf6db7ddc73473ddb9e7de5f75c7b5774d3ce3a6f9edbe1c6f5d74d376f76fd6b473ce77f3aeb8dded9d738e35d1e73b779d5fd3bf5d75bdb6d3469a71b6b96b6e5f6bcebaf3ce7b75d6b7ede75a7fc69ff5d75a75fe39e39e78efd7bcd1fe5e79bf387b8db573de5fd36d1b734db977977b79f7bbf1bdf96da75addce3769f7b5eb6e3af1af78e1bd7bf77efdefc79fd356b6e5bdbddbad9ce74edfdfaef775ce3ce7adf4ef471fe5c6bcddbd9ad1df1ff5cf5f7b8e5cdf8f34738e9cddc7df7db79e6b7e1fd1b73de9eedf6fbdf9f5ed5ee9c774f7dedd775edb7f6f1c7dcf39734738777ef8f5aebb77addfef7d7c75e7daf7be7bf3c739f3af36e1bdfbf3c75ddbae7ae7aefde5f71ad9bd35f5d6f7d9ad5fef5e7c73cd3ad1ce37e7ddbbf5adb6efd7bc77aede73969a71de9bdfcdba7dce766bce5c7dfeb8e39d1d7b871b6dfdbddba6b8d75dbb7776bc6b9f1af3dd3b73aeb7f3a739e5ee75e5ce7a75b6bcd36efdefdf7c7f6df7eb96f8e5ad38e38d1b6daf376dadba71ad5edb8eb47ba7baedc71a71cf1b7b57db7f9e1de37d36efc6df734df569cddfe756f4f7c75a6f46b477ceb8f7af76db671d69f71fe75efae3ddb9df76f4d1be5cedf69b6dbe1cedcebc738d1c79a6db7f6e1ce767796b4eb5d7979c77d6fadddd77f1bdddf7a6b9779db8df8dbd77ceb7f1e737779d1fd36f1fd9fdfbe77e9cf1aeb5d1ff1c6fbdbaf5e7f7e746bcdf6f5ddf97fbd9ad35e3ad7af5f6deefdd7ae1de7b75eedd6b8df9efc7df7b8e5ddf4e5ae36dba6b9f1bf7873b7bbd7b7f67ded5de1ff78e396daf38e1adf8d3ce5bd9dd3added9d735edc7357f56dae7b6f573875fe9d6f8e5dd3b73477af75f3c73cefbdf5edfeba75c69fe9e6bbf77efa7bbd3c6f4d7b71ce9cd35f7d6f76fad9fef9e1f75cf3be1d6f4f3b6f5e9debbe39e756f96fadf6d7c7dbe1aeb4f37f34e386dbf5ed1e79e6fa7f7eb479af7d75edf6d797bae1be1f7bdddee777bdf1bdf9edadf5dfce39eb8ddcd77d3bd39eb8e35eb5f74e5e69ff767347386ba6b56fde1febdf5cddfe1b79e777f78e1ae5a735e75eda75e79cef87b6d5a7347bcf37edaefbdf4d5de3775f71cdf4d776bc6f6f78edcd7b6f6d7bd5ad9ddf4d5df1bd3cdde6f66b4e75eb4d38e77737e35d76f5e6dfdfd79dddedfc6dbe74dbbe5d6de71ce7af3d6b7d1aeb76faeb7f1b79e7387bbe1ef7cf37dda79e6df735f39d9cdda73bdfad7677675aebbdb873d7dc737d1be7bd9a7f679adb9edaddae3c7b77def5bd3c6b977b6db6b77b871d7bbe346dd735d1aedb6b5d5d6fc7fcd1cd7771ff7df7bdfaef57b769bef6d35d5fe7969af7cefc77cf76d74df8eb4e5def779d7dc73be3579af7969af7bd3579dedef7b6bbd5ff1ce1df3a79bf7be1fd7cd5b7ddf3cf1adfbe5c6bb6b9ef8d34e3471b6fd7b8df6d9ad5ae5d6f9d9c6b46f975ddfdf7573cf366def1d6f6edbf1c71bd1ce376fcddd6b977bf3ceb86f5777f1cebaddd6f8f78edee9cddfeb4e1dd3cdb46bcd9d71ddbbe1fe78f5de5de357b5e1a6dbd7de75e7a779d1f71eeb7db5f1deb77f569ceda69de5e7ba6def7a7dd7bcd3a69d73af3adb97ba6bb69dd1bddc6b9d5fe9a776d9d69aebce9b71c6b769fdbb7dedfadbdedf777ddad386f4df6db6dbd7f469d79ad7df7c73df5ddf46f6f3be1e77979a7fae1ee75dfd6fce9ee78dfddbad5cf5befcf1df757b5e5dd1ce5ff3af74e9c69d77a7f4d796dff79e36db9eb4e3c69d6fbe9d69bd37e35d38ef471aef8e5d6dadfdeb773df7d6fdf79ef8f5df397f6d5ce7673671ef3cf397b6f3a", + "shares": "0x00c088d3e2dfaf24b91a8e9053e9ffe21997daccabbbb675aaabfe6e8f3380b7bf8707f90857dba6fb4fd44fbff510b71999a819d88d70390b6d9a185514019a55b6be28aef717aa96eb1a0add499b3b6b097f1b05fc816d5dcdc9b234d9c8bf6f368a7e2d9a229169cce07bd605f055375798197b8266911054b336f5e5cea9fff9b3838b54e915955240515eade4e589b2a4336829629280e901f279108aebdf3bec26e5426c95b920716c9c9c0a1e82f076ecda96c831a43b64b2c735de8ebcbdf5c73bdfde3c7bbf5a7dd69cd1deb46de75df5d7f877df78ddfe357db6df7bce796f4e1ae38d7be5d71ef3c79f7dff79eb869f6b879bebd71edddf5a7b5e1ae39d7777bdb9d1a71c7bbd357bbd37778778f7dd3b6db79df3ad1ae3c735d9cd35e796bd77ceb9d766fbe1ddf4ef7ef6dbd79f71b7bc71e71fe1bf38ebc71ae1e77cf5fdfce3df5d6dee9c75fd1cd36f3befcef6efc736f7a7db7fbf7a7f97766f5eb96f6e74d5bd376f97db7b66dfdba7b7f397f4edaf74f36dded3571f69ee1a6b7e9b7b97766f97da7b8eb6774ddeebae34f1ce746b6e74f38d1deba6fde9a69cebcd1e6b4d1d77c7b5e9a69e71bf75e1dd7b6dff7be78df877cf346bb6b76b4f7bddbd9c69fefdd5fdf7f5ef5ee5df1ad77f3777bdb9e3777577469bf5cf3adde69be78db8db9d9c736ebdd79f1fe1dd9b7f6e74734d5f69cebde35df8d9dd9cd3dd3bd5b6deddae37ef8f3475ae5df5cebd73cd9eeb4efc6f4d7969a77addd6b47777b5d35d5e7dd6f7d35d36f5eeb56da7f8d1ef35f1f79ed7cedc6f6d376fb79ae3cd7a6dff7a75f6da735777774f34e357fa79b6b47ddd36ebdd7bf78e3a73aebaedae7977ddf969ed767b877c7b777869f69a75fe74778ddd7f8f747bbf7df5d6ba79fedf79c7dbd5ee9e777ef5f76f1fd77d34f75df6db66da71ddf8d38d5b69a7b5d3d6bb6fdedaef5f78e36d9ff1bd757dcdfbe38ddae5a6ba7fce9cdb6e7dd9f6ba6fc71e7dc6b973d69a7b6f1f73a7f8edfd7d7fbedb69bd3de3bf5ed7bdb4737774ddad7cd34d7dd7479e73d777dbbd387dbefbf3ae74f5adbb6b5dfd7dc7f77fb71a79f75a6b4734ebd7dbf7475ae9ae36eb4f75d35778d767fd69bd7c73bd34e5de9ad1af5f7bddb775a6f4d7dd3adbb6b67fdebbd7bd1b69c7fbdfbe7de3b6db6fde1bd7a69ee5af76d5c6f8eb57dadf4f79e3cf37f746bb6fc7bdd35d1ae3a77c77d7dbe75ef6d7ce9de1bddbeb5d3b735eb6d9bd1fefbd3771bd35e1bedc71ee1f7bcd3dd35f1af5de9a7f7dfbd35eba7f5ef9e1e7dbdfd77779b7f9d5c69df787f4779e9de3b75ae1cd35ddddb9d78779dfadbc69ed36db4efbdb4e3d79be9ae1af1a7bce3969ae3575feb9d76ebde1c75ed9c77ddde7747f97bc75ddf5d9d7b86fadf6f79eb571d7b76dee1df3a69df5af35edf71f77c7faf367f979af35d5ce7bf7cf5fef671beb9d7b71ad1be757b5734e34f5adbdebb775eb7f1ddbb77b73bdfceb4edfd75e3d7b4f7ce37d9cdb7e7d6b4f75eddf38d1cdda7faef469a7ded9ed7aeb7dba75bf5befbd38774d797fbd1e7b87baf7c7fa77569f79af7cd786b6f3779b73bf35736f5ddf9f3d75ee3df3ce9ff7a7f47bde5dd3575adfdd1de1df3577871c7b9d3adbcd9ef34d3cddd779d1ce9d6f46f5f1af1adb7f7be34efbd9ee9f7f4d7b6b7f7cf377dce75d1cd7b6f67b6e1bef8dbaef7f79738d76df5d3a69ce757da735f1af3b69af5a69edf87366dedf8d9cdb4df873569d75ad7a75f6b5737eb8f5df7cef6e356dae3ae9e6faede6dfd7769edfd71c77969f7fc7b9778ebcf39df7eb7ede75cf3beb5d1bdf96da6dff37e37d5e7796ddf1cd1bf5e7b9dfd6f4d5d77aedbd5f6f977de7dddcef87b76deddad3ceb573ce39e9e775d1ae1b7db71fe1cd76f1dd9ce76dbd71b71d6bae5bdfcf7af3be1eedbdb8e74dddf5ed76dde7def1fd7979c73bd9df1b6ddf36e5bddcedf75e6f9d7be9a7dfdf97f5f3d6fbd9d69d71fdf47dbdbc6bb6fcd1fe9ed3cd1f77cdf8e79774f3a73c6dc6b56b4e38dbd6dff5fe9dd9cebbd1f6f4f1cd776fcd7675bede6badb57b8f1ed78df57b7eb8e76d5c6daeb7d76d5ddfb7bd77bededba735ebbdb5e76f1bd9d6bde7b6f5db7e3de1e7f569bedbedbd38eba7f4d7d79ce39dfde1bd5fdfc71c7bcdf8dfbef4d39e397b6e76e39db76f76f6df67b5f3df786df7f5dddeb9d3c6f77f56fcebaf7975e73cebd71de1ee3b6bdf3bd1bf1be7879ad9eebb734ebc7f8d3ce1a79d7366db7bb6bae76efad3679b6f4d5af5ce5edb4e1fefce3975be5b79f77bf34e1ddb6d9b75d75d776f1cf7b73875ed36f786dfddfe9ddb96f4738f79e35edad7ae74f39edb75ae1de9a6dbf3d75a779e1bd9fd1beb6e5ce9fddbedfeb4f3875ed77e5adf7e797ba75be5be1cd3ae9cf1c71b", "cluster": { "validatorCount": 0, "networkFeeIndex": 0, "index": 0, "balance": 0, - "active": false + "active": true }, - "signature": "0xaad2571c0e8d0f3e0c7095265bbb558daf9d07189bded28d3a9c6c77637cfdc4e3d97f8d38a65d786369b1e786110e2607e07fd6c3aacb876910c90b616db77cf34f9285ba494f9d9ad472d567dd0bf9488eb32c249b52486a51ea72b4d07baa", + "signature": "0xaf89192dfb733d0ce75d2f9dbf899dcb181cd4f082b78b16d6827761583ad8afba8e4dd964de6dc72562b0811e700e2c042f8b8bd9c94e8bf3c64852509221fda6fb6d63b41bbd755b87b66cc8d27f6d2119443665b267cd9a2411bb31e1b7d1", "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" }, - "1684357828972": { - "depositDataRoot": "0xb98e9b4e411d83d956191d44d1b5faa6552d9f38c42f6d98379ca3b131c17a28", - "publicKey": "0xabb52e0c9a1af639ec05c2fb4daaf74be7b4ffd6c188828e56de78d3264e4128d02301dc3e04bcaf1c8663be4e2e2b0f", + "1684509306139": { + "depositDataRoot": "0x3427ad6afb3352f0b7b066b238422301c344c5c3a0387a0c99f9345503ff0a49", + "publicKey": "0xb52c33f4dae58f49acfe760a89d1232db1acf61a70474c1a39fa2826c8c4ab71c61fc0952bfddc3fba665e8c975bfa5b", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c0817f81709352cf1e57a7e125aa83402aaf708eea8046d16ae35c27ed0038f0a39cc46cf91c99157a1792a439b065fce894da28ce786435658cda7abc79197f35055e3e69240747ffb8f2e1a7c1fbef8899ad52b5712bd13c4dc3f07de0297c0085556c139ff909077f92591105efc928dc3a8c383ef0e53f820bbfbed00182ab82405d5038504266f30e74d7c7a5bf1990d172a723e3b066400a1388cacbb924c4b9c74848f4a0811006b8ed52bbd92a00018abe3147730a19335c3da51c9813e9ae3c79be5df1e6dfe76e5fd5adbaf3777871df5f7f47ddd39f366db6b6db8d9ce3bf397f4ef979e6de75bdf67b8f1c69fd797dce7be1e7fdd347b4dbad5d71fdf7d9de7df3ad1dd78f3777579bd7679ad9deb5778ddee9b774e5df79f7c79be7cefd7f7d39edf6b7edddb7d7969eefc7daddcd5ad3ae76e9e7f5df979e6fc6f775fe37f5ce39e39f1cf1ff7cf3579c71cd5eef771cefd71de78f7cf5de38e38f76d1bf78d356b8f7577a6dcd5ee1c71ff3ddfaef66fd77b69ad1a6dcef66dfd7adb6f766f5e1de3c71e7f4d9bdf9e7a7bd7fcf1b71cf1d79ee5addae1d777e1bd5ddf5d3be3673d75c7bcedbddbe1fe1d75a79febce9c7f4e37f38e7969c69df78d7a774d34df6ef7f7b7da7767f9e9d69a69dddf7747da7767f9d75d5e77c6b9f77edfddaf75dfde9ad9defc71d7b7eded3aeda69bd7dd9ad5ee3cd1eddfd1deb479bdb9d1addfdf9e1f75a73df5cd7bf3969fe3adfa7b9db471cdb6d9fe5deb9e74f347fd7bb73469def77f9dfb73cd356f7f5bdfb6dc7f5e9e7b46f56dfd7ce3779be78e767757b87dbe3477d6f9dba7747747b6eb473de3ae9a6b779b7fcf5eef7dde7ba6fd6dee747b7e9bdde7b6d9a6f873defd6b975b79ae5df7beb6edfdb4d5f7b4eb86bbe7ae76e9af36f7cd776dbdb8eb469df1cd1ad3b6b479ae3bdb7d7ae3dd9cf3ae7a7bddf7e74d3d7b971be1ed1d69dd5a6bb6da6b7efa7bcdf46dee34e9fe74d9ce1ff767b67b6e1fd5d7b8d3ad3be34f5b79febce3be9edb7ef4d77e7ce7575ef36e9ddf679fe5d7fc6b575e7fbede6dddbd6f5e5feb66dde7de1a7fcd1f73bdb473ddf5efc7b7f77eb769ad7cf5cf36d9e7f475b6ddf37e36ebdd9c7da734db573b6fcd1ff1b69ddf6ebbd3c7746b875fede7dbedceb5f35f3c7f97bcd9aeb6d9c7767b875fef7f3c7bd6bbe3d7f86fb6dd775f3b69b7bb71fd5ed5bf1cef6f1c7356de79be5bd5e7bc69aefc7f6e5dd74d77ebce39f75ef7db86db7dd75bd1c7dfdb47dfd5af1feb5775e5e71bf1cdbbe9de1beb7d786fcef675f7bce5bd7d69c7dbe347daebadf8db96f5ddfe76d5f7dfddbd35e7be9edb9db9ef5dde6fcedfdf87756fdf7575f71fd5f69dd9ef1b6b777ae9ad3df3dd7969cebbebaefd7b47bdd9a6b5df6d9ae1bebb73dd5ddbae78edbebbddadf7f376bce5bd386b7dfc7f67746f9dfb79f7fde3be1e77871edddf35e796de7fae9bd78d74db96ddd9ed1dd9af5ddbd79cdb8f1f69b739f1de1ad5dedd7b471af7669ad9feb76ba79fdfbe5b6dd7ddf35d5cf5befaf79e3c7377dee79d79ddde37f78d35f1fe1d75ad3af78e79dda6dde1fdb57f471df3a7f8edae397bc777f7ddf6e36eb9e5ed5bdbd7fcd74f347f7e5d6dcd7471ae9bf1d7757366dff3d776efd7b6edf6b8e7a75a6b5db6e76d35d1ae1bd9df7971f6bae7969bf7af357fdedbef771f75e7b873aef9ebb71cedbf5aefc6bb79ce1e7faf1b6f9e1c776e5bdfb7dadb979eef871fe1fdb571f7dce1e77773c6b66fbf7a7baf5b776ebdf3877ce3bd3c7f8dde73ddf8d3c6bb79e75a69d71fdf6db4779dfb6f5d39e7a7b569b738e76ebd774f78f1e6daf1ff5feb97b77db6f7779d35774f7ce356dbefc77a6fad9d7f6d7c7f5d5fd9a73b6dfefc738f1a6dc7f87f7ddf776e5fef8eb6736f3477571cdfb6f679ff37e9dd1f6bce3b6dbf1e69cd387f869e777778ef6ddfdfae1aebcf38d7d71e6de6bdf5fd5feddf5c71a7b8f3be746dceb969ce3dd756b469d73971d7b67fddfce1f779dfdf5ff5bd9b7f4ebde37d746fdd7dd1fe3ce9eef76b76b5db973869f79ae1d776f5ce7869eef8779e7c69c75c774f35ddfe397747b5f35db8f1fe38d1fd34f77d7dd38d5ee1aebadf9e3befc6b76badb7eb67396faf1af78e7aededf9edb6ba6dae5fe5ee37df6d5ee9be1ed77ef979ad7771e777efbdf5f1eedbefaf5fdde69f77b75e7f5ef469edbddf6efc7dd6faf7af7471ce9adfdd1cf7ce1ee1af786f669eeb76def357bad7775de39d77ddd69ceb9edd7b769ce5cedd6f8d5ff1ddf569f6dbe5fe1bf1de35dda7b6f7aefd6da7faef9e1af5e69ed78f777b4d1cd1ce78e5edfcef7d38e3c69fedcddc71cf347fdd1dd3977471ad5a7f571d75cd7cdb5f776f579ee9ef5f69d7bc7deeb8d9b7dcf39e5cd77", + "shares": "0x00c0ac8d77561564e4b72f7ab129202f71c80f164eb2d4950ed106a441bd371f8274ee35bdb795b859c5b244d578f486fd2192fe9794452e31ed7327d749e628b0b37c768477b0c02692768bc56462e882d6d76cb57efd4ac6b59dd31bd0250d5a4b90112d1e96c0b067e24c2ce7145d334ab1b55486b7330662e74365e29086acad8df1eed3381803b522db303f9f9d3457b5290443d47f727e5f83646d3156dc07569b97b86df6992aab63f5359d7f43433228e6c85ccf3d11e675c53c9b181193dbdeb9d5c69e7b479e6ddf797fcf3def4df9f7bef8f5ef7ce3b7dde3dd1def8d3ae35e1b73a6bad5ae1ad5be5bf3671fe5b6f6778d5ef74d1ef377dcdfaedfd74e9e69bdfcd74d7b79af78df4d7a6dd7fce7673bdfc73669b69b777d38f37f37f5adb4efad7aeb4ef473577971e6b671fdf86bdf3af38e78f34e5ce3af7beb57b76def7a75e7ddd1e7dde5ae7deb673df3ae7b6dddda73dd3bd386f4e9adfddbce1e7b9eb9e5a7de7b9e5d6dde9cf76e9f6fbe5c75af77f75f7d69fe5be1cd5c6b86f9e7bedf6f6f7b775f37e74df46daeb5ede7fce797f975a69d6f9d9c7b5f796de7f4f3adfcf1def4d9e6fae9d7bb75fe9f7bbf1be9be34d5b69a6fbd39ddbdb7eb67fa7f86b7df87b9f34e5eebbebdddbebce1cdda79a71ee1fd5b7fbf5bd1eedae37e3669fd7ad3773dedde77df5d3d6f6d1f738df4f1deb9f1ad7cedd7ded3de7dd5a75eebb6f9f3ce1ad36edad3af5af7aede7bbd39738d5cef777875f73dd74776e9fd75f7cdf7ef4dbcebc71d71e79c73577ae5f7bdf1ee3b6fae9befa6daddddbdf76edd7f6e356bb6f8d5ed396f7f37ebaf76d7d6db79e69a73d75f79d71ad5fddad347346b6e39ef46b9f5af787357f8e9c6bbdf6f3de7d7f6dbcdde69fedb7bad9a79fd7c69bdb5f1be1de39d7bddb6bc79ff3d75ff34f79f5be36ddcdf8e1bdb57bbe36e1e6fcef7dfdd74ddb79ae5e7b679ad7cdb7e9ff5b7dae9bf1dedf7f86dbf1bd3a71be35d9bf7be5ee75f5e69fdb7d1e7357f4f1de3de5ad5ee5ad38edde1b79adf4ebb6bd73569ae5a75d79e775d397baf34e1adf87bcedd79ce1ef3aedbe3df7cd3aefa6f86f86b96b46b96f477773dd5bf79dfdd1fd1ed3cf396f9e1d6bcd3d7f8df9ef4e74e3bf7bedce1adbce3b7f7778e7ae7adfcdbbf3575a79e69df3ce38efaf3777dddfebc7b8d38dfd734db4ddd6b471cedcef4ebce1a79d737ebdd9ee7a776ef4d9ff76edad9a6dee9e737f34d7579e77c6baef4db77f9f3ceb46f769ee7a7fb71cd5bdf475aefbf35d5cf79d5ae1ad9c69c7dcefddf4e3c6f7ebce77f75f39d3ddfc6b9735d3b6b875fdf6f76d1a6b8e7ad5fd1f7faf747b76bbe5d734d5bd5fd39eb9d5ce3b7b9df97dce7df3475c6fb73dd9bedbef669dd9ddb46bde1c79eedce9ee3bdbaf39f5a7ba737d35eb97fde5cf5d7daddcd34eb6f1d7de6dad1dd1e6f8d1b6b7edadbcf3ce5b7357f4739e9f736d3ae5a71b7fdd75d3773d6dfefadf9777e5f7b87f4f5fd1d7bbdbbdb7e9b6f6d3cdf8e9ef7af3bd76f76df8d3cd9b737d5e7367f8f1adf8d1ee776b8f5d7fcf3bef8d3b7f9d36f38dfde77ef77f6d7769dd36dfb7fad757dce7a6f8d9ddded37d5cdfbdfd73af7d71fddaedd7f877d774f5cf7b6da6dd7f5ef977d71ae9ae75d36d1ce5ad9ad9ee9cdfc6ddefa7dee34d7bdfb7b86b7f7b79bf79dbb71bf35f1be5bd7ddb9f5c71cd7cd5ad5c777e3973775ad38d5ae5de74db6e75d796f775bdbd7b46b5e7ad3bd7ad1f75e6f6d9ae7cd5f77579e6bde5bd3d77979e7ded1be9e7366fbedeefb6b5d74f5bdb9dba7b471df5ce5d6b5f78d1bf3c69f7b4dfdef8e38eb673ad7c75af7a7f579af3be9d71c735dbaf5cedae5b6faefb79fef5e1c7bd7b56b57b87366bd6b871cf3bdbdd1c77475cf3ae9bdbc6dc779e7ce5f778e5f6f5eb9f3aebb75eeb4dfaef677bf74edbefddf8d7c777dbaeb4778eba7bdf1d7f4e1c6f9dfcedae5ff756b675c77befc778e9bdb7e9a77beb4d3c77ce34edbe3ad1ddbc7fb6f9df6d78f5a69d75cf3a7faedfe77db76baedd6fa6dfd3a71ef76e1f73677ae79778eda7356b5eb8d5bd1d73aedcdb6d376bdefc79dd38e7d7bdd38db87796f4d1f6fd71cf1bd387f5df86b9dfc79dd1b71ee5bf5b7b9f5c7daefd71c6dbd3b73be7a6fae78edaebb7fc6b5ebbe7cd75f5aeb9e7779d71b7fa73dede79bf37ddf7bdef5d777b76b6e5e73a7b677c75aefcef8edcd757757b4734e3dedfef76b96b8eb57bcdf9d7af39d3be7cf36e9de38dde6b7d3bf1cefa7f773de1ff3bf76dbdef4dfb6f6f3775bf36f1ee5aef9e9edf969e71a7fa6dc6f6db5777f1cf7ddf6f746bb6dbebdf767f8ebcf3979ddb669df36e5ddfa75ce77774d39db7dfcd387bcf746bbddae3b7b6774db7e9dd7bd74e7d71df5ff34", "cluster": { "validatorCount": 0, "networkFeeIndex": 0, "index": 0, "balance": 0, - "active": false + "active": true }, - "signature": "0xb44570059680e4397e8f278c872d0e0d05e53cccebf8acdd36fbda7c4ec4fecb89b4527f5a51ec9f05a66a56d85b413114a785dffd8847cd3aab2c2a1c401fff80a783c9d55fe2341c4aed6e2cce10074f58db382fb205db56a950ebe69d3e7b", + "signature": "0x8022c8a7dc07fa36fed97e619651943498b842591b58b1fc4f6374a46c819102061e39cec391b4ad02fd3be6b022c7ec0764721c32fbcb0053f09f0104f1ebf3c14959df77362526d83e65a08ad9f9d9b5b9b27b74ec0d69bea34afb2edbaf9b", "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" }, - "1684357854098": { - "depositDataRoot": "0x84dc9f76f32c0911b9be490d35a0544e297c5e3b2b1a7ac2e2f43bbbfab4f8a1", - "publicKey": "0xb8775dfa2e6247097b2e78b0f33df1576fba9bfe16af946820ac9b7fe1b5fe86d051d1703888e1925d0ed29926358940", + "1684510150493": { + "depositDataRoot": "0x54b8d6089ae41ff84f4c06822d79059840d9189af67013a0d26ca59614dfa64a", + "publicKey": "0xb4eb5f3d63a54af41cbb7d950ff4b24ead3d55246ef18bd526806038479a0606b8492ded433320fe911a3298c8d5fdb4", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c09226b242dd4a336f8a42779b5b5f4464c0715f69e5c1b874ed8f8fd9f9406e04862187d6e6f038b1e14085254f59a42f81f029164a1c0a1ddb4c9f02ab9ad7bca8d15ef3b067fbed0afa97a4ea4aab96325daf3d1fde415ec0a2782e9537a382908a4833986209aa13dd74dc5a5de80c1e7765da9c48970117dbf66342c4e2aa1a7740cfd53334d663691a497470979388310aaf111c758b2cf5c07d3d9b47cad4c853d7ebac3405f9c102023f3bcb3d440d85cf5e8d2995453152dee8fce69bdb7ddeedb69cebcdfaddcf1fef67fb6f87bde9ae9cdfd776d1a77b6f8d9b69cdfc777f1fe787dbd9c77569fef6d396dd779df5dba6b8db5ddae9eeb7ebaf1ce3dedbddb6df6dfd38d9e7376b9d3775eddbd3b79a7357bcf766b5776f76eb977775b7f6d5a69dd5cf377ded7979ae5f79d6daf79f7c7bbf39ef6e77f3a79c7bd7f66fd7f9d7ad5af5bd9f79d75bd9a73cddedbad1fe5a75eddef36d1ed5de79dbbd1b73ceb577979ae7d69c79c6bb7b9e5deba7fb6b877c6dce35f7879fdb8f36f1fd1ed397bbdb4e9f69ff347bad376dceb8e5eedf7de6bd6f9ebc69edb875d71fdfde7cedef1e6b87fbe35d9fef87f4dfd7b7779d9f6bbdf6edcf7cd766fa737db5f39eb9ef86f7d5f77bf77d1cf34e9cf38eddd7ce78f7b734eb7e7871ed5bf3c7dcd3ae1bd1c7bb7fcdf9739d74d79f1e6bcf3677677779be3b79fd5f774efa73b71b77c7fddb4f7a7b6e5bdb67dc7386b9d1c7f86dce3be5c7bdddd6f9e766f671c77669feb9d397bae1befbf5a7b8e7aef9e74dba79ee7ad9ed5cddc75fd1aef66b57b7efbddd6b6e35dbadba7dee77f36efbd5e69d7da736d9af787bbdf5f38edad1c775d9beb877c75b7dc77cf347bd75d6f9db9db7e9fdbaedef1d71ed77db5f3c7dd79ce74d3befbdb8ef5f7b774f3ae77e9c6fd7dbe39eddd37e38ef67b9e3ad797bd69ff7a777db4ebaf1eef7777edf7f7f1bf75ef56ded3d7f471bebddb8f387f66dc75b7dcefad9bdbc69bf5be9e6dfe5df1fe3c79bd387ddd5e7df71bf77f7d778d1d79a7dc75cddbd1ef3d79ef5d7f57faf767b76bdf7ad77f386b8e1bf5e71eedc7f7d1bf79f37df5efbe7a7bcf77d34e39dde7bcd766f9e9d7f8d9c6b4eb46daeb4775f1e7b67b5edddf47dadddf1f7fbd3ce9ae3ddfa77dd39e1fdb5d34d7669c6dd7b76df7f771df37ebae5de3ae9def5db5f1cd5cd38edc6f56b7e357dfdfceba7b66b8efae79eda71d776f5d6dfe76f5ae38ebbf7b71ad78ef6d1fef46db7f8eb96fadde73b7776b7d3475ce3dd79edc75c69a6f871dddc77579adf9f1cdbcf39e7cdfb79b7fcd9fdb471df397ded5ef796bb7dcd5bdb9f5e77b75adbad757b8e9fe7871cebbeb6e3defaddaeded7877adb9e3dd7bf79f5fef77fa7b6efdd9f77cd1fd5b6f8dfcddf69a7f86fbef67dd737778f1d7dbe5be1de5ce1b79ff3c79cd1ad767346bd73adbb6b5eb6ef57bbdde6de77aebb7bb6f879eefaef57baf38e5ce1deb5df569bd1d75eef7dfa7fb71cedfd5bf746f975bd77f1ce9f77769a6bcd357bc734d7cd1af7df757f877a7fbd9cf5c6dd6deededf9dfd6ddd7dd9defd7b47346b7e386ded7de5de9be797bbedef1ddf8e5b6de6b56dff5df5dd74f7b7dcf1b75ed5e73dd1dd7ddb4d5be1b6f4ef7dfb6bbebc734f78d5ae5ee3bf5cf1fdbbf7b7dbebaedad3dd777f6d5fefb71e6fd7df7bde3cdf67f6e76ef7e37f1ce357f579c7dad78eb5edfd34e3def9dfa73871ce5bdfadb8d79d3d69ce79f3ce3dd7bd1b6fbd3873ae9f75edbb73cdbaf7d6bc6bbd787377b8d36e79eb8f7cebd6b4d37edae5dd5ff5e7fbddb69ae9bef8dbbdb97bae3af1ad7ae9ed7cef8d3c7dadb871edbcef8ede7796f479b7bdd75d1bd37d9eebd6b7d3cf3cef5e5fefb69d7fad35df8736ebd79be5ce37e5cf5c6bdeda69a75eeba6b4eddd9be1eef56f86b4e9cd77ebbebb7f6d9e7bce5d6b7dfc79ed1bd9bd787b573de9af7dd3bf37e9bf5e776736ddae5c7b7e3c75ee38eb8d9ee77e3d6fbdf5d3473b778f1de5fe5ad5df5e79ad9edba7f46b771a6bce7a7fcedaf1a7de6da7bce7bf1cdfdd9f7b675ae396fbe9bdf479bd3af5b6b5db773bd5a71aedc69a7f475c79aedd7347b5f7ce1b77bd357b67fad346f5e5b6b777d7f6efce36df4ef5f5ee3b7757faf1edfaf7a6dddb9e5f71fe3a6b97bbe3877cd37efa73af7cd9c6b8df9e1d6f679f6dfe5ae3dedef3df7b7b9e3be9ef3971ad3cf1b77b7bb79ae9df5edf4f1adfcf78f357de7fde7bf1b79bd346dfeb6efd7fce3cd74edef7cefaebb75f6df73cd76d7b735e78eb7e7dd39d5ce3ad1e69b69df356dc735ef5eba77977bebae9fd79ef9edfd9c7bae5a7b869e7f4e1f77871af3aebb737d1d7bce38d9f75ef3aebaf377397dd7db73971cd766dde3cd746f67baf7973875b", + "shares": "0x00c092e11b4523e99534fc2f5fa4ea26b83ba3527312734ee7eb52811d6f614b0c2eb7dcdd983f6113080b7bc08b1e2adfd78230a18189485c387c462ab54d0572008700d6acfaa0ababad372f07aaa37618e1552170fd57d83000c75a0981cae613adf1999c188d1997bb9c78168d85144d6cd45c514d1c94dd7ba2901dd52577a2abeaf10a851eef15a6218b96041be9aca620d5eb87e453383926887b710ee9723bd1fde5e9c49e8857bbef0e6069560fc003277ba93679a67653a0751d70eb5d6dfe9be9aebb6f971be7c7377bd6bd75eeb9f397fb7de7b4f1a71a7776f6e38d7be7df35d9ae38ef97db73ce9e71cddc6f4739f5adba7b5df8d77f7df76f1f6b5e7bd9cdb4d1f6f67f5f77d5d6fad35e5a7dcd9f6f8edaede7fd69ed3bd77e9d77cebcf3bdfa7da6bae1b7f9ef9e5a7dfe77d7dd7df7ad1ed79e5b6b4d1fd367f6f75df46b46fbebaebaf1beb879e6bb737db879ee5f73af5d7b8778db5f5fd76f1f6b6db6f356b671ce37e5a7f9e797f477c6f5d5fd5f7f8f3be3def5d5eddde9be7a7f4f1ce77efcd1be5d6de69fedf79bf7cd396b9d5af38db9d5ce79dfaedef7af5bd756fd7f4f1be1d7f7e5a6dc7fddf775af77ef679fddee9f71cd5a77dd3c75bd3ce79efcd9dddde9aef9eb8f7777ad7777d7767767fcdf7d7aef77db6dfeb5e3a7da6f9f38efae1febc6bbf39d7673af37f79eb4d9de9cef9db9f1de79df873bf7671df7cd77d5e69ddfddb6d1ed386dcededf671fd5c6bbef9e75f3a71e6fa79be1a75e6f9e5cd75d9ddbadb5f74e5defc7b6d5ed1b6dceb47baf35e3769bf377f8e7b6fae9d6b4e1c73addcf356f5f3b7b6e75d1eeddd3c6b66f8d5b7b4ef86b469f6f8df8d9ce3bef977979d73ddf66df71aedfd1cf7679ceb87bce9f7dbe9cd9bf5dd9e7dedf669c73b77beb87f5dfadf4ddb73ce3975fe9de9c7dc7367366f4d1a6f9db7d9fd5e6da7bb75c71ae9fe1f77df5b69f6bad387bc737ebbef569eedddbcf5bdde6f9f1e736738f796b9d9be1c6b9e377f5ef8f75d9e79e7dd6f771ff7ddb8e7bf5f77871e739f74f78f3dd5be77d1cdf675fd7ad3cd9ee7a7b87b8db973de35df6735ebae9a71ce1f73a6b5edaef571ee9ed386fbd5aeb4d3d6bd6dcddd77b7b7d3af7575ed9bef96fbef675adb8d78dfdf7de9cf36edce3c6fde3cdbd7bbd9c6bdd34dfb7f7eb6f377b6ebb6b679cef579e69e75ed1fdb8d9ddba7df69e73cefae9ff5e69cd3971d6dbf5d7346f571eedb7367b9e747f7f78df67fcdf5ef8e3cdb56df79bdb8e1ef3ce7be346bb6bd71b69d71fe77d39eb4e3cf1addc7f4779f5df1fdbbe1f6dcddc75de35ebbe7c79d79a69d73cd1de34eb6ddbf1fd9ef5ddb571beddf7575ee1ee9ee7c775e1cef97b97df79a6dbf5def8eb96fa71adbbd1de1de3a6b7f1edf6735e1ee7d7faf3bf1fddcf1be3c7bae1feb9db5f5c73d71fdbadbbf5cddf7bb6f8e1ee387fc73c79deba75a71ad3773ceb47fd71ff1ceba75fe78ddaf38edadf5edd79feb6ddfef7f1ae3ad5ff5ed756ded79e9af3669df1ed346b873b69dddce7bedfebbe1a6bad38e78f76f7777ad5e75ce75db9734775f7de3c69ddf9df77b8df7efcd366deebdf5d739d7ad9f79ff39e7b7baedc6fceddd3b6f4e5bdbc7fa75ed5ff34f3777769bdbc7f9e5a71ed3cf35d9a71dd74e5bf74d78e3cf36d1c6f9f34d1ff5f6ba7f4f36f3bef9e38e3bddcd9edb779bdb87fa7b9ef8edce3af1adbce767f8f1aef4f77dfa6b9dfa79dd5f778737e9c69f7b46b96db73777679beb46bcefad9bdf6f3575ee1a6f97fcdba69b7bdd36df8f1dd7d6bb77779adb96f679bddaebce3c75d7dd77af3ad3cd5ad9fe38db67fbd357dcf5e7f8d9bf75efbf367b8e78f1ee5b778edcedfe7aefb79edbbf3cd75e39db671cf1bdfa776f3de3bd39f78edce7dd9ff1fe1b739734f5ee1bf1f75f79a7b4eb9ef66f7d1f7b6e1dddbe1fef8d747b57f4e9d735e3def9f1b7b66baef773de9ad5dddad3577473bf1a6dae1d69af1ee786bbefa6dde78f1bf357387787f4f1a79c777f3c75f69ad3469fd1de7875bdfbebd79d7fcddceb4ebc6db79ad5df3d734f7bf1ad3ae5a75b73bef8ebde1af5ee1d7dedbaddd71df7ae3679df3475fe74739d7debceb5ddfeb47f879bd7def77fbf78e1f73879de3971ee1c7f9d34d3c7de6bbd1df7ad37d756f8e5c69df79d75d5b79fddee387fa69ceb67f9db4db6f77db6dbb7dfdfadbde7ce3573b7ddf7669d6fddfb77c7dfdbbf3bef4f1fd3df35ef8edde9e75f75ee37e356fbf74df4edceb8d1cd1ff767fd7f4df5e387faeb6ebcd3cdf4d7d7fd77c7b5d5c6f571a75df5ad9d734d38f7addaf7d6df6faddde9af3c774ddcf79d7677a7b9737df9e7c7bbe1cf1eef9e3ddf7e387fbe37d7473cd76dde6dae7cd1c71fd39f3ce9bf1deb56df7db", "cluster": { "validatorCount": 0, "networkFeeIndex": 0, "index": 0, "balance": 0, - "active": false + "active": true }, - "signature": "0xa039a78ab2b030fd9a9486b95f268e9bf4c29a7cf17d5778bde89cccb85ad1dcf5e7f4284d8dc9ef47b731d684a5d4bc134e0570a2a40a6cc97148992b5c49cf810b3a59094ea6f071a308ddaae644bd8954ff0d57eea5a2ab5a3755007267ba", + "signature": "0xa476ca15430a49ac63bc86679eac7c9617c32af2448db31e4353c0bbdfef24c1ad7aa8a981eb834dce58f183bef41654069af0861c188cbb7cbe82790f6a307cefe10da7408f9ca0cdabe27128d3287e75a508d68c7976d61a9ccb0f29dd5ca1", "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" }, - "1684357867142": { - "depositDataRoot": "0xa3210c38e6081a61b91403d08242496fbfe178b0dc8c0710fd66554de0bcf7c9", - "publicKey": "0x94da8cd062b0138ac7ad33959902add168cc82a84a74f9f6c36ad4deb2fcc916259f0f55aba6f975ffdf726e0674cce3", + "1684510604996": { + "depositDataRoot": "0x9c9aeb5a7a2ec9abbfafb9cfb0be78abb8c05930f44df410180b326dfddca331", + "publicKey": "0xa146cf9f0f80de325b5b158f064580f5d7018507415d87fa34e8819d61e7483d8b38856409f8dc1330edb0d4e2a10eef", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c087a63d79ed00d008cfd376a2dfcbb96cc80984d4e68539b58d0023f454396fd06caac537a871aa7d88dc7048a9fea6e9965a046de877c2cba8853867fdae1c22b1bdf621f9b6391dd8a4d1a597ffac0be79c7309885831554869ec7b8fc6e5e7a0356f461cd83ff19665f66f884c7381269fbacb0344988d483e670b95c2629799cddd3d7137245b30d00a3b18b745ab8907bcd3354635e463bb24fcbb10677aac5a227277c4e4ebe31767ec4e043ca43ff6dd761d4bcecdabab9557c6c2e390ef4d3beb5f38dddef879ed5aef67fb7b66f67f8f5dd7b79af1ad7671e6bce3c7baf1fe38d5bf1f79d6dbeb86fdd35d5be1adb575ae7af1fdf9e9cdbad1ed5c7deefa79bdf57bb73b7bdeb769b71bf347f7f37edad3773d7b9db7f5aedfe1be1adde77b6f5d1bef6ef9f7a7f5738e5cdfbf35f5dddb6ba7dcd77f74efbd78d756f9e7a69af5dd35eb4f787bae7777973d6dbd77f5bf5d6f7f78f7a6bce9cf3d7bbdbad367bc77adf4d3c7f9ebdefde79e37e346bcedd7b4ef47bb7fad1e7df7ba69a7766ddef9f1e7b573a7fbd7aede7b4f3ad5e7ba79b77c6b775c75edf97f9eb87da69df76f5e69c6fc6dc79ae5ddbde1cd5fef777a77573d69bdb97f97b7d78d7475c7daf3ce3bdfcf3def6f7b6b7d1ff796b97bdd9dedd6ddd9ef36d3af75f34d5b7bb6f67dcefd7fb6b7e3a79ff37d7d6ded1e7fdd1f7f5eb8ef7e3aefbd9f7ded1cd75f5f75f77577deb771cf5ae5fd1b69e77d7777b471ff75f3ceb6dbde367dc6b86b7d9a6f8dfde34e5d69f75ff74d397b47bbd3cd366f9f1fd757346fcdf66f569de5dd9bf1b75f75ddf679fd9be7bf3a71b7fdd1e75be1dd3471bd1fd5d6f6d74d7c6f5ebaf7579a69f6baf34db86b5efb6b8d74f78f78ebb73a7b9e36e1e79bebae3c7dc7fbddb69de5dd7dd37f7de1b7dadf57bd77bd3cd1c7b673cd78ef9e79ddf6bad1df7cf35e1bd9c73d73d6b8f3cd39d3c6b669d7dc77d6b9f3c71ef38d1d6b96b9e3bf5febddb9d7cd7de5fe1a7fd6b8e7873bdbcdb47dbef5efdddce37ef7f1aeb4f3ad3ae3de37e757756dbef4d9fe1af3bd7a73bebbe1eedde7adbaddd7fd6faf1ee7b6f9e3cdf47b6d9ce35f1ce7cedbd1c79ae7779f69d7db7fb6b879be1b7dc7b7d78e75735ef4f74d3cef8d76ebd7dcd3a69fe5eef7ebb7de7b96fad3bf757f9e75f3dd34ef7f5f71fe79d39dde69eede778ebc7f4df46fddfdd5e77a79b6fde5f7f6d7cd78db6d1ed3d77ceb7f7b6dcedfe75f1e73a7b9efc71de39f5cf1ad9d75e75dd7ddb6e1e6b7ddcf7671ee5e69bd1af3a6b477969ad34d1ee3adbdebd73bdb469deddeb7d7ae5ddb8eb7d1cd7adf6f37f3a7dde7cf7d6f9e777fcd3c77deb8db9f1b79ce1be9ce366f7f79738e756fa7dbef77deeb4d3571a6ddd5ceb771aeb675fd79f5e79d6bb776eddd78d1ddbc774d9c7b7f74ef4d3579a75ff5f71b75feddef8f3d69f6f8ef8e5a73c7ba6db6f5ebdef9734f7c71fdfd6bc71aefbdda6b7778edcf1cef8e396dee79db9eb469ad1c71bd74eb4db7d1ee777deedc7747766b679ee1fd7de3cf3ddbc6de734dbcd78736ebd6f7774e39d3ceda7fb7b9ebbe74f5e6f8f786db6fc7dfe35d7ad5fef6e3a75af7673addef5be1b6b777bd1af1fe78f5edf7edbe3ddf675ed9a6f4dde777737d1bf357bd737e1b6bc6f86fadf7d36db5dfce9fe5debbf7c738f5fd9cdf76f4e37ef9f3b739d76d77ddcf5ddf87f8d1cef5f1cedb79a69e7fdef7e7af76f75e9e69ef3c6f96dcf38d34dbd77569ed7477675ad1bd39d5d6de79fef479c6b9d5a7fd79a7b9f3d7f4e3ad1fefd6de6b4f756b7d9fe7d6b479aebad5fe76737f5ce5fe9d7f47f9f5e6ba75fe76db9d1b7387fae7bef7ef6ebd7dddf5f5fd9fdf4eb775beb77b679ce37dbd77b7fdefaf78735ef86bc6f7f776f9e3575d7dbeda7fde3c6f9e3b73bf5b79f6db77bd1af76f3ae9ad79e7ad38dbdd7a777e37ef66f86f46daf7be36f3bddae7d69c7b86fbede6dbd3d6fde35d3bf7b7b47f6edae9ed9fd3b6bc6fa73a6bbd7ad9fef57b86b67df69f7fa75a7b8df77dc7747bdf1a779e38ef6db96b7d78dddd1d6dad9c75debdedef5f6b4d397f6d5aefce39e5fdfa6bc73c7b76fbe5c7de6b677bdfb6f4f76eb6f1c7dad5ce3bd1eeb47bdeb7f3d6f577bd3bef87b4d5c79fe7cd7cf76735f5de7775aedae3b7dbf1f7bbe37dbbdb9d5de9d6bc77ae7ae7b73bd1e6dbdfb6bcdf573bdfaf5ef5b77b735e7c736df67bdf1cd76d386b5778f7a71f69e79bf1fe1c7f46b5e767bae5a77d7f9f74e9ee34f7b739f1ed35f1e6bbdbaf3b734d9fddcdb67bdf39eb76f57b8d5feddf77f3de9feb57fa7f571b7386f46fbddadfb6f9f7a73969be3df1b6bce1aeb57756b9ebb6f8e1a7fadb6ef9737d7bdbd6dc71ed1bd9dd1bf7deb9d3c7f56faefc", + "shares": "0x00c081caa6c16a272622918886db902f3228073fa00cc4c5e365ec806fa650d4242f42aca8447361e7851e3955edf2746b56ac73b09c2dd726d70ca5b2dbf3474c58a1a5499e59958c3fd65ee77781a7c293cc12446ad257fa0ac1ccd2ed25f1991d8f608071270bb693ba0e8e3185a3a4c61ae98a9db1484e3b3899b0700cc2040662342f65bab01e6d9adcd56df03f2490845f84659648401a4380f99b12c17da050e8ecdfb799040d6b0d1160ad473f62aed8bfe5c9fdc85ff46fb762f373f7d4e7bf5df3be1feb8f3d6bbdb477b7dee7bd3bd35e9bd5ff396daefaf1f7b6d7cd78ddbd9be9eef469dd9ae34db4d1cdb4e3adfad79776776df6d9d6f7f1e7fce9d6dae3c79ed3bddd71d7baf1eeb8f75f5ed7d71fef5d1a6b6e1cf1c7f7d1c7b577c7fbf3775bd5ed9c75c6b7e1cf5eedcd3579cf36e5fe9bf7ddfde77dbde7977af7a6b96dad5bddf69fdb7eb9dfbd3d69c77cd5dd7ad3bddfdfdd9cf1b79f7366ddeb5e3be3bdb8ededf7735f79e77f3de5be5f7db6bdedcd5edbb6db777ebcd5e7b47f873cd79e386b6edbe1bebceb8e9fe7475e71deddf77f75e9de5fd9a736f39e5c7f7e9adb5d3ae3cd9c7b9ebbf76d38ef669cdb8edaf37e7b77ae766fdf5fe1feb9eb8ddd7bd71feb4f76f5b69feb77b673adbc7f5ef8dded9fd9aeb5d7adbdd1cdbb6b471c79bdfdedf7b86fa7377b6edad9f6f5f746fce3bef7f5bf1feb9df9734f5e75febae5d73de7debcede7dc736d7bf5ff766b6db9edd75e7787b9e1b73cd9f71aedbe75e9ef7cdb971d75eeb577875edb875ef5ae5f6bcf3c6f96b4f5fe36f367f9ef6f1ed35f78d5ce7df5b7b67f9d7ad7d7fcd1ae9ad9ce34f1f69fddcd9de38d37edfd7befb79fdf4d38f75736d1fdfb7fde9b75b6db7fd69e6b5d7a69cf36f746f5f1f6fcd36779ebdf78efb7bd73c75dd1a77c6dde776f8eba71d6b6e9a71be75ef575b75ed9be79e366dedb469ad5fef47776dae9d7bb7f8dbb79a73ae5f71b6f5eb4f787f66dfd5a71e69eeb5eddd396fb6dbf347f8f5ee5cf36ef77bceb7e1aef6dbceb9e77f5bd37f1bd36d5b77a6fc6f96de6bce5bd9ef1b7f47f66fd778736d34f5c6b8e3c79ed5e6dcf7471b69e6df6baeb9f5d7f96badb4edf7f56fc75d7f46fcf1d6b9d1bedc6f8d3473971a6dd7bc6de77adb4d1fd9a69f71b73ce9ad79d3b77bdfde5edb5ddfd5e71c737ddeefb7dfe75df56fbf7a69fd75e1dd5b6fb7b9e3cddc7346fcddeebc7b7eb871a79cddaef6f5d75ee5ce357387ddf5cddcd7adf67bbe3bd1cd9cd9e7dc6f8e77d9a777d1ddfc7f5e377f979fefce1d69e6dbf3d6b47dfe9fe1cef97def5cf5ee9ee3c7f9d39e78ddb79ed1ed77edcd7575fe1adfcdb477cd1aedb7b4e7af3adbdd7a69ce35f75775db973d7b6e78734d3479a7bde7af786faf3cdfaf3a7357366f67ba6fadf67f8d1be5ee3ae346f46bbdb5ef97bdddad9ef7cf34ddfd347f4dbcf35f777b4d9bd7d7b575feb9e5ddf57f477cd37d5ad39e746b8e9e6b7efad76dbdddef7bd78e77eb979df34ebbf3473cf37f36ef7f7671ad1d6f9efa71be35d35f3d7b471bef6e7ae7c73df5e734d7dd5c6b4f5ff1cdfd73d73dd5de1ee5ff1cd5eeddeb67777b6d3bf76735ef66b9db5e3d79aefd77d79ed5d73cd39db4d3af346bc7f4e79ef9ef5e797df6fc6f5f1af5b7ded1adfcf79d9a79ef77d9cdbcf1c7fdd37ede6dfe1be1b6b4e3af37e36eb5f367b4edd69b6b7f3bd7ae1ad3be1f7dedf469feb6d7b7b4ede7bde3875ef5aef7d376dedf76ded7be7aede73d6b7e78f767787f86b4d5fef97f7e79ddd69bdb67f673bdfd71a77defc79be9d6ddf3475f6bbeb7d9dd34736d3dd5fe9ef7c6df77bdfcd1de1f7bde9cd1d6f4f1bf3cedc7dcefbd39db9e76d38dfae7cddd6f7edfd3d6f4ef9dfdd3df3bdb6d34f356b6d9bd5df75e7debd7b6f5bf35f5c7de7badb9f7b75dd747f67f4df9df4f1b69debcdfbf7cf3bd9c6fdf7af3ae5ee9ad9d75a7dbd1a75f779779edaef57dc6dbd5af39e5fe9dd1cf77e377f6d3ae35f78f1ee9ee9aef6f787fa77979af37dbde76db66b9d7969ed9fe3dd1dd75f1aebdd9fddc75b6dc7dfdb8e77db5d5d7bbe7ddddf7679edf7efbebb6dfd9d7faeb6db5d1ae9af36f1a75ee5b6b5f7969cdf9f75f1ef77e36ebaf1fd1a6f7ebbd1e6bbe7ce1eeb9d346daef879fd9ad76ef67dde34f1fef7e35ef56fc75be7673adbad76d5bd1f7dfe9fd9bd7b69e7bd71dedbd9de9feb66fb75ff7ae1ae3af3dd7c71cd5ce1d6fd6daf1d6b57dd6b6e74774dbc7f7f5f6bd7f471bd5af35ebc6ddf5a6b673cd3de35e1ee36d1c6bad74f39e7bef9dbcef479cdf4eb67f6ddfddde3775c6b86daf3bdf6d7ce5b7dc738db6775d37ef9e3d6dde79d7c7b87dd6f76b4f7c6b9e39774e79e5cdfbf1fe5aeb97baedd7b77b9", "cluster": { "validatorCount": 0, "networkFeeIndex": 0, "index": 0, "balance": 0, - "active": false + "active": true }, - "signature": "0xa1bd04fdeb5fdf27db1649f8ae12a932e38353523eba695adaa3612db59472792aeb309bb91e2862f89eb4c707aa565e19d9cb4db73bdb8155074c4d7d726da08ca05bc2ea06df4fb1ae5a81108a891e7d232a6f710bb24280401d79a744a7b4", + "signature": "0x8281218a5eaa9295e8e6ea7f65a6e140067d4490928616ba8b2ad2d3a0cfe9a22fe69295a794e11276bbfb04093d971c0470c01e5aa078c5f0acadd4b9b6da85813bb9fede0498712c0547b425994b8cc1ab36216754daa6b441b170bc792624", "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" }, - "1684357880194": { - "depositDataRoot": "0xbbcd876c2748a255905093858276c9d64cb678bd499d8f3769560ccb9ed5d783", - "publicKey": "0x98f5be29757f3f5d032e8bb09818c4b9206a88a62f246865b2fa297ba234c835c48609e821649dc70f166199e8a292b0", + "1684510634604": { + "depositDataRoot": "0x88803f1f233c87184b09a2f32b01a45193a024a10ea90ea99c9276190222dab4", + "publicKey": "0x8c4d72f7b4cebaac60cf3ee369a963fc509e6ad902fe206be15faa79e8fc41cfc61aeb6a88cd011de7c67330b917d109", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c099dacd9f678314dc9f5ad0fa26cabcf0276c111517f58b510407200aa8e9e7b79e573e7a8378cb59378a1c88a46ef4eab00d55a998612b92d8b75bf6f004424093469d17f091c3ff7b1cddc37673a76c302d346a9ea27b3475b11982bccc0e81b738400b0b575e503da66e365d5beec0f09e2b74e484c1c5eea7d318af143b15154725570c686cd7924240638e22cc57b77c3d86e275a572816b38e1efa3c7adf1d0bec4b201c4bb3b51457bdd671cb928432e84010e25ecf26a484b3dac90b6d5edde79cefdebd77adbddde6f7ef97f86f6f1aedef7dd5f6bddbadbcdbb7dcf1aef8f386b67f7d1df396f669ce3ce1de1adb7ddff75e9a7fb6b7e34efa6fddfaf1cf5e6b67dcf7577dd9aedef78e3cf36dfbf7c77bf5eefbe5d7bad9ee9b73dd1e6f4d9ae35d1dddfe7c7bdf7ae7ddfcddd6bbebbd9bd1fdf9f76f3cd7c7fbf1be1b79ddfcd3aeb5dddd1ee9f7fc75ceb977671adb9df46ddf7a77b79be1ad38f5fe76f5de9bd5af3cd3bd1fd3469bd9fe37d767ba774db87f4e787de73473debad1df78eb5dbdedceb579a79c7fb7767fce7869ddb4d7d77479b738e3d77bddc7f775bdbaeded5cf7bf7675bf1af367bd6b6ef4778e3975b7bae3de9de78df97bcf79df6f1e7ddef7d5adfadfd7f67bd75de74e1dedbd9de1d75fe74ddaeba73d69e75bd75dbcd3bd78f1d69cf3d6de6b47b46fbf77f78e3de35dbcd9fe5ae7af7cf5e6df7f9dbb73575e6f56ddf3ae9dedcd37f796b5db47bae5cf3c7dfdb86fa7bbd79d3b69af3df36e1b7f869eeb879fd3bd3ad5ed3de9b73d7b9f7be78ef969a7fb77d7b9e3ad5dedc7b4f5fe1bef8ddb6de6b5f1aeb7e3adbb6f7dde6b473adbd7fd7bb6fcd3cd1dd1ef76f5f7b7d7471dd7ce35e7bdfad74e7de7cf1ed797f46f46df6b7f5cf7a6fa69e7fdd3b7346daf5de5befd69ce1c75aebc7b877dd3ae9feb5d5b7f569ed9ae1fe5d6bbe3b7f9e9de766b6f7a69fef6e1ce74e5de9febbe756fd77defad7cdb97bdd7ad7be3cdbc7f4ebbd5c6b8d75e9aef6e9e6fbf3adddd37ef6f766fc739f36e1df1b77471bf3c6ba75fef9dbad9f75a77b75fdfa77ad3c71c774dba6fbf5d7ddf5d7fdd5c77b6f9f35df7ddce1c73579f7787ba774db8d79efd75ce767bc7f77fddb9ebdd5addf7bbebad7ce77e9e75a79ae75eb76b8f5fd9deb8d9fe9df5cd9fe5f71cd5fdb9d5bef969edf8d79ebb77c7b56b7f3adb7ebbe1ddfbdbceb8eb8e9cd1ff1ed3de34e7577569addd7b4d38e5d69a79ae9c6f66f86bb6f975fdf96da73b75ad357de7fce1dedbd75d747396b7eb56f8db9d1ce3c7bc7b7eb8d3def7d9cd5fdba6df77c71d776f74776e3bd9fd9ed1eef7edfd9fdfa779d1ddb9f5ae1e7376fd69e7bbefcedfddc6b6e776f4f77ebad7ad7973c77d7fbdbd75c7dbe9e75de5ce1f6dfe9df5c6dd79cdf7eb56de739f5e7b7f38f5debbe9e77b6f96fa79fdbaf1aedbddde77779e746dee1b6fbdb9e7af3bf38df7edb6f46b8e9a77cdb6d35e5ad74f7675f6b5edbe9e7746da6bbf38d3b73675def5e9dddb6f4e1cf777bbe7dddadfbe3d7b6dfc776d5c7bc69eeb479feda79a77bef9eb4e34dfcf78f7ad7aedbd5de34f38f35e347dfe7defdf3de5f7b66fadbc75ce797b5eb5d5bdf8d38dbc6db75d6fbe3ce38d9ee3af37d75db4dbb735f3673cdfceb86b5e1a7bd7b67f7d9b79c7f6d35f1b79deba73b69c6f8776efaf3969c734db6d39e3be77f7cd76737f1ee1ad3c7bae5bd7def9779e3be5cef56f5edbddd734739e1b7def3bd37d386b7db8d767376f57bad77ddcdf7e5ff3af7cdb4d1ddfce1dd39db5f5a6b4df8d9cdda69ce377b8f75e37f79e1e73cd9c7fdeb9f7c6dbd7d6bb75ae9cefb7fde1d7347b771c79f71b6dbf3c7ddd9ee1ff1b779dfadf9f1ef7b79fe34738f5cf75df9f1ae36f1e7bd7dde34f1f6badb875dd9b79ce3d75f7fbe396b66f8d5ed3b6dfe7b6b969aef7edcd76ddf7b8d9c6f5e74e5f75e6f8e367b675a7f879d69de5ae7df3c7f4e7ae9c738eb4776d1adb5e36ddc778e1a69d7f86b871bedd79d6bd6f479cdbdf79edaef9ddef7ae5a779d5de3dd76e7cd35f74e39f5ce5bf5a6fddb77dcd5ef356faf1f7bce9ed37e1e7ddefdd3cef8f74f39d5aefad5f77575ad3a6fd77ae75ddf71bd1ddb56dd778e9ee376b775be3b7f4f3d77769b69d7f77b46bc69ee36d9aeb5e1be3471cdb77dc7df6fdf79f1aebdf36f5e6b771bd75ddbd5be9b6bb6f7d37f5ee1f6b8e3ae36ef67daf1a7b56fadb9e9e779d1aef9ebd774f7a69ad1ff5bf5de5feb5f1bf1af7cd3779deb5ebad3975c71bd7ce5fef67fde39e1eefa7f7e7b7b4d9de3a6f77b4d1d6b8e7df3ae34dfd6deebce3477c7baf5fe9bdfc7fbd38d3dd3ce3a7366dcdf6f3ad38db7777f3b77dd1bddbf1d73971d6f5f79d9fd7d6f7dfdd7c7de", + "shares": "0x00c0a48c399da36abc5e0d3a36eb71c920ac130005c9bfc285ae10e85f77c75d1f8262ab2d152ed98545c2ac1ca8feff27e0a71d4ce6efce1201725f7bead50d7eef1f65be704d967d79ba62349f1cf41550b26211b1a93276d4e0ebeb37131f0b77b229afa84d4122f2656c9af0338150d4bd03e03b6a41947b6c8f7a3361b6276255ee552cfd8ff2a3b7b5793e9b09ba6d82a29fe65eddfb2f0ee28a959f48cbeb4693ff5d188dc48290dfd7e8ae79cd6d4d99498564979fb8d98823eb4c94fbe4dfaf1af1c6b7d7cdf8ef579b7dc6b8f78735d3adb673af5bedaef6f7d6ded9ff35df6df6d9a7b56bdd7bf36e386f77f8eb7e3a79f69ce9adb67bad9ce7677cd9e69ceb9ebde5af5a73be797bbd37dfce1fd3af1e7bde74e5ee9edb76bdd756fce3b7ba6f5e9bd9fd3af7b778df9df8f7969cf3c6fd79c7def7a775d75d3be5d6b4d9d778f5fe5aebcf3cf3d75f778dfbd1ad5b774f34dbbf7875cf746b4dfadfb6db75befc7dbf7ae9c75ae5e7f7d3671bf1cdb6e7671ceb47f7739e9fe7a6b5e5ed5ff5ef5cf1c6bad3d69ae9d75c6f8ebb6bce7dd7cefbe5be1d7b7e7bd387db6bbef9efc69f7b4dbcd1ed347746f86fcf3a7f7e1ceb479ad5fdbae5cf5ef34f5fe3de7de74db8db7f7adbbf7bd9f7b86daddcd1ed9c6deddc6b87756dfdb47bb7f9d7df3a7fcf7aeb46bb69c7f56fa7f9eb4d1be9cdda77bd9adf5d3de9e7bb69ce1b75ed7adbbeb9738e5c69ed3ad9feb7ef5d5f7fc7786f5d1f6fd77d736f5bef56b8e74d9ed35d5d7fad77d3be7bef4e797fa7b4f376fa7bae3cef87dde7a6f577c6bcefc6f973cf5fd36eb9ef875a6dbd7dd1f7f6f1f6f5e7ae79f5cf5ae5ae9b6f979b7dae1cf76d5c71ee7c6bcf7beb66b56fde7dddff1af5c7dbf1a777f78d5deb5ebb6b6d5af5fdfc7faeb46b871edb4f1ef5ed9fdf8d7c79bf7c7fbf7d73a7b6d9fe37db57f8dda736d5eef4dfcd1ddf5f7779ae5dd3adf6779dda77ae9df1ce9f779dfc779e5de37d1eef7f7bd9d75b7f96fc77af376fc77c6dc6f7737d7ceb6dbdef56da6fad1d6b76dce1ddbde7dd5df34f3679ad7869dedcd37dfd73c75bd1de75d35e3b6fadf4d1d69a7b6776f76ebc7f6ddddf87dd6dfe3771b6dcd3af1ae9aebc6b66b6e3deb9dfdf5eedeef469ee1ce5d6bb6ddef4e1a6f5d5ed9adfbd5bdf9ddce9ad9ceb5736d9b6dd737edc776db86f66b9f5f7fa7daddd79fedf7dee9e6b4dbaf3969ee3af77f5a69be78dfaef7df76b7d9fd9dd7aefc79e6f8f1edbbe38ef7f7ad3be7c7ba6b6e3ad39776e3bedcd38df6e3d6b4e39d9df1aef975f6b7e3df3c6bc69aef7df4dfaf34ddb73b7bc71b6bde79d5dedd738d5ad357b7f3ad3477571dd9fd3c7faf5cd1c79c6b4e3defdd7cdb9f7aef8e777df75e79de1d735f1b77cf35e1cf3a7fbd5a738d1c6b7e9be7bef47df6fce7ce7be78ebdf36ef9db9eb9d757db77cf39e7af37ef9efae766dae3a6b6dbbf1af1e7b9dfce1bd35e3c71de3869e6b6e3bdda7f6e3971c73ceda73dedfd75f3adfae7bf7d7f57ba73ce1b73bf1c7b5ef67fbe9ad75edce1cefdd5fe9aeb6e1fe76e9be75d1c7387b5e3bdfb6dd7f575ae5ff34d7ddb9f776b4e5fd3aef8eb8f39e7471ce1e6b6f5bef7e7def5db4e9e7fce9bf5de7475d7b6f3579ad7ce7d69cd3df1fd79e767dfe9d734f5be3de7bdf8edcd386dadf96f873ddf9ef46b5ddae76774d74d9a7786f769dd356dfebde397f5eb47b6f5fe9be5aef7e1ed9bd9aef47dbd9bf75f787fddfa7f6e9cd7cebcef47f8e3c779efdf5af5cdbb79a737e1d736d3ae7c7bb6bd6bdedcdb8d76dbad37f3a75aede6b5df67fdef9e1dd3c73c7fce38e9addf79ce5de7d6de738f7a6bce7c79bdf979de7ad786dbef5d9ce3de1def5ebcebc7b5e5debbf5b75f7bbf3c7df77de7669bebae39ddfd7bdb4f757b77f4dfad77d1ed37edc7badddf7d6b5f7cd77d5df74dda71ef757dedfbd5ce1ae1af1cefb738d36d7469fe9edb6e3be36d1a6fdedbd5af3ce7769df37ddfedee9f7f6e5ff5c7dfd5fd5dd1ed39ddddbdf74db8e3cddfddadf76f4efb6f76f569d6f8edaddeefaf3cd3d75c6b7d38db9e38d76e79e3c777d76f5fedaf7d6dfebce1c69dd3bd3bd5addcd9b75b75a7f97dbf1af7aeb8f3873bdfcf3aebb6b9f39efbe1ed5d6fc79e6dc6daef8e3d6bcefcf78efdd39d34f7bf3aeb77b9d5ddbaf1f75c73a6f9d35e387b6f74735edb6fbf1de9fd35e9df7d79edfcf5c6ddd796f5f74db66f9db7f1d73df35e7be7af3be76d7ceb9777e357bce7869ae5de9c7b573a6db79aef9f3cef6dfddfae1fef679e6f5e9ddf4e34d74ef9f5ae5beb677775cf3579ee796b4ef47f47f471fe7577cd34e3dd397b6f1f77cedeeb47b5e9dd7579be39dde6faf3cedfdddededfb73dd77d7cf39df6e5f7dae34d75edb7ba69a", "cluster": { "validatorCount": 0, "networkFeeIndex": 0, "index": 0, "balance": 0, - "active": false + "active": true }, - "signature": "0xaf3f43fee460de02410f7bbe2f3615b0126d88de9d61030901b751a1f76eeb4b842e2d57a346c39d7f6e00c33ba4ba1b0d76a5729238ad61de067ef379c8de0e8019a553d4a9bbd5a0f4392043cee2ea25efc44f3547145ca3b0154ef1601584", + "signature": "0x84b5a44818634ebc523a98acdabfa98ee40acdbfb9d553f33fc9e6cb46158a8ff81383d4d144ec08c2822587c733a866033a5046e4ca6e1dea1f7b7a5c02efea1ce54470aff6e35932a0e2ca68a0c00b279272a66f6181dd18083beab247eb55", "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" }, - "1684357893150": { - "depositDataRoot": "0x0d632c7f52733ae2941c99ad8f604785de53d30fc7a4da61fbe80441ba4ebc8c", - "publicKey": "0xb113319f6159825ad0ba3ea44a3a9ca6a67a10e122ca4bcfb2b0d63596c6f14fecb43933a4169c14108d98f907672c5c", + "1684510649301": { + "depositDataRoot": "0xf4727f35ffe865e0eeca09b10673f9d15ca03e500490dd12fbf7c3dc4bf3e7e2", + "publicKey": "0x850c2153238347e5ee23f28676f1508a097f8e78d3e576391c5d9afeabd0cf4cb678dc299cdf91938f939724760db6af", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c0a1162ec3924b9c31b87bf3d90f6c11725a59830145c64d2989d73973e9a74b1cfb9e65085621435d06351514dca78b2499ebf8e2ac9c896b5dcf067b6f18d4ace780f0d93f531599c9b2d8710d8bb0190ec5d8caaba56d334b9e361deb552a86a7c6be227fcbae53f2599b69ec4f2a468ef5f4e66270a99762a9ed39f2c46ede6a644f9c7daa85b69f4d080fa67a287d81c168bace70cc2b6cd1cbfc6b35fbe82a8670dfb650a8f4b22df078b37cd15c9339aa154f6ae265ec09e0a8e8f644dbd9ee5ae1cd1de9a7f577ad1bebb6fbdfdd1cf3c69d69a7fbe1aedd69f6bd6b677575c7f4e9ce5d7b56b56bd75ed5fd77e3a69be36e77f3cdb5e347f47376db7dd7f5dfddfbeb97dd7b66f4e7671de5eedd71a6b9db5e79e1ed9eedd77b6bdef66fdeb8e38edc778df67757db776e36f1cdb56fbe1cd9cdded1cef6e9bf38e5ed5af3ae5adf86b8d7c69e79d71c6f87f9e5d79b7f7e1ee9ce78dbcebc6bdf7ad3af5b71b69ddb77dbe9af5dd1a7fd6ddef5775e1c6f4d35d3ddf6d1cd7df776dd775e1fd3ddda6b675c6f6e7ad9a6f669c77b7b675ed9ad787b4d37776d3bf5d7747badbcf777f6f7cdf76b8734e79db7d1de1bd7d7dedb67f67f8ddff5c71b73a79b7ded5c7b66b5dfcd1e75c6dbf1af5ceded37778eb573de1c75bd9a7356b8df8e3be757db7da6df79bdfae3af75d1bdfa79eedde347ba7786f97f971b6dd6bbe5c69addd6dd75af1a7fbf3df7adbad377777f479c69bf3c7dde5dd1d71c7b66fdebbd77ebcddcf34d7477ce1fdbb6ddf38f1ae5ff3ae38e5c69cdb4e36f77db9efb75fe5ddfb7f4d7ce3c736f3c738e9ed9b6f5e3b7786bbe38d9adb6e38e9dd74d366def7cefaf5ae7a75d7ddd36d1a7fd79eebcf756b4efb77dd7cf5a6f96dd75dd5e6baf1ef74d5df397df73ad38e9ae3ae5fd9e7f471c738e5d7367f67db774d37f1af767b6ddfd3679bebddfc6bd79bd9d7dbd1e6bcd79efc779d35d5be5d7f87dfef46dfddbe77e5b7fbdb7f5adf4eb87b9f5eebdf1fdf9e3aefad5eef4f5e71be9ee7cf7479de5de5a6fa6b873b7f5ef96f8df6efadb8d3cf7adf4efbd3dd1b75e6f9f357b96f4e5a6bde767b4d74d3577977cf5aefadb7d3ddf5d1f6b4f79d77db5f1bdfaebc79be9ae3cefd735e76eb7eb5e387b9ddfe77dbbe3c75c734f1cf35d9fd74d5f75aedbd757f8ddae757ddd5eedd6f9db475fe9e77bf3d6f4d5e7bad9f7f57b8db47f6df5f1ef7bdfdf5ddfbd7c7bcf79d3cd1ddfd6df75de747bcf75d9fd34e35d1ad5e75bd3679b77ae5de7de34e5cf5af7469a71bf75774779dbadfc7747f8df8f7bebbeb9db76f9736df97b46df79ef7a6fc778df671ef5dd5ad3777af3c7f977cddd777e7def4efb71d77cd9dd37e3c775edbf7a71f73969f6dbe78e39edc75bf39e34f78d787fcefa7de7fdf78e1eddce796bb7f8e9bf78d7ad766bbeb477979b7dfd1dd39f3d7fbeb7f3571ce9be5a77b6dd7bde5eedbf3be9c6b46b9f3adf5f5ee34ef46bc7f47b4eb4e5a736e9de5c736d1c6b8dfb7347dd73c6f6f75f37d5f6b8e3dd78e1de9cd74f3bdbdd9fdf479beb6d5aeda75def979fdb6eda73cebc6dcd5b778f1e6dc6dff7ad3cd9f79a7bc75e77b6ba6fddbce77775e39e9ae5bd5c6db7b96b8774d7b6b9d357ddd9be5e71ddfbf5af1ce796fcede6bd6dc6ba79cf3cedcf797b7d3adb97fa7dd77579df1ad5bf78d7ae34776ef9df4dddd5d75e69e7f5d37eb679de9fddddf86b4e9be9fe39d5f7f5e5eeb8ddfd39d1e7b8dfd6b5e5af356f4d37db7f79d76e75e3d734eb6e7d6dc7dce9d6bbe78f3df78d3c6bcd75dbb69e73b6f5db5d7bf5cdbdd1cd9ef7bd9bf35e9fdbcd3bdbce3deb573973777b6f8e9aedbf1f73af77dfa71beb66fbdf76ded797f4f34eb6edf775f1b7b8e35f396df7b47dfedbedce76ef4d3befad35f357dfef97bdefa73be1ed74f5fdbde5f77673ae7869edb46f8e3b6f6dfcd346b4ebbd1beb7efb7ded39d1bf1ceddeb8eb9d36e1ddb86bde7ae356f8db56f8e9bdbadfbd3c7dce3bef9eb56f9d1fe5e6bd739e1eef67f5e7bef8736e5df1e79cd36ef975ef5ce3869c69e7dcdf8ebb69b7f4d9eefb75c75fe35d79dbcd9c69e776d9ae1ef366f969fd5f71ee7c737f39d1cf7c73cf7b71df35e1f775d9b7f4ddedbcf7d69e71fd767dcddad34ddddb5f76efcd376f6e7d79e7b4f776f5f746f777d79ff7adf86f5eb7e5d6de6bd6b8f7869cdbddde77af3ae9b7bcdf4df6ef9737dfc7b6edce386dddb6eddd5f734d1be9ae1af3c6f469e7de69deb67b5d5a7dbd766ddd3b73a77adfcf78df8d9f79ed7669ed35dfb77ad7d7fd6f76f8ef7ef8d76e1ef3a69bf5cf7b7776dd79dd3473869bd1e7dce797f879ad1aeb571c6dc75cef4ef7d9ad9ce5bf1edf871de3a69be1ae3d7787fbd9dddaf3a71fe7b6fc", + "shares": "0x00c08ce94cbefd894f2458feea399f12015802acec015ad10ca80e8c9238fdb0a014d0d2a69d7a31cdb6a7e4cf4b4f66e064afeab85efebcff66dcc2720d6d3357061253111790e0ea8ae6c33a9667b7d0b41c0e1e601fd9899de640b5a4d5900816a615fdb5827a54903a3aba58f6dd52c25965100de37637f1d631dfbd114b6f63a3aedee619bbf821d590dea0bf1cdc6a993db680ef96cf8772a82654ba1af3e43f4acbb35382bdf44f7e891593b13580f7d9b0728f2c74afedf2f0a113bebd79edee1b6fd79ed7d79ed1be5adf47f4d3471e6deddb77979bdf971ff3873bedce3beba6bce9d77befd7b96fcf5e77769ff7d6b56df7f769cd34d5c6dcef6ddee9a75b7b6f7c7dfdb971f6baf7d7bd69ff36ef5f5bf1cd1e71f7f96bd7baf797dc6dc79e6bc69bd76d9ed9e7fb7347fa75f73defc7387fcd5af1c7fad7df34ef569dd7873469d7fce796f4e5ef5cdbad5fd75df7e3c7dd6f56bc7f4f1befdf5dedcd5b7fd7f4eb97386fb6f4e747dd6dce786de6fbf7879e7b777cd1be9ed367fdeb5d9a6ba6f4dfbdb669f77ce9ae7ae9bedb77bdde6f7d1b7fc7f86ba7f5f377357b7f7ce5fd7cdb77b46b8e1cf1cef77347f9f7de5eef8e74d38e1e6fc7da6de777ddce3bd3deb67fcd77db9e9ef78f5f73cddef34d34eb67f969de346bddfae3569fd9bd9dd77d37edcd5d6b8ddb77cd1ceb7eded7ce5a77cf3bd5d77be38f5ee9fd7dd79e1fdbddfbdbc6bd77c6b96f5e5bdb5f5fe1ddbce5d7fc7ba79b6f9ddb6dfef5d1dd5eddb79ad3673cdb7d3aeddf757387f9e5eddb6b9d3cdbd7dad797fa7787dd7f6778dbad7ae34dfbf3cddfe35f3c71f774739db4ef9ef671fe9cebbf5fd1a737df675bdb475e71dd3a69ddfae5a6db6bb77ae9be9d7b8f3def6efae7a7f5e3479bdfcdf9e5af5a739734f3ad1a75cf5ee5de7cf7ae3475a7f7ebde7877dd74f1e75dd74e76f5cd9c6f97f5d79ddfdfbf75d79f1be1bd34f7b7deefaedc7f76fde3d73bd74ebd69a6fbe7679defb77dd7ce3873aedfd35d9de36e7479c7bd6f9d777786f57b5e7a6f6d1c737f79df6777d3479dd36f74d9ce5bd75d7bdfae36ddae5a75fe1f7f9f5c7deeb56dfd37d9cf3d7386faf5f69f79c777f39edd6b9f1ae1b7faf3bef477d7dcd75776d1fdfddf969d71be75d5cd1ff34e9e7dd69e6f8739f3de3dd1ad1def96fde3dd1ed1ff3ceddd347f77bd7dde9ad9d69fdbd71c739f38e9cefae1c734eb9d5af3a7db7357b87f7f1cf5fdde77de38d77e366fad5d69aefaf767b9d9ad9feb96ddeb6d35e3b6f6e5f7dde9d6fd6f7e9ef5af777bcd9b77473cd1e734d78edbd74d9fe9f6b6e3af3ae9bd7cd7a77cef5f3cd3a77b7b7d1feb86f5eb769c69bd1cebbe38df9d77f37d5fe3a7f76f86daf34f5bef6f78e7ddb6e1ddb7f346fb777dda75d79d69cd3addbf3675ff35e75d5ff36e76e9befde5e7bd7b87f5d7877c73ae5f6bdd5aeb97fa71fd3975ff1fdb4d3bdb47fcd77e3469b6dfd1e75ee5edf46df75de9ed3beb5db77f5db67b77b9ebbe75735ebce77d5ce3bedde9b7b5e387da7b9d5c7776f8ebcf3b7ddf1de78e9de5c73569c77b6fb7b4e5cd75d9adb4d9ee1ad37d76739d34db57bae5c6fa7db7bc7f86fbeb76f57f57f6db76fa7b9ef6db7eb4f1de7bdf87f9d5f7dcd77e9bd1eedde76e9eeb5d5df7bdb8d7b79af3cdfdd1dddad5b77aef4d7dd5ef1e71ff1adf7eb4f76e9cd1aebc71e69cd1ff78db577d6df6f87bcdba7f5779d1f79ae9ff5e6b9f34f1fd9bf1c7787f4f5ed39d7673beb77f877677be1fdbbdb56f8f7479f69df3c6fdef86ded7de5ae3c73ad7ad9ad7de77db8f7d71bd5def5f76df8efc6fad5f6fae9d6f5e37e7ceb6d3dedb6fae39dded1d6de6fad76777e1ee37dddd1bf5b7bcd5fe5ff3ae1ce9bf38f77e9ef5de5fdb6d5bf75774d9ce5a7fd7bbdb86b7e9edfb69a7b56dfe3b6bdd79d5d7db73b7f7df5ebce5b6f6f76d39f3bdf7eb86bce3cf1ef38edd6daefaf79f39eb6f5fd9ddb5f1dd756f4d1aeb5737f77efd71ceb471eedcdfbeb8e3d7dcdb97b6eb5738f1c774f5fd5a75edfbf78e1ad1e738db66b5f3ce9ef5fe3bedfe7d79fdb9df4d77f76e9a735e1edddd74f5a778774ef7d9df78d1de9ce1b6f4ef8eb9edf77bf1b7bde1eeb5e3d7dd7b569d776ef7d7c735ebcddd7786dfd9f79d7797b473ae39d38eddd7675bedbe35d5f6f677469e6b7eded5fd797dbdfb79a6dd6bcefa6b9e1d77d737ddd6b6e9adb6e3ae3d6b4efaf7b6b4db86fbe75eb479ff5feb469cef9e78e9a7376fad5b6fddf97b57db71a71ce3ce5de34ddbd74d7ce3be386f76f7dfae5b75af777b6f5c7dff1ae9a734dddedb737f5fd1ddf675fe3b7dfef87da77ce1cef56deddc6fde9fe5fd1cd9ee1de7bef9ddae5ae77db6f38efc75cf34efdf7af3c6dddb76ddd5a6b7", "cluster": { "validatorCount": 0, "networkFeeIndex": 0, "index": 0, "balance": 0, - "active": false + "active": true }, - "signature": "0x81a3a8a17153832df5096ef904cc2626b958d6ef9d6095f3fba1081c59fd9902c5c857de5a88984ff0a75c76e44079290598f172bfbe3e61639c1b8a35d16089e6fb4cd9df2dd817c3a19522d002023eb2485a77922ec466ffd15465f59b5422", + "signature": "0xacea71d27d0d06f377a068546622342923263002a631f94137138370259da0f540ebf62d1f28b7eb5885fad2faa6cf201535cf37b5d81cd35c6edcecb6401fd8a1857f46429643afd77c6dac261ec95dbec9dc3ab94adf8c17d695e7f212fbd5", "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" }, - "1684357906265": { - "depositDataRoot": "0x69c653e233a0f57aa0ca4a69ebe3786f08366833350f3248e8c1dc5984ea1c35", - "publicKey": "0x9745c87e2ceb9fd55bf81d0974b325fab08a6294142da7996521697a17ce6379f8fe73155d8a6954231d7b8e4ffec34e", + "1684510672675": { + "depositDataRoot": "0x79aec076c2202b3193d166ed2e12e6d30a13059e695374b3fda7c25afa7e2192", + "publicKey": "0xb54899b76e74e0188d14f43d9cb67efdf941dc97334d6689071cb0bc903b2c57421067e5a7c1edb47f4d8039e71421d3", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c098a0a043fcd3b5db59da3f53278d03ec486d67034890413169f03a979159dd55d54199812e45d07bab360e982d1fb57da39307046d3f17d832218fb37ede86a693e113a7ce0182ba5c051853825882ef2e62f1452a335326c0540ee2cd67f80a96dca2f210022aea4bca49be1eb81b119887f372c152752167587001d5d8c5c9df20d2303117c79892b6906d78e51e17909643b428ecc2b8a801ee21f172795a839d32c5ba6ace984273e85eba8aa532e463b5c4432fa9ef9ca990eed4ccd5d9db4f7df7ce7be1d7fbe35dfd7db6df73cddfdbc69cf39e1ef1f77bdde735f76ef77ba75f75bdf9f1bd9f734d79edb6b47bdd3d7b5d747f8d37df6db4f37779f1df1df3c69cdfd73be38774ddad9dd5b6b6ef7e5dd5cedbe9c71e6fcd7ce7b6bcebbd5cf3cf787356ded9ddf871f6bcef4d1b6dc69e71addde9d6bdd3c6b577773879cdb469df3bd5fdb57796f877ae77eb6e9cd1f7f4eb9d39db47fdd7be37db67fd6f5d3b71cf38edb7b77dbf1edbbe77ef879fdf57b6f37ebbf7b79d7bd738ef56fcebce367b7ebcf5ff38f37f5dd5cedee78dbd6f4f1addc6f56b6e7775e77adf67fddfcdbbf7679edb9f35ebbf74d1f75addc7ba6b973cdde79aedfd1d7dd79bd5c6bae5cd7bd38eb8e5cdda7fad9d736e5adda6dd7dbeb7d9adf87b7d786f9f1adfdd5e6b7efb79bf7cf5dedadf8d1fedf6b76f9f5d69fd7ad1be7bdfcd777b66bbef7edaf1cdfbedb79fd3be9e6b6e5dd3675f7b4e1dd5f6fcedfe79d7be36e767b4f1f6dedb4738e3bddaef8d1beb7e9e7fa71fedbef77baede71d73469b79f75fe5ee5af386f6ede779f7d7fb7db6fbf5fe9f69fd9ce1df1fd7cefbd7775bd7b6fddb977b7f7d75edc79b7b977af1deb971ef5c7b7f7b7fd7de71eefa7396b46fad5d75c79fd3dd5c6dae5cf3dd5be5e6da735d34e387f9edde37e79e757776b4e36dbdf76df4ddddb8734edae76776f5ef1e79f7b9f5addaf76e77e7ddfa6bae36ddaf1b73be3a778dbaddfdde778df7736d3af39e78dbddbd6bdeb7edadb8efd7b9ddcd1aefaf7969ae3ddb57b875c6dfdbde5befddfde36e1cf78e7d7dcebaf5cf1cdb475fe3dd5c6ded5c6fa6fbd3df3d73475de5c778dfbe9aedaf366db6df735d3969aef5ef571b776ebad1c6f56b6f5cd1ce5bd5cf76e74d7cf1de1c79ed9a71ce7ddfc79dd1cd3b7346dbdf7efb6bd75af1af1bef7d787daf38efdef4e9c6b47b96f469f7da69cd79f37efc7fde9f7dbeb4dbb75adf6e9ddfa779f5ed5dd9e7f76fd69d6fc6fcd9ce5bd7bdfad7d69fede73a7b7e7c6f5f3779c6fdef6e7a7b6dbdd3cd7dd1de3adbc79f7bcdb8ddc79c79eddeef8e77d1f69eebbd7a79bf7a6f7f1de1ad39efa734e9e7db7f97366da6f4f1bd3a75a7f4dfd6bd73a7756f57f5d9b7bbd5bd9dddcf7bd39db8d77db573cf1aef4d9e75be7ae39d5f7fce39e5fef6f34775f3c6b66def7873769fd7cd5ee78d76d1b7b6d7ddfce5d7ba77cd75ebadde6dbddd6bd75af1c7de77dd3debb6fd7fbe39d9dedd75d71e7766deddee75d9edbd69fefb6b9f1ae1a6b5e767dbf77f1b7347b56daef9ef9e1d75c71b6b879ce9e7ba71fd9fe5cf1f7fadb6d37e5a69de5dd356f879b7f4ef46da6bc7b56b4f38775d7c79feddd3cd376f869dd5c6da6f4ebbdf6d9bd7deb571fd1c71eef5db9e9ce7ae1ce1df5be7d71ff3d6f5e7adfcf7a77bd7de9dddedf673ce77edde3675a7b7e3577ce1ed5dd5def67dd7def34779f5de767756fae9fe1b6fb75e7fbef47bb6dce5bf7bd1df7cebad1f735d3df3b7b46dfedd73cedadb9ef979b79aefbe7d6dfd5aebbede79adf67b8e9fd366bbd9fe7c6b6e5c7bdebcefc69df1bdb66b9d9e6f4d3c6bdef66de6fdf7ae347b5f7aef9735db7dbae3d737e1ff36efd7bcef9d9cf79ef7d9c777ebbede7baeb46b5d77f78f7d7badfdf7bd3cf77f3cf5eddb7b8dbdf7d73be5c778d35e35ef9f3c75ddf5eb76dd6b66dee9f735d7b79ceb8ef4f7bedee1ef3873d7f9d1ef1ad747df6b4e9ae5af396bbef7dbaddf7367dfd3a73869e6da7b6ebbe1bd9c7fddf4dbbdb6e1edb5f79f776f979dd9b6b8d3d7b571fe34d1f7db77cd7469edf6e9ae5df1ff5ed39d1d7347dc75deb47f66b47b673c7ba71f79f6dfd5ed3aefc69fd75f3bd39e7d79fe76d35e9d69d6bdd1e775eb5f7777571e6b9df4f37eb7d1ae3673c71bdda7747dfe79d7573d7fbef46bcdfd6dc69ed1ff36d79db475e6b6e3cd5ee5df5e6b4e1de7ae78edef3871f735d7d7fc6b8d37e77d5dd7d6bce3d735f5def9d3cf5df7571cef6ddeeb66bd6f5735d5d6bdd5ed35d1e6b96f9d5de396f6d5eddfe1e71cefcdf6d9b71de7bd357f469cd3cebd77771be38738eddd5a6fcd1fd3d737f7bf1b69dd1ce7ddf76f87ba7b979c7f671a6b5eb4e9ce34d79ef47777f57dfd7aeb9", + "shares": "0x00c09063ce2dd7b555ca5560e58d2735d7c36c049bcdc2cb778f7ea9c2e351c0907f44039853ea8451d4051f37c7914b95eaaee84a2c92a623a3ba1d1562fa12a627d18eaca481491006f7e37ac31016938ea3df9383bdb1fa6400a02c3560b187a0894311db0f300f01b34e8258b9a222d0cf57aa2b337ee9c8c7aad172db9534b0f5c0e65bd7076e8bea6f4001373e420cb94ce9e8d98e26c778264e7f06b3dd67457ff39f414922336544ba11ad289f11195d600bc77526c8bab07ec56a0d4ab6e1dd3ddb6eda7b96fcf79f3bd36db77fc6f6d75ddb69ddbad7c73c6ba6f6d1a7fa79fe9bd3969c739f1bdb56fceb6ddad1de9ad75d77e9bebad78e35d9fe7b7f9ef8d3ce5e6dc6db73a77871d6b8777f5cf3af76e757fdf1d79eefcd1edfd7faddf6b6e7bdfa71bdbb79af76e1b7bb75aef8e1ad78df8f35d36e1a6bd6f86b6f79df66dde3af1bd79d5eeb5776d3d7377fd7b76b96b769ff5a77969ff386b673a71adbd6f7d79ebbefa75fd35f5dd5aedf6bae1a7fb79bf377b7e3c6f6f1feb96b5774ddbd7a739efcd3bdde7fd6f77fd6b46ddd1f7f573a77771c7b7dfbe9de9b6baeb869edf7eb86df71eeb975f7376dfdbcd5f6fd6b5ddae9bf39f7875aeb87fd6fc69def87b6e7c6f7e1a7fcefddb4f37f5c7bbf1addee9cd3973573d737eddebdedcd35efad7bedbe38e9c6bbe5de3aedcf75df97b7d9dd9a7b9e7df7b69d71d75d79f6b87757bbd9bf7c75e6ba7bde9a69bf7adf9d9ce9d77c738e7ad36778dfa6da6b7d9f7bd69e7fdd1ad36ddf7fcf5e71b7f67bb73a75ed35f75d3df7dd1a7faf37e77e1eefd6fbe3773b7fbe35db769a79de5dddf79b69bf5d71d7bbdbce1c7f6db6e5d71fd3ad37e7bdbcdbb6f87fdf1de3d7b5775d77d3a6ddedcd37ef9ef4dbbe3ae786da7f87df73969bf5cd777f4f3de5c737f37e797ddf78d38777edae9f75df376f96dd7797ded7ce1e6f8d347fb7fa69c7dbdbae3de37d3dd34ef87b97f7db7736d387fc7f7e9fdfc777e9bd796b9d1ae9eef679ddbc7b7e76f75f1b7b66f8e9f7396b6dda6ddd3aefd735d5c69dd34e9edb9d9be7a7fce3bedd7f7f7a69edbc6fbebae74f1f774f1c7796f87b5d9cf5f6f4d3673d779739db47f46b97f9e7873beb46bbf5def8e5fe9f735d3a6ba69fdde71ddf4ebcd5af74d5e75be39d1ce38d3ce5e6dcef8db8d39f35f1ed7bd74eb7e9adfddbbf1ad1c6fce5df35ef8d3bf36d1deb96fb7bbd1ef1d77adf77dce9f7357f8edaebaf78d9ee77f38734eb8efb71f774d38efdd5ee3b7f4f1cf3d69bedbe3b7f8e37d78f5ff1af7bd9f79ad5cf7cd74d39e1e779d1befa7b9ebde787ddede73b7bae5be1be1af346f8efb6b77777bde9dd766dcd3d7b7e7a75bf5c79ff3bd1e75de1e75ee3ad5cef47b96f96f7f1cefa7fa69bdfa7dde5fe7dd3dedd6f7d9b75a73ce74e36dfbe9a7b979a77d73bd1cd5cedde74d7675de1cd7b7dcd1fe5fe79d5d6fd6b4efc6b7e75d39ef7e5deb4e1f71f73a6dadddd3bf1d7bbf7cf1de776fb7f779ee1c736f3c6da73be1cefdd3adb8d1ef5ee5be36e9ed3c7f9d1fef5eb4d3cdf6d5ceb7d1be3cdddd9b79c6fb736d7b7f673a77ad7cdb8776dfd75ff3ad9c69a6ba7dbe5eeb6dfa6db69feb76f6f5cf5ee9c7bbdbcd36f397b4f39f1e73a736df9d78d1c69d7b8d7ad1eebddf4d3cd1eedb77773d735e38e3573b7b6e75d3cebc774f1bf1eefd6db7f56fc6f7f786f879b6b67dfeb4d5af79f39ef8db673c7dfef7e9e7b66bbd3ddfdd38ef5e3adf57357387bae35df46f6d5c7df75fddadf9d9edb87bce7b79cdf77bc7dcdb669de386dedbb7b5d5ee5ce777f571a6fce7cf3d7dae74dbdeb4d77df9db4d3ceda73af3d6f671bd36d3adbbe5b6def1f69f73d7376bde3a7f7f3c7b977879ceb4df9d7df35ef5f1adfdf787dc7f7e396b9e3479def96f57bc6fd79a737efbeded76df9eda776f7b7dd69cdf5f36ef56b5d9b6f5d1bd77d75e7ce7aeb5df5dfadfb6b6dfcedfd5ed767baef5eb9edfe5fdfbdb9f1a77579d7dcdf6f7ceb5e3ceb7db9f78f5dd797b6f7a79a79febcf37737d1b734eb8f3977cdb5d5c7b775b7fce7deb56f67346b9d5e6b4d39ebaf34eb9d74ddee5b71ceda7397b4d5ee74e1ed7c79edbcdde7bcf38f39e7c71af7de34f7bddae9bef5d5a7f6d1debcdbb71b6deefae1e7df79a71de5b79fe74d5d7df75af5d6bbe75f1ce3ae1de37e7be3d71d7da737d5f7ddf79d1fe37776f79d5bedf79cf5ae37d36db8ef975cf79e1c77b6b9f5ddba737eb479fdf8e3ce75f74edf75bd7b79feb5efc77ae3cf7cd78d9df1c6f575f6fd6b4ddcf797dd71d77af3bebdf7d69af1bf37e1cef87df7b7df471feb87fd6fad36f7673def8d5d71ef3c79ad1de366f4f38f5f7dad35ef4d5befbf1a71de7cd1f7f6d3ddb771be1ce5f7b9f1f73b", "cluster": { "validatorCount": 0, "networkFeeIndex": 0, "index": 0, "balance": 0, - "active": false + "active": true }, - "signature": "0x8c93d278bc2b1f9957171a28c0bdacdf0bec1519388d7ada76e7a5e80c3ebe73a3a57a3706e2cbc97440090c2b0971e2070e6eb2e1448cc425d2bea148b64aa2933d910f9140ef0f548cec419f4c9cd4fe135fdd4deb25fed14c0f93aa2f57dd", + "signature": "0xab0160e83c3d90ece97764030663b595fee1b1128a113f89268a631745c336042f30a7d2eeaa807e968fc2e863d55be80d9c080c503896b7126ef4a2a875f7a210b79339e3072d256b1cf357de593cdd09a7a5cc8c49d64a83bbcd9a87d5be02", "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" }, - "1684357915429": { - "depositDataRoot": "0x18dc4906fcd6bf3e58e1b94acb39115335b695a8aadaa753093af14442dd141c", - "publicKey": "0x96be7df0a97ca5866509ef8d87110306398de6f079ed7adc1038db864ec6244834b80ddbc7844e60a963f5e9c2c0ff34", + "1684510685568": { + "depositDataRoot": "0x1cc49d12998c588270c0a4bb4310be0434c1591b97091e4aa202c581fe323541", + "publicKey": "0x88daef1daa709b61f5ad138625ffca5b749c679b35314712eb4d6d78cf95be26be64a9af1d5de8528ba062929da135c5", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c0a51c9bebcf36d02505faacdc6cbdbbd877bc7f09827d867f0623303333057351b21beb8d865b2820128ce732c2cd456999d001a1c1c5675992ba5d89e31061a846d1a69e9c996ff730f1a24b8549b87815e8c4e88e7a45011e6110a9eebae2ccad34550d9d2d2cd79eba4765339bc120c7af37dda3fb4483a96f945f4c458534dbab1cd81c11947b610c4e7e56ef9226b38558ad495c8fa9116bfb17e160d38898c9deac635f104dce2c3f5c49b75f379e8054e4374dc1452b18836b643a7acceded9f6db69bdba75bdf773bd356da6bcd7c77a6bc6f6f3bedef3a6b66b6e75ef8df7d74f39ebb73c69dd9c774d38f7c6de75ed5ed3777cdf775f73b69ddb6dbdedbe5b6b8d387dbf5dd74f39d3a6df7bb73de3dededdbf5b6dbd5b7bd79fe1e71ce5e79ef1af1df1cf1a7dc7f4f7bf5dd3ae5edfbe1fe75eb7e36e5b7b6f1eedf71bdba6f77dff3a71b73dd37ef5eddf74ddcd5cdf9e5dd1ed5fdb56bdddc7bc79cf39f7cf3d71ae9cf1ceb7d3d7df7de71fd7971d75ee9f6faf38d78e756bd734f7cf7571e7b57bbf7975f7b9eb871d7ddd9f69cdb4eba77cf74d3deb9d77f7d71ddb5d7ae7cefcd9d7f9f5fef4d7673b75be3a7dae9ee3bef6d9d6b6efde7bf35ddfd77f1f6b677ddf8e5ce9bdbcf1fe37e79736ddd6bbef6f77f7973dd1a79aef7d7cdb66f8e1cd787bce5b6dcd5b779d74d74df6ebaeb4eddedadf579de797f7ef97dd7bb7dbd3c6bd6dbef6df773b7dd6dcebdf3c71a6fb6dce35d78e5cf1e7dfd78f3ae9dddee7b7dadf673477cdf76bb6fc71b7dadf4d78df4ef67db6bae7ce1be75e5a6b7f5b79e734737d5ed3df1cf3977d7f97f66fdef9d3bdfce9ef1b7dbdfb79a7baeb4e5f7f969a736e7675be1bddd6f7efa735f5ae9a77c779ebc7b87367fae39db4f7bd9cf7b7b8e5cd5d71f6fc75a69c7dcd35f3775edf6d7d6f5dfb7db75d6fc7b6efc75dd3b7dd6fde9fe5adf9f386fa7bb6b77b9e78f7869ddbbf7befb735e796fce797bb69ed7cf5ae9cedadfdf3bdf4f37e39ef4df7f7be5deda79ee7777875df5cd79eb873c71d6b7ede6f6d78f3cf1d7f479ef1edbc7f96f669aeb9f5edb475fdf87bbd747db6b5d79e3ad1ed38eb671cf36eb669f6b5f3be35d777f77746f9df8ef9ef7f3a77ae1ce34eb475bd1ed1c6fde7ceb46b76f7f1cd5ee79dbdddb69fd777767b469ee5ee9fe5bedbeb7776efb75bd1beba6dd71dd386b97f66b5d1b69b6b975f71c6bc6b97797bbdbb69f69b77aeddf7b71ce7b7397dcd9d73bedd69ff7dd9fe1ce5eedf6f56dad1edf96b6f38d7dd7869fe5ef3bf1d6b7d1c77c7f473cf7ce5e71ed38e3beb47b7db47bbf76ededb9f75d9a73deb6e9df7473973ad7473b77af7ae1be5d7de71eedd77af376bce7a75b7f7ddd7777b8f3c6faeb8db5db871af5fd3c7f7df46fbe7c77de7a79f7bad78d1f7dedb9ef9ede7fcd7bf1aedc7dfe5f7f4d74d74db86f5d786b7f35d397b879fd1c79d7dadfbd5f7dad38e9a7b4dfc7fde3bd5de9b775db8db877be7a6dee3deb9e5d71af76d9e79ee1edbc69df3cd7ddb8f79d7979bf767faf7bebad9e79dd7de1c777e5f6f7ddd71d7ddf5fd7ae9e7b76dee5ff1dd5d6ded3adb46f4eb4db7d3bd1a75d6f8e35e36e9a6b7db56bd71c69b79ed5ff767fcd5e7f8e5cdde77af7675e69c79b739e7deb4e3ae75e9d6dcf7c69c6def1ed9de1aef8d3adb7d9eeb77ded9de36db4ebdef475ff79e5a7fceba71d75ef1cf79edc7dae787dbddfdb5e34e5fd7869b6bbe7cddfdb86f8e35eddd78d9b6b569c7ba71b7f6dbbdf47dbe5fd36e3a73a7b97f5d3b7fde9ee9dd9dd5aef4db8f38e3af7df1adf47797db6f8d5a7fbd9ef7d6baf3d6de7f5e1ad76d346f8777e7bd9ae5a6b971be7ad776db7fcd7573dd5cdb96de77a7bb7fd77dedee3df5d75ad7c75cef7e397def5c7fd7bc7fc69a73671ee346b9d9f75e69fd9b6df6db7b8ebdf1bf7d77477b7f4e3ae7dddadf4efa7deeddf5cd5bd5bd3b6b6e39edde9d73de78e1ee34f79edb6f4e36d1d6b579dd1d6da7396f6edc75def5ef47bae5adb5f3479ddf9f75f3c71b7fd75c7f47b7d3cef5f3bdbae5f6da6b9f5fefcf1b79d6daef7d5de5cefd71fe1edbbd34f3df5bd9fd366dd7dee37df9df6f34738f5fd9fe3debdedee5ff5ed76d35d1edfde3ad9bf1af5dd7be39e1f6f4777e1ff1edbd6f9ebcf3c75bd7bd38d75d5b6f9e7bf79e5c69f7b67bde9e75b7fb75b7fc7bde1a6f4f79e36eb7e7869fdf8f7be5fdfdd387f6f5b77a6fc6dd71f77adbd75c7dfddbdbdd1bd79df47b77b9d5fefce757deeb8d357b9e5df35e1b71edf6d1d6bcddf77573a779d3a7b7f1dd5b6fad5beba77b7f5df5e7dd3471bd347dc6b97dc79dd1de7ce39e7c7fc6f5e78dbbeb8d5edb669dd5bd3de3bd3ae78df975e6bdf7873ae35e5ff7b71bdbd", + "shares": "0x00c0a79e38b0bdf57fd776177d08538ba5715e1c826906f776d38b5cc7f7e6b78d0bed1a385fe363ddbd5c870b2f914e63129325005d22886ad587f4f93a07fc2ebc93a72f77e622dfd3da824888db216cb68e1020f1569412201b6b4c5988c0db1fafa9a2eaf581380d7b421caf963995de8514335ce6cc265f90994d557baafb7a7cf1458bacdfd8d18b4248e4e93a2f1aaab3168118add9472ff8da3020c7415a04f8564104d4f68f96ffcbdbceadfa5e31b44f73325828fa308b7b7c613be7bedf7d35ef5df4f5bd757396f9f3a77adb471a7bcf1af3b6dceba7de6f7e7bd76e1fd3c6bde797fd79ad5ad74e5ce7d73c6b76dadfaebce3671be77d35d78d36ef8e1c7dcf1ff3b6f4e5c73ce76f1ce9c7b969f7397bcd34d9bef76f4d7c7b7ef471c71fdbce1fdf977adf4f5eedc735739777e3bef5ddfdfce5aedb7b5d7a7757dcf5ad5cef97dee7adbbf7cdfad7a7b47b479bf1ee5def9f5b77af1ae38d75d9b736778e3ce9af35eba7b975f6b9776e7d6dd6bdd79e76f7669ee9f775d78777df9d7ae5e71e79ce5fe5ddfc69de347dfe5f69d6fcefbf796dc73473c7def77f5f6fc73471bdb87b97fc777e9f71af37db87f6e5de79d1ee3c7b5efc736d9f75de5d79cf38db8f7d7b46daebde77d1ef356fae9ee9a6bae7b77cd7de357bc73b71fef4f1dd9ed7469be79e5e6b96fae3577573dedae376b7e5bef9d9cf7471ed5ef1bef579adbddf677bebbebd6dbd5fd38d7b75c7fc6fb7bae3bdb6f74ef7d5b6fc69ad5b7fdf7be5fdf9734e79ddae1fe5fd7deb5dbaf7779f7dedda6f779ee9fdf6f36dfbe9cf3771adf9736738f39e387f7e1ff1bd9ef35d7cf77e7c7faf1edbbf35e7b6b5d9f69e735d1fe5ef1f6b7d36f1e7dfd7adbcf5fdb8777d5d6f66bdd366bcd9ed5dd1ff1de77d5e7bdd5f73cd5d7ba7dbef9f5e79f7de6b7e3de78f3be1df34df7e7a6f4e1ee5e6dd7dc69a7b87b56b6d7677c7f475bdbb6f9db4d7ad9adb97bbf5ae3471d6bdf78e1cf34dba7b67796ba77bd7af7ae9ae5cdb569ee1b6f6e377387fb6fce5ff357f8e5d6b66fd69c69f7756f6efcf3df79dbb735e3cdf47dae5aeb9f5a736d1af1d7dadb8e797ddf797b8ef671ee347b7e1defc75ee9f79b69deb5e5ed5bd74f3bd5a71ee5ef3adfcdfbf37e3af78f1debc69ce5fdb775ddfdf5a6bd7b779fe34f7dd7ce35e1cf5e775f7bebbedc73d7f771bd9c7f579b6b8f766f5e7cf36d1af74e347376f669c7dff1c7ddedce34e75dfcebb69eefc7fadbbe36eb67b6dbcf7675c7f6ef8e377b977469a7f6d9c6f975de75d1e6b7d1df5f71df36edf6bcf376b4edd79bd78e77e36e9f69a75ee9f7f4ddde3be5edb8e747bc7f5ef9efc69f7fdd7d75a75bf1edfde3df1ad7b69ce5eef8e756bdebc779734ef8f7cd5ae1a6f575ae76e3a77d7fcedc6bdedd7f475ce5bef9d7cd1bddae777dfe757dadfbf3b6fdd9ee1a7f8d76d3ad75efd75bd5bedfdf6ef8edaebcf36d376f8d5fddb6bd7bdf3b7dcebcdfa77b6bcddd79ef76f376fbd3879df1ad37ebbd34e3cf74e5be75f3bd9ae76e9bdbc7dbe7a75fd5cef8e9c75bd9a69a7dbe9d6bdd356fcd9e7b969cf3de38db7d7d79cedde3ce1b69e69ed37e9e776e76db469ae3ce5ce35d5e6fadb4ef6739df4d34f75f5f7bd75d6dae9ef3adbbf1d7ba75e75cdbcd1a7b8e1bd3a69e776e7c7f5f5cd356f9f396dde79d79e1ed3d79f77de5beb8d1df7b6da7bbd5f79def969d6b76bdd3479c6da7dc77af35d9e7f67bb6b7dfbf756f9f5a6b8f3dd3971b6bce5ad367f66da69e79d79ef1cd9ae797bad5fe3d7df7b6f5c71dd75e5bef9efa79f7db735eb96f9dbae1f75cd756f7e34d5cef4f3cf5d6dd69de9bf1cd78e5f77ce7d69d6deef977669dd5a6f96da7f97dde1cf3de5fe3b73dd36f5e71ae34d1ff5ae37ef6e9e6f8e1deddedd7fddb5eb8d9adb873d75cedef3df7adbcd5f6de7dadf7d9f6dcefaefdd9e6dd7da7b6e1a6f575c73879cd34eb971beb5e34d1c77af1f738ef7e7df3c7b4e9e6bbd9be76f7475adb8d9cf1af79d77f1eedf6fde3bd5cf5ee5fd7af74f7dd5e6f77f47dc69cd37eb7e3571aedee5b7b575fe5a75fef6dbdd36777d3775d79de37d1be9e79de1e71f75d7f57f9d9a6dd71e69cf1d75de35e74f1be7cd7575c69bf5aedcd9b77ae367b86f87f47bce37eb5df7e38eb4734ef479d6f77dd75a75fe76e1bef7d3a7756f8d1ddf471ae1df3469de5cd3a6fdf3cf75f1bd9a734735e7975de3cd79efbebce9beb86db7b7eb57b57f96f9f1bd3475d7f7e7a7b57dbedeef5df87f9ef96dfdba71df3d7fdd1e6fd75c7bcf79778db86bae3b7fddba75aeb771bd5feb575fe367fcd7b69fdf6ef77b877b6deef6d1aedbd5ad3bd5ee746f96bae39ddef75e9d739e1ee9f75ee9f6fc6dfe5def7e35f74f3b6b56bdf77db5", "cluster": { "validatorCount": 0, "networkFeeIndex": 0, "index": 0, "balance": 0, - "active": false + "active": true }, - "signature": "0x91f45b18ad23067c19ff619303b9c134e99b4aa638747d667536376897309241ef2a9b7f888f4c3afabbd19189e9aa7c082e7f6a9cd5c3771723f27eabe621e7941e1bde80efce61ad19ff995be062b916a59e0742f66fd0551b6fa68548b8dc", - "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" - }, - "1684358027067": { - "depositDataRoot": "0x8bee5c8e42f4300579a9ea807d127957d49e944147f3030f46b5767dcd3875a0", - "publicKey": "0xa1f382a1f9b4ff7e8d89b545bf6ede6452f6408dde63607d11cc65bff1e00590b8a07c02835e425cf355a4eb35e2016f", - "operatorIds": [ - 1, - 2, - 3, - 4 - ], - "shares": "0x00c0856f3c80d6f7419eefd43834802aea0d401932aa47fdc41325167809f2505fb2df74ac2fee166515cb8624e3ac3cfe0e90a0da3b474ff32daaeaadaafd313eb2731e49c3ad8bea4c50f66bc07d0997c974a25be950fe38c448b87d870c334fa68567d73f13dbcd04ce00c98a0076b81a4ab70c8558d6fc11a95981b5cfa745811538a0ef47cc50135477d43984da12bf908384d45e013f67776a423845b3e540406aaec25fb515a2ef51abc9a532b5f4e125381ec74d169061594a54b7e2730be1ceddd9bddfeb76fad396f7f7a775e5dd9bd5aeb4e78f37dda77ddb5739ebcefb71e71cd9eebbd1a7b4e747b4df66f4ef775fe7c7f4f34e5d77879df5a71dd1cd74eb8e76ef6e1f7df77c6f66df77475adbd7b8ef9d75e5fe5de36ef66deefb79ceddd9ee3be1befb775e5ff5af75d3b6b56b8f3adfd6f4f3c7bcd5dd76eb5d5ce3d7ddf3cefd6dd7376df6f66b9ebbe38e5fddae7de7675f7747f7edb71f734ddd69c6bbe7beb66ddddfdda7396b8d5de79df9dfcd3a69ad38ef4df5f1b7dedbcd7d6dcdfbf767b4dfcebd6db79aedf738d9d7f5d77f3be3a75c6b7f1ce7877dd7b69ae9cf38d7af5edbbefdf3cd5fdfceb8d1c735f1f79febcd76db8f74edd69cf7ae75d9f7df7b87fcf36e77d39734f1c6bae1cd3ceb671d734d39df8d74d7bf5bddfdf475be7dd3bd5d75aefc6dde1aef977d75c7b7db5777d1aeb77f771fddcf1d7f7e5a77ad5e7787b9f39eb8ef6f3de9edde79a7bb6db77d6b7f75eb975fe5d6faf36edd7dadbd734f37e9eddb6b779f75bd7dd9de7d6ded3ae7bebcddaf78e9af1adbddba7fcef6e1d739eb4775ef577773b734e5fef46baf7ce1eedde7dd5a73ad9cf79db97dcf1adfaddd73d6db73a7bd6f57b575ae7bdfa7b8e7bdbdd5e79ce9beb6e7ddf6e3bf3971d7b7f39774d3bedaef5db4d3977bf39d1de367f6f74db4dbb6ded38d34e9e6fad9a738e7dd5e69b7ded9c7b76f577d75bf74e36d776f5d5cf7aef5d346f87bd6fbe7cf7bdf669ee5ddfd6f76dedf76f7ebad3ae9b79f6b8f747b5e7bf5bd1c77d7f9ef7f1ddddef7d1e75cf7ad7679ff3aebd71e71ad3d6fb75ee77d5a7f679d75ed7cf75d78737739d9fe5b77a7dee77f77e9cef679be9adba71af78f356dfd9a75fdb57dbd7ae5feb5f397767f87f7d7a6f8f3a7f571ddf577df1d73973bdba77b7bde3cf3ae797de7fa7f5d9fe1be9f6fc75d69e7b7d5be9bdf6db5ebcd7bd1d6bdd1de7a73ce5f75eef675dd7b7b67f5d38ef8df8d1df786de774ddc775e7cf37eb66f475af76e34f34e3cdb9ebdd7dd5bdbae1e739dbb7fcdbc6dfd387fb77cdbb6b67786bcf1ed1f778739ef5d75ddf7377bceb4e1e6fad5e75af76e38ebbf7773979fdfcddbe1cf79f7869f7ded1fdb7e5fe5fd9bddbeda739df57b4e9d6f4e9c77477be79dde6b9e9dd5adf46f7efd73c7f47bb73beb77de7b5d5ed37f386dee9c75cd9df78778ef7735ddfdb8f78d1f7ba7fbe5ff5bd5ce37e39d9ee1ae1e6fae3b7dc774df871ddf7efdd39e78ef7dde6b6df8df673be76ef6f1f7756fc75d6dfe7473b71ad397f4e9cdfa79d6fbdf7ddee38f3ae9d7da69d71bdb7e367dfdfb6bbe75f797fadfddb569f71cdb96f76b479cd9ee5c79d7ba7f4ebb75cd9fe1d7fcf1ae7bd36f5df7df1b776d77734e1e6ba6bcf3be9fdf5f37e1d7bde1e6bae75d9af7979ce34ef5df6f5ddb9f38eb7f5d7deedad1bdbc71d7dff36dbdf5eebc735e38ddd75bd1bdf7d38eb6d7b7f4dda6f56fbd346b6f1fedb7b5d7ce7ad3473dd1fd3c71fd5bddff3b7da6f4e5cdb4dba6f9db6db67f9ddce9a69cdb6eda71cf38e3ae3ae3cd9e6f8dda75cd746f5d1d73c77cebcf37f7bf39f36e346f6f756bae7ae1be38e75e5ad5def4f39d9dd9a774d34df4d1cdbdeb5ef975bef8ef8edad1fe3bef4f3ad7d73dd9d7f6f7bf7dd75efae9ce1f73b7b5d36e9bddfe9c6df77b6bdd7bd3bf3bef8e36f1feb7d1e776d9cf1febd79c73df376bce5bd787b66b873c6f779c75dd7ce776fddba7b4d3b6f5e3a77b6f7e34efde5a6b5eb871d6f469dd7def9ddf6b869fe75f78f7d69dd34f75d5e69cdb86bad1e7fb6b66bcf1c7fb77ae3c6b7f7de5a6b8f34eb769a7b8edc6dc7fae1c7b6f5b6b8d757b8f7de7ae3b69e7fbd9bdb6f77d3ad38dbbef5e5ce3adbcede778d1cd1addef1e7f8738d9bd3dd9b736ededf4f7cd74f75df5779e3be9be9dddae37d3bd9c774f7aeb971fe1a6fce5ee37f5d77dd9fedd7df7396dde1b6fc7bcedeede6df7dee76e9feb97dff78d1bedaf7c69b7fbd79e9cd79f5bd5bd3dddef36e5ed9f6de7b6d1b7f7735db6d7bdf6f1cef5d9ce5dddfd7ce5ae7de347ba6bdebcdbdd5ae1cdf5d7cebbf3bd79e9dd77eb6e5be1ee1e7b56dbe7d6bce5a79d6da69e7deef86b66b6e39e7b79eddd71d79ceb87bc", - "cluster": { - "validatorCount": 0, - "networkFeeIndex": 0, - "index": 0, - "balance": 0, - "active": false - }, - "signature": "0xb1c168f4772b9a07746dc2f348e8e667b385f588693b7c5f1eb1c6a4b9995a0a5ef986b6ca8f18a775539e9eed3667ab179cf1d9014984a098f83a11af9c7bf6a165a0df1411493eebd73101426717917be1add753cad47e998d3414dd93627a", - "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" - }, - "1684358234792": { - "depositDataRoot": "0x4b5e8d666cdf848732102ef685bc36c76b9d737ec1dda83ff14be7f45e854526", - "publicKey": "0x840cc5ef78bcf3d7ab29d348d2f85320bc79e2e4aed622b0594aff8658af1dbe1f606da52684ad07f6ed83b2e8faac17", - "operatorIds": [ - 1, - 2, - 3, - 4 - ], - "shares": "0x00c0b6adeee8452ff4d0f791b8d62c9d4b24fb8524a92a14fe61ba6fa25cdcb5aac2d3a001090bf5a565d4e9378f45d00327a51e45082e703cc0d706eb8920a48aa8cacfe32e8ed49758aec0cb8d7a99b5eb5cdff1ac799248fb651cb1f509ce0bd98e5cb8fd3c0081b586ae61fd6498281d12d7d99dd1646de704efa406547236db606f8b7855f671b4ae972353028666a88ae95ff58a2bc9155c893ff1ab9ea4ca4222922bfb52e2e28fd127a59e29b51a951b2a16632c4073b22c69c40f5ad56ce1dd756dd71d77de77eb9d9df1cd34e5ddfbd9cef4e1de1f7357b9f7cedcf1beb7edddf8e3beb7f1b73a71de7cd3cdf7e7d6f8f39f1e6bb6b869deb9f1df36d9ef5fd35f3d73ddf66fa77bf1b7377bd7baedce1f7b47dcd1adf4d7b7bbd38d77d7d6f86fbf3de7c6bc71fd1eeb9d1ae5f69c6b57bbf7cd78f3bd5dd5de7de5d73d69c7b4f5a6b775ae75d5cd746fbedf79b7767f7e7d6fb71edf971d6fbf1ce5ae3c7fdf75d7de35df87fcdf771c73a7f5d79edcf1cf3def4ef6e5ad1df37f7cdb9f1ee5b7786da7f873dd7a75d7df6bbd5d7bd6dbef6eb6d3a77be1ed7cd5df7ce1dedad1bf3df75f34f7b7f7efbf366fad9deb86df6fae34eb977b7b9f1ae9e73573be3de9aeb9e796f8d747fd7367fcf7c79a73a7dfd79ddc71be1bdb6ebaddcdf7e3cd9febdddb7bb6bb734d1fd5bd1ed366b875c75cd5cebc6f4d36e76e9fe5ceb4dfce76e7a6bae78db8f5e7ddf39efaf1cd9edb97f5738d3a7bad7b778e786bad5ad3c7bb6dfd9fefaf38e9ff5c73addf776dbd71ae1ff7c7f4e5debdf5a6f46bde9d6b7739d3cd9be77e7475cebddf4e5ad38ef4e5ae1a71deddf36df9eb7736ddeeb5f7ad1d7b46bcddef5f7bae5ad34d5ef5e6f4d5af34d7b7b8efdf1ddf473bef5779d9dede75ce9cddfd38dddf5cd1df7af3dedbf1b775778f36df7e3beb7d9aeb7d78edde7bd3a69f774dfa71cf3969f7f6d7aedae3b79fdb5edbdfae9febde7c69ce3aebdd347bc7dbd78d9f778df47b9df97796fad766dff78ddee1f6da69ae7ddbbd9dede71fe34edfe34e1ed1ad76dfd734edfd3ceb6d1bf75e78db7d9cd74dded3ad1e7fb7dde9edf87367da69eddc775f3ae34779d1d75fef5eb6d79f5ce35d34d5adb777bf7adfae387dcdba7f8e9b6fbeddedcf3bd1ae35d1ddbde5a7dfdbcdfbf35efbebcf3b7b675ff3b69fdb67fdf767f4d79efddddf76f3ae7c774e7ad356deedadb873bdfbeb475c7b6d5de75d75e9c7bae5ae1f6f77dcef4dba7b9d9eedcf5fd3573a69ae786f66fb7fa71dd7dd3dd7ddddd79e77d9a7b779bd35db67bbe3c71bef4f5dd3673be1c774e37e1be9cd746b8f5ee1bd5ff77f7cd756f8ef66f67367b8eb9e9d6b76f56dbe7bf356b9ef6e1c75af3b75c6f77fd75d7f8ddfef9d5a7387b4dfa7dc6fcdb9f7d69dd1a7b8d5b71defddbd7daedd6fd75f7fad9fe1e6fb71bd7cd5fd1a778df67dee7cf1c739d3cdfb69aeb4d5aebaeb6d37d1b6f56f6f5d69bdda6b8dbdd74f1f7ddf1de38e3ce7dd1eeddef7e777b6ddef347b8d767bce5d6f4dda6b569af3cf7cef5f1a75fedbe3cef4eb7e76e5f7f671dd3b6da7faf5f73dd1b7bc7ba6de7db7df7bc7367dedb67bad3d77969cdbcd3df77f74e367bc779f7debbef96f7d7de36dfa7dbdf56f9d9f7b6df4f757dee1debdeb7df575e7f6e3979fd5ed3a7f67f56fa7f7e1e75ddfbf1df37eb6e387f5e5bf1aef8f5a79fe9ceb9d9debb79df5addde1fe397bcd7cf5cedae5dd1dd5c6fc6ded7df1c77d69fd9cd1cebcd3bf1cf35d9ddf96bcdb579e6de79dd7bd747fcd35e3779ddf97fbe5be767b87fae5a79cf74d9a6db7bdeb5d5fdf671a69bd9fd76f78e9aefdef5f5ef78d3d6faf3c69c7da7dcd9a7dfd7a71b6dd7b9d5a7347fb7f66f6ddfddae75f36e37d75e5e6dddb6eb8e1cd5ee77e9fe7cf747f57796f86ddd74f1b71c6bb737d36ddaeb67fde79f74f5e6b6e9d7357b8ebad37f776f879bd1ce7475def875c71adb4f3a77a75a6f86faf7ceb871e6dbd38db8edbe34e5c6bd71a77ad39e3d75dddc6b6f1a7fad74e79eb4e5ddfa7bb6b6db9eb6f3bf5e6fbd5bddee77f7a75df3af5b69be75d3cd1befbdfd77b7b8d79779d1d6dce366da777d36d77ebcd5b7f8f74df57f66dbe366ddedfdbce3a777db579f71c7fddfae7a738e9b73d6ddddd75d69de3ae7479af3873b7b7f7adbae37edcf36ef8e1ff1a75f6bdf5debb6fdd9de756bc7f9edfe396fd7ddd1a6bb6b6e1bebbe7d7f469deb4e36f5cdb4f79ddc6f87f56b4eb4e1a7da77877479fd34e5bd34ef979b75fddeefc75ce9e71ff3b79aefcefad747b77f6e787f5d9a69e739dbae1d777d5befb6b6d7beb6d1ee1b73bdf7db4e1dd35d7a7faf75f5dddcf5ff5e6f57de69e77ae3c7bcedfddde7a6f5f34f38e7bd1df77efcdfaedadbc", - "cluster": { - "validatorCount": 0, - "networkFeeIndex": 0, - "index": 0, - "balance": 0, - "active": false - }, - "signature": "0x933b60910e53c116acff229ec961d9adca85a5dd7a51fe685091dab7e19ca3cadbf8e957cf8f20cbb63200444f73966602bd017c0892002b7edd15534fbf65fa5fa45a3c6998b62fa6e32fe14752b0b2789d6870e20b61da30b8e96f5ad8d4ac", + "signature": "0xad3cd22e20a0e4d6a12afcaa176fc238ee3105d1a056945363d386d749f535b633349a2d2d0709bf74c39fb14ed33f26147f8e583a53974648b64154a96e9ea6bbbaaa855f1a6b3d19f1a8c17d8be989390ccfd897fb84679349f14609026a41", "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" } } \ No newline at end of file diff --git a/common/ssv/.gitignore b/common/ssv/.gitignore new file mode 100644 index 000000000..04c01ba7b --- /dev/null +++ b/common/ssv/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ \ No newline at end of file diff --git a/common/ssv/package.json b/common/ssv/package.json new file mode 100644 index 000000000..3abdf84fe --- /dev/null +++ b/common/ssv/package.json @@ -0,0 +1,16 @@ +{ + "name": "@casimir/ssv", + "private": "true", + "main": "src/index.ts", + "scripts": { + "build": "esbuild src/index.ts --bundle --minify --sourcemap --platform=node --target=esnext --outfile=dist/index.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "ethers": "^5.7.2" + }, + "devDependencies": { + "@types/node": "^17.0.38", + "esbuild": "^0.15.9" + } +} diff --git a/common/ssv/src/index.ts b/common/ssv/src/index.ts new file mode 100644 index 000000000..8839c7234 --- /dev/null +++ b/common/ssv/src/index.ts @@ -0,0 +1,3 @@ +import { getCluster } from './providers/clusters' + +export { getCluster } \ No newline at end of file diff --git a/services/dkg/src/interfaces/ClusterInput.ts b/common/ssv/src/interfaces/ClusterInput.ts similarity index 54% rename from services/dkg/src/interfaces/ClusterInput.ts rename to common/ssv/src/interfaces/ClusterInput.ts index 41824ac86..7f9cbb788 100644 --- a/services/dkg/src/interfaces/ClusterInput.ts +++ b/common/ssv/src/interfaces/ClusterInput.ts @@ -1,13 +1,12 @@ -import { ISSVNetwork } from '@casimir/ethereum/build/artifacts/types' import { ethers } from 'ethers' export interface ClusterInput { - /** SSV network contract */ - ssv: ISSVNetwork & ethers.Contract + /** SSV network address */ + networkAddress: string /** Operator IDs */ operatorIds: number[] /** JSON RPC node provider */ - provider: ethers.JsonRpcProvider + provider: ethers.providers.JsonRpcProvider /** Withdrawal address */ withdrawalAddress: string } \ No newline at end of file diff --git a/common/ssv/src/providers/clusters.ts b/common/ssv/src/providers/clusters.ts new file mode 100644 index 000000000..689bdbc94 --- /dev/null +++ b/common/ssv/src/providers/clusters.ts @@ -0,0 +1,95 @@ +import { ethers } from 'ethers' +import { Cluster } from '@casimir/types' +import ISSVNetworkJson from '@casimir/ethereum/build/artifacts/src/vendor/interfaces/ISSVNetwork.sol/ISSVNetwork.json' +import { ClusterInput } from '../interfaces/ClusterInput' + +/** + * Get cluster snapshot + * @param {ClusterInput} input - Operator IDs and withdrawal address + * @returns {Promise} Cluster snapshot + */ +export async function getCluster(input: ClusterInput): Promise { + const { provider, networkAddress, operatorIds, withdrawalAddress } = input + + const ssv = new ethers.Contract(networkAddress, ISSVNetworkJson.abi, provider) + + const DAY = 5400 + const WEEK = DAY * 7 + const MONTH = DAY * 30 + const latestBlockNumber = await provider.getBlockNumber() + let step = MONTH + let cluster: Cluster | undefined + let biggestBlockNumber = 0 + + const eventList = [ + 'ClusterDeposited', + 'ClusterWithdrawn', + 'ValidatorAdded', + 'ValidatorRemoved', + 'ClusterLiquidated', + 'ClusterReactivated' + ] + + // Todo create query filter for events + + let fromBlock = latestBlockNumber - step + let toBlock = latestBlockNumber + + while (!cluster && fromBlock > 0) { + try { + const result = await ssv.queryFilter('*', fromBlock, toBlock) + + for (const item of result) { + const { args, blockNumber, event } = item + + try { + const checkClusterEvent = eventList.map(e => e.split('(')[0]).includes(event as string) + if (!checkClusterEvent) continue + const checkOwner = args?.owner === withdrawalAddress + if (!checkOwner) continue + const checkOperators = JSON.stringify(args?.operatorIds.map((value: string) => Number(value))) === JSON.stringify(operatorIds) + if (!checkOperators) continue + const checkCluster = args?.cluster !== undefined + if (!checkCluster) continue + + if (blockNumber > biggestBlockNumber) { + biggestBlockNumber = blockNumber + const [ + validatorCount, + networkFeeIndex, + index, + balance, + active + ] = args.cluster + cluster = { + validatorCount, + networkFeeIndex, + index, + balance, + active + } + } + } catch (e) { + console.error('ERROR FILTERING CLUSTER EVENTS', e) + } + } + toBlock = fromBlock + } catch (e) { + console.error(e) + if (step === MONTH) { + step = WEEK + } else if (step === WEEK) { + step = DAY + } + } + fromBlock = toBlock - step + } + + return cluster || { + validatorCount: 0, + networkFeeIndex: 0, + index: 0, + balance: 0, + active: true + } +} \ No newline at end of file diff --git a/common/ssv/tsconfig.json b/common/ssv/tsconfig.json new file mode 100644 index 000000000..28ff0291b --- /dev/null +++ b/common/ssv/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "strict": true, + "preserveConstEnums": true, + "noEmit": true, + "sourceMap": false, + "module": "CommonJS", + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + "resolveJsonModule": true + }, + "include": [ + "./src/*" + ] + } \ No newline at end of file diff --git a/common/types/src/interfaces/Cluster.ts b/common/types/src/interfaces/Cluster.ts index 63bddb0c8..cbe10c873 100644 --- a/common/types/src/interfaces/Cluster.ts +++ b/common/types/src/interfaces/Cluster.ts @@ -1,7 +1,9 @@ +import { ethers } from 'ethers' + export interface Cluster { - validatorCount: number - networkFeeIndex: number - index: number - balance: number + validatorCount: number | ethers.BigNumber + networkFeeIndex: number | ethers.BigNumber + index: number | ethers.BigNumber + balance: number | ethers.BigNumber active: boolean } \ No newline at end of file diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index e7853f391..a5200917d 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -71,7 +71,7 @@ SSV fee percentage ### constructor ```solidity -constructor(address beaconDepositAddress, address _dkgOracleAddress, address functionsOracleAddress, uint64 functionsSubscriptionId, address linkTokenAddress, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public +constructor(address beaconDepositAddress, address _dkgOracleAddress, address functionsOracleAddress, uint32 functionsSubscriptionId, address linkTokenAddress, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public ``` Constructor @@ -83,7 +83,7 @@ Constructor | beaconDepositAddress | address | The Beacon deposit address | | _dkgOracleAddress | address | The DKG oracle address | | functionsOracleAddress | address | The Chainlink functions oracle address | -| functionsSubscriptionId | uint64 | The Chainlink functions subscription ID | +| functionsSubscriptionId | uint32 | The Chainlink functions subscription ID | | linkTokenAddress | address | The Chainlink token address | | ssvNetworkAddress | address | The SSV network address | | ssvTokenAddress | address | The SSV token address | @@ -162,7 +162,7 @@ Complete a given count of pending withdrawals ### initiatePoolDeposit ```solidity -function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes shares, bytes signature, bytes withdrawalCredentials, uint256 feeAmount) external +function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, bytes signature, bytes withdrawalCredentials, uint256 feeAmount) external ``` Initiate the next ready pool @@ -173,12 +173,19 @@ Initiate the next ready pool | ---- | ---- | ----------- | | depositDataRoot | bytes32 | The deposit data root | | publicKey | bytes | The validator public key | -| operatorIds | uint32[] | The operator IDs | +| operatorIds | uint64[] | The operator IDs | | shares | bytes | The operator shares | +| cluster | struct ISSVNetworkCore.Cluster | | | signature | bytes | The signature | | withdrawalCredentials | bytes | The withdrawal credentials | | feeAmount | uint256 | The fee amount | +### _getRevertMsg + +```solidity +function _getRevertMsg(bytes _returnData) internal pure returns (string) +``` + ### requestPoolExits ```solidity @@ -225,7 +232,7 @@ Register an operator with the pool manager ### resharePool ```solidity -function resharePool(uint32 poolId, uint32[] operatorIds, bytes shares) external +function resharePool(uint32 poolId, uint64[] operatorIds, bytes shares) external ``` Reshare a given pool's validator @@ -235,7 +242,7 @@ Reshare a given pool's validator | Name | Type | Description | | ---- | ---- | ----------- | | poolId | uint32 | The pool ID | -| operatorIds | uint32[] | The operator IDs | +| operatorIds | uint64[] | The operator IDs | | shares | bytes | The operator shares | ### setFeePercents @@ -813,7 +820,7 @@ struct Pool { uint256 reshareCount; bytes32 depositDataRoot; bytes publicKey; - uint32[] operatorIds; + uint64[] operatorIds; bytes shares; bytes signature; bytes withdrawalCredentials; @@ -949,7 +956,7 @@ function completePendingWithdrawals(uint256 count) external ### initiatePoolDeposit ```solidity -function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, uint32[] operatorIds, bytes shares, bytes signature, bytes withdrawalCredentials, uint256 feeAmount) external +function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, bytes signature, bytes withdrawalCredentials, uint256 feeAmount) external ``` ### requestPoolExits @@ -1505,7 +1512,7 @@ event FeeRecipientAddressUpdated(address owner, address recipientAddress) ### initialize ```solidity -function initialize(string initialVersion_, contract IERC20 token_, uint64 operatorMaxFeeIncrease_, uint64 declareOperatorFeePeriod_, uint64 executeOperatorFeePeriod_, uint64 minimumBlocksBeforeLiquidation_, uint256 minimumLiquidationCollateral_, uint32 validatorsPerOperatorLimit_) external +function initialize(string initialVersion_, contract IERC20 token_, uint64 operatorMaxFeeIncrease_, uint64 declareOperatorFeePeriod_, uint64 executeOperatorFeePeriod_, uint64 minimumBlocksBeforeLiquidation_, uint256 minimumLiquidationCollateral_) external ``` _Initializes the contract._ @@ -1521,7 +1528,6 @@ _Initializes the contract._ | executeOperatorFeePeriod_ | uint64 | The length of the period in which an operator can approve their fee. | | minimumBlocksBeforeLiquidation_ | uint64 | | | minimumLiquidationCollateral_ | uint256 | | -| validatorsPerOperatorLimit_ | uint32 | | ### registerOperator @@ -1591,7 +1597,7 @@ function setFeeRecipientAddress(address feeRecipientAddress) external ### registerValidator ```solidity -function registerValidator(bytes publicKey, uint64[] operatorIds, bytes shares, uint256 amount, struct ISSVNetworkCore.Cluster cluster) external +function registerValidator(bytes publicKey, uint64[] operatorIds, bytes sharesEncrypted, uint256 amount, struct ISSVNetworkCore.Cluster cluster) external ``` ### removeValidator @@ -1678,84 +1684,6 @@ function updateLiquidationThresholdPeriod(uint64 blocks) external function updateMinimumLiquidationCollateral(uint256 amount) external ``` -### validatorPKs - -```solidity -function validatorPKs(bytes32 validatorId) external view returns (address owner, bool active) -``` - -### clusters - -```solidity -function clusters(bytes32 clusterId) external view returns (bytes32 clusterData) -``` - -### operators - -```solidity -function operators(uint64 operatorId) external view returns (address operatorOwner, uint64 fee, uint32 validatorCount, struct ISSVNetworkCore.Snapshot snapshot) -``` - -### operatorFeeChangeRequests - -```solidity -function operatorFeeChangeRequests(uint64 operatorId) external view returns (uint64 fee, uint64 approvalBeginTime, uint64 approvalEndTime) -``` - -### operatorsWhitelist - -```solidity -function operatorsWhitelist(uint64 operatorId) external view returns (address whitelisted) -``` - -### network - -```solidity -function network() external view returns (uint64 networkFee, uint64 networkFeeIndex, uint64 networkFeeIndexBlockNumber) -``` - -### dao - -```solidity -function dao() external view returns (uint32 validatorCount, uint64 balance, uint64 block) -``` - -### minimumBlocksBeforeLiquidation - -```solidity -function minimumBlocksBeforeLiquidation() external view returns (uint64) -``` - -### minimumLiquidationCollateral - -```solidity -function minimumLiquidationCollateral() external view returns (uint64) -``` - -### operatorMaxFeeIncrease - -```solidity -function operatorMaxFeeIncrease() external view returns (uint64) -``` - -### executeOperatorFeePeriod - -```solidity -function executeOperatorFeePeriod() external view returns (uint64) -``` - -### declareOperatorFeePeriod - -```solidity -function declareOperatorFeePeriod() external view returns (uint64) -``` - -### version - -```solidity -function version() external view returns (bytes32) -``` - ## ISSVNetworkCore ### Validator @@ -1805,8 +1733,8 @@ struct Cluster { uint32 validatorCount; uint64 networkFeeIndex; uint64 index; - bool active; uint256 balance; + bool active; } ``` @@ -1854,10 +1782,10 @@ error FeeTooLow() error FeeExceedsIncreaseLimit() ``` -### NoFeeDeclared +### NoFeeDelcared ```solidity -error NoFeeDeclared() +error NoFeeDelcared() ``` ### ApprovalNotWithinTimeframe @@ -1974,24 +1902,6 @@ error SameFeeChangeNotAllowed() error FeeIncreaseNotAllowed() ``` -### NotAuthorized - -```solidity -error NotAuthorized() -``` - -### OperatorsListNotUnique - -```solidity -error OperatorsListNotUnique() -``` - -### OperatorAlreadyExists - -```solidity -error OperatorAlreadyExists() -``` - ## IWETH9 ### deposit @@ -2010,159 +1920,3 @@ function withdraw(uint256) external Withdraw wrapped ether to get ether -## MockFunctionsOracle - -### constructor - -```solidity -constructor() public -``` - -### getRegistry - -```solidity -function getRegistry() external view returns (address) -``` - -Returns the address of the registry contract - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | address | address The address of the registry contract | - -### sendRequest - -```solidity -function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) -``` - -Sends a request (encoded as data) using the provided subscriptionId - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| _gasLimit | uint32 | Gas limit for the fulfillment callback | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | A unique request identifier (unique per DON) | - -## ISSVNetworkViews - -### initialize - -```solidity -function initialize(contract ISSVNetwork ssvNetwork_) external -``` - -_Initializes the contract._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| ssvNetwork_ | contract ISSVNetwork | The SSVNetwork contract. | - -### getValidator - -```solidity -function getValidator(bytes publicKey) external returns (address, bool) -``` - -### getOperatorFee - -```solidity -function getOperatorFee(uint64 operatorId) external returns (uint256) -``` - -### getOperatorDeclaredFee - -```solidity -function getOperatorDeclaredFee(uint64 operatorId) external returns (uint256, uint256, uint256) -``` - -### getOperatorById - -```solidity -function getOperatorById(uint64 operatorId) external view returns (address owner, uint256 fee, uint32 validatorCount, bool isPrivate, bool active) -``` - -### isLiquidatable - -```solidity -function isLiquidatable(address owner, uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster) external returns (bool) -``` - -### isLiquidated - -```solidity -function isLiquidated(address owner, uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster) external returns (bool) -``` - -### getBurnRate - -```solidity -function getBurnRate(address owner, uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster) external returns (uint256) -``` - -### getOperatorEarnings - -```solidity -function getOperatorEarnings(uint64 operatorId) external returns (uint256) -``` - -### getBalance - -```solidity -function getBalance(address owner, uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster) external returns (uint256) -``` - -### getNetworkFee - -```solidity -function getNetworkFee() external returns (uint256) -``` - -### getNetworkEarnings - -```solidity -function getNetworkEarnings() external returns (uint256) -``` - -### getOperatorFeeIncreaseLimit - -```solidity -function getOperatorFeeIncreaseLimit() external returns (uint64) -``` - -### getExecuteOperatorFeePeriod - -```solidity -function getExecuteOperatorFeePeriod() external returns (uint64) -``` - -### getDeclaredOperatorFeePeriod - -```solidity -function getDeclaredOperatorFeePeriod() external returns (uint64) -``` - -### getLiquidationThresholdPeriod - -```solidity -function getLiquidationThresholdPeriod() external returns (uint64) -``` - -### getMinimumLiquidationCollateral - -```solidity -function getMinimumLiquidationCollateral() external returns (uint256) -``` - diff --git a/contracts/ethereum/helpers/dkg.ts b/contracts/ethereum/helpers/dkg.ts index a5a3fe1e5..10574b829 100644 --- a/contracts/ethereum/helpers/dkg.ts +++ b/contracts/ethereum/helpers/dkg.ts @@ -3,20 +3,26 @@ import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' import { CasimirManager } from '../build/artifacts/types' import { validatorStore } from '@casimir/data' import { Validator } from '@casimir/types' +import { getCluster } from '@casimir/ssv' const mockValidators: Validator[] = Object.values(validatorStore) + const mockFee = 0.1 -export async function initiatePoolDeposit({ manager, signer, index }: { manager: CasimirManager, signer: SignerWithAddress, index: number }) { +export async function initiatePoolDepositHander({ manager, signer, index }: { manager: CasimirManager, signer: SignerWithAddress, index: number }) { const { depositDataRoot, publicKey, operatorIds, shares, - cluster, signature, withdrawalCredentials } = mockValidators[index] + + const networkAddress = await manager.getSSVNetworkAddress() + const withdrawalAddress = manager.address + const cluster = await getCluster({ provider: ethers.provider, networkAddress, operatorIds, withdrawalAddress }) + const initiatePool = await manager.connect(signer).initiatePoolDeposit( depositDataRoot, publicKey, diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 087f2ede7..257be2760 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -64,12 +64,27 @@ void async function () { const manager = await ethers.getContractAt('CasimirManager', config.CasimirManager.address as string) as CasimirManager const upkeep = await ethers.getContractAt('CasimirUpkeep', await manager.getUpkeepAddress() as string) as CasimirUpkeep - + + /** Stake 160 from the fourth user */ + setTimeout(async () => { + const stakeAmount = 160 + const feePercent = await manager.getFeePercent() + const depositAmount = stakeAmount * ((100 + feePercent) / 100) + const stake = await manager.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) + await stake?.wait() + }, 1000) + + /** Perform upkeep and fulfill dkg answer after each pool is initiated by the local oracle */ + for await (const event of on(manager as unknown as EventEmitter, 'PoolDepositInitiated')) { + const [id, details] = event + console.log(`Pool ${id} initiated at block number ${details.blockNumber}`) + } + /** Simulate rewards per staked validator */ const blocksPerReward = 50 const rewardPerValidator = 0.105 let lastRewardBlock = await ethers.provider.getBlockNumber() - ethers.provider.on('block', async (block) => { + for await (const block of on(ethers.provider as unknown as EventEmitter, 'block')) { if (block - blocksPerReward === lastRewardBlock) { lastRewardBlock = block const validatorCount = await manager.getValidatorPublicKeys() @@ -94,6 +109,13 @@ void async function () { const nextDepositedCount = (await manager.getPendingPoolIds()).length const nextExitedCount = 0 + console.log('Fulfilling before sweep:') + console.log('nextActiveBalanceAmount', nextActiveBalanceAmount) + console.log('nextSweptRewardsAmount', nextSweptRewardsAmount) + console.log('nextSweptExitsAmount', nextSweptExitsAmount) + console.log('nextDepositedCount', nextDepositedCount) + console.log('nextExitedCount', nextExitedCount) + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveBalanceAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } @@ -118,25 +140,17 @@ void async function () { const nextDepositedCount = (await manager.getPendingPoolIds()).length const nextExitedCount = 0 + console.log('Fulfilling after sweep:') + console.log('nextActiveBalanceAmount', nextActiveBalanceAmount) + console.log('nextSweptRewardsAmount', nextSweptRewardsAmount) + console.log('nextSweptExitsAmount', nextSweptExitsAmount) + console.log('nextDepositedCount', nextDepositedCount) + console.log('nextExitedCount', nextExitedCount) + await fulfillFunctionsRequest({ upkeep, keeper, nextActiveBalanceAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) } - + } } - }) - - /** Stake 64 from the fourth user */ - setTimeout(async () => { - const stakeAmount = 64 - const feePercent = await manager.getFeePercent() - const depositAmount = stakeAmount * ((100 + feePercent) / 100) - const stake = await manager?.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) - await stake?.wait() - }, 1000) - - /** Perform upkeep and fulfill dkg answer after each pool is initiated by the local oracle */ - for await (const event of on(manager as unknown as EventEmitter, 'PoolDepositInitiated')) { - const [ id, details ] = event - console.log(`Pool ${id} initiated at block number ${details.blockNumber}`) } }() \ No newline at end of file diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index 826bc3427..be0798a55 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -912,6 +912,14 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { return ssvFeePercent; } + /** + * @notice Get the SSV network address + * @return ssvNetworkAddress The SSV network address + */ + function getSSVNetworkAddress() external view returns (address ssvNetworkAddress) { + ssvNetworkAddress = address(ssvNetwork); + } + /** * @notice Get the upkeep address * @return upkeepAddress The upkeep address diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index fdfbdd1ad..1662ee91c 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -3,7 +3,7 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' import { deployContract } from '@casimir/ethereum/helpers/deploy' import { CasimirManager, CasimirUpkeep } from '@casimir/ethereum/build/artifacts/types' import { fulfillFunctionsRequest, runUpkeep } from '@casimir/ethereum/helpers/upkeep' -import { initiatePoolDeposit } from '@casimir/ethereum/helpers/dkg' +import { initiatePoolDepositHander } from '@casimir/ethereum/helpers/dkg' import { round } from '@casimir/ethereum/helpers/math' import { ContractConfig, DeploymentConfig } from '@casimir/types' @@ -108,7 +108,7 @@ export async function secondUserDepositFixture() { /** Initiate next ready pool */ const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length - await initiatePoolDeposit({ manager, signer: dkg, index: nextValidatorIndex }) + await initiatePoolDepositHander({ manager, signer: dkg, index: nextValidatorIndex }) /** Run upkeep */ const ranUpkeep = await runUpkeep({ upkeep, keeper }) @@ -209,7 +209,7 @@ export async function thirdUserDepositFixture() { /** Initiate next ready pool */ const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length - await initiatePoolDeposit({ manager, signer: dkg, index: nextValidatorIndex }) + await initiatePoolDepositHander({ manager, signer: dkg, index: nextValidatorIndex }) /** Run upkeep */ const ranUpkeep = await runUpkeep({ upkeep, keeper }) @@ -324,7 +324,7 @@ export async function fourthUserDepositFixture() { /** Initiate next ready pools (2) */ for (let i = 0; i < 2; i++) { const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length - await initiatePoolDeposit({ manager, signer: dkg, index: nextValidatorIndex }) + await initiatePoolDepositHander({ manager, signer: dkg, index: nextValidatorIndex }) } /** Run upkeep */ diff --git a/package-lock.json b/package-lock.json index 9c8ca0ef5..5b7d4514f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -235,6 +235,53 @@ "@ledgerhq/hw-transport": "^6.27.10" } }, + "common/ssv": { + "name": "@casimir/ssv", + "dependencies": { + "ethers": "^5.7.2" + }, + "devDependencies": { + "@types/node": "^17.0.38", + "esbuild": "^0.15.9" + } + }, + "common/ssv/node_modules/esbuild": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, "common/types": { "name": "@casimir/types" }, @@ -313,11 +360,6 @@ "constructs": "^10.0.0" } }, - "node_modules/@adraffy/ens-normalize": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.0.tgz", - "integrity": "sha512-iowxq3U30sghZotgl4s/oJRci6WPBfNO5YYgk2cIOMCHr3LeGPcsZjCEr+33Q4N+oV3OABDAtA+pyvWjbvBifQ==" - }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -343,9 +385,9 @@ } }, "node_modules/@aws-cdk/asset-awscli-v1": { - "version": "2.2.176", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.176.tgz", - "integrity": "sha512-rAJ2KO0SK9uC9Wv6vAS1V2Eg88dK9nlojhm/HrEBWDsIPWcxvvT9EACkElrNXK9X6CF10i6W4UApCROERF1qjg==" + "version": "2.2.179", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.179.tgz", + "integrity": "sha512-IG4iaeYcKhBD+pmltWn/LH48MDDJYdkyuyCSM5GftfL9gkpv2zzlJGyEyOG2RU0ScJ5RcwH+KkUvkrOwadsDBA==" }, "node_modules/@aws-cdk/asset-kubectl-v20": { "version": "2.1.1", @@ -353,9 +395,9 @@ "integrity": "sha512-U1ntiX8XiMRRRH5J1IdC+1t5CE89015cwyt5U63Cpk0GnMlN5+h9WsWMlKlPXZR4rdq/m806JRlBMRpBUB2Dhw==" }, "node_modules/@aws-cdk/asset-node-proxy-agent-v5": { - "version": "2.0.147", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.147.tgz", - "integrity": "sha512-CnRj0KQwF6bpoGl2kABRqSdkf9gyj6IdEcuReaWbExPGYKKk+Pc0aGr32SwcPftP2Z8754g3Msw+tBhfE3IYdg==" + "version": "2.0.150", + "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.150.tgz", + "integrity": "sha512-xfLY3s5hi7wtpjUGGuI8Q9IPlIO3W957I+yekcHL1EOFFmPAHkkvC0DmQ1snDEqeqb5oekHZItkChf9uKPGihQ==" }, "node_modules/@aws-cdk/aws-glue-alpha": { "version": "2.33.0-alpha.0", @@ -458,15 +500,15 @@ } }, "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.332.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.332.0.tgz", - "integrity": "sha512-o2G3+w0Qm+jd5fnmG6+FF5KRu90PIv2Kd0mmMJIFmACVd+VtuWqsk85capX21YLcxizKe+okqaaD8/9vV7nvfw==", + "version": "3.335.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.335.0.tgz", + "integrity": "sha512-ghsAzb1K/CR70tQgJHiDzqy39az1zVmCW0AFwnUWIaK1sY+1pSQZ0Ey9BkywmzRIcBfbBxftexDdDX5nHg7oMA==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.332.0", + "@aws-sdk/client-sts": "3.335.0", "@aws-sdk/config-resolver": "3.329.0", - "@aws-sdk/credential-provider-node": "3.332.0", + "@aws-sdk/credential-provider-node": "3.335.0", "@aws-sdk/fetch-http-handler": "3.329.0", "@aws-sdk/hash-node": "3.329.0", "@aws-sdk/invalid-dependency": "3.329.0", @@ -482,7 +524,6 @@ "@aws-sdk/middleware-user-agent": "3.332.0", "@aws-sdk/node-config-provider": "3.329.0", "@aws-sdk/node-http-handler": "3.329.0", - "@aws-sdk/protocol-http": "3.329.0", "@aws-sdk/smithy-client": "3.329.0", "@aws-sdk/types": "3.329.0", "@aws-sdk/url-parser": "3.329.0", @@ -496,6 +537,8 @@ "@aws-sdk/util-user-agent-browser": "3.329.0", "@aws-sdk/util-user-agent-node": "3.329.0", "@aws-sdk/util-utf8": "3.310.0", + "@smithy/protocol-http": "^1.0.1", + "@smithy/types": "^1.0.0", "tslib": "^2.5.0" }, "engines": { @@ -503,15 +546,15 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.332.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.332.0.tgz", - "integrity": "sha512-xn8Ft+y+XggryvvPnKSEYhuidxWMMAXTfM4Dk1HAbzrpyAYRIuvYApt0a9nWa9DNM6Oi0yhcVvmsJW0/R+tvcA==", + "version": "3.335.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.335.0.tgz", + "integrity": "sha512-XgqOECIGZI8QfEBuYQJ+cek00raJz6UTkNun/zqYN8qCgFx+ukhnrB6g94kJITezz0Q51Rn2RM2nizE2hr3rVQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.332.0", + "@aws-sdk/client-sts": "3.335.0", "@aws-sdk/config-resolver": "3.329.0", - "@aws-sdk/credential-provider-node": "3.332.0", + "@aws-sdk/credential-provider-node": "3.335.0", "@aws-sdk/fetch-http-handler": "3.329.0", "@aws-sdk/hash-node": "3.329.0", "@aws-sdk/invalid-dependency": "3.329.0", @@ -527,7 +570,6 @@ "@aws-sdk/middleware-user-agent": "3.332.0", "@aws-sdk/node-config-provider": "3.329.0", "@aws-sdk/node-http-handler": "3.329.0", - "@aws-sdk/protocol-http": "3.329.0", "@aws-sdk/smithy-client": "3.329.0", "@aws-sdk/types": "3.329.0", "@aws-sdk/url-parser": "3.329.0", @@ -541,6 +583,8 @@ "@aws-sdk/util-user-agent-browser": "3.329.0", "@aws-sdk/util-user-agent-node": "3.329.0", "@aws-sdk/util-utf8": "3.310.0", + "@smithy/protocol-http": "^1.0.1", + "@smithy/types": "^1.0.0", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -549,9 +593,9 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.332.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.332.0.tgz", - "integrity": "sha512-4q1Nko8M6YVANdEiLYvdv1qb00j4xN4ppE/6d4xpGp7DxHYlm0GA762h0/TR2dun+2I+SMnwj4Fv6BxOmzBaEw==", + "version": "3.335.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.335.0.tgz", + "integrity": "sha512-tMvOq366QeMzcrRTDhMwuCFirntANX25qi4U32NDl//ny/7V6+7WK8Hf8lRAHvWnY9eT4RdNklXESo2yxlPyUg==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -570,7 +614,6 @@ "@aws-sdk/middleware-user-agent": "3.332.0", "@aws-sdk/node-config-provider": "3.329.0", "@aws-sdk/node-http-handler": "3.329.0", - "@aws-sdk/protocol-http": "3.329.0", "@aws-sdk/smithy-client": "3.329.0", "@aws-sdk/types": "3.329.0", "@aws-sdk/url-parser": "3.329.0", @@ -584,6 +627,8 @@ "@aws-sdk/util-user-agent-browser": "3.329.0", "@aws-sdk/util-user-agent-node": "3.329.0", "@aws-sdk/util-utf8": "3.310.0", + "@smithy/protocol-http": "^1.0.1", + "@smithy/types": "^1.0.0", "tslib": "^2.5.0" }, "engines": { @@ -591,9 +636,9 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.332.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.332.0.tgz", - "integrity": "sha512-tz8k8Yqm4TScIfit0Tum2zWAq1md+gZKr747CSixd4Zwcp7Vwh75cRoL7Rz1ZHSEn1Yo983MWREevVez3SubLw==", + "version": "3.335.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.335.0.tgz", + "integrity": "sha512-szaMq6tDznGy4EuidxPqhZKqEnfGJfoPWUpoFlhXsgZXinZY/vJlJ4G5l6nikhnS3omq3C3WPGJXMKF1ejVXKg==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", @@ -612,7 +657,6 @@ "@aws-sdk/middleware-user-agent": "3.332.0", "@aws-sdk/node-config-provider": "3.329.0", "@aws-sdk/node-http-handler": "3.329.0", - "@aws-sdk/protocol-http": "3.329.0", "@aws-sdk/smithy-client": "3.329.0", "@aws-sdk/types": "3.329.0", "@aws-sdk/url-parser": "3.329.0", @@ -626,6 +670,8 @@ "@aws-sdk/util-user-agent-browser": "3.329.0", "@aws-sdk/util-user-agent-node": "3.329.0", "@aws-sdk/util-utf8": "3.310.0", + "@smithy/protocol-http": "^1.0.1", + "@smithy/types": "^1.0.0", "tslib": "^2.5.0" }, "engines": { @@ -633,14 +679,14 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.332.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.332.0.tgz", - "integrity": "sha512-uVobnXIzMcEhwBDyk6iOt36N/TRNI8hwq7MQugjYGj7Inma9g4vnR09hXJ24HxyKCoVUoIgMbEguQ43+/+uvDQ==", + "version": "3.335.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.335.0.tgz", + "integrity": "sha512-W+LW1b/3auvGg3EmFeJiraMyH/nxX7qIEBEPPWlJKphGSJAt0l08o8glL2O8s+o2oYWCB2DmgdWyOt1D6YRldQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", "@aws-sdk/config-resolver": "3.329.0", - "@aws-sdk/credential-provider-node": "3.332.0", + "@aws-sdk/credential-provider-node": "3.335.0", "@aws-sdk/fetch-http-handler": "3.329.0", "@aws-sdk/hash-node": "3.329.0", "@aws-sdk/invalid-dependency": "3.329.0", @@ -657,7 +703,6 @@ "@aws-sdk/middleware-user-agent": "3.332.0", "@aws-sdk/node-config-provider": "3.329.0", "@aws-sdk/node-http-handler": "3.329.0", - "@aws-sdk/protocol-http": "3.329.0", "@aws-sdk/smithy-client": "3.329.0", "@aws-sdk/types": "3.329.0", "@aws-sdk/url-parser": "3.329.0", @@ -671,6 +716,8 @@ "@aws-sdk/util-user-agent-browser": "3.329.0", "@aws-sdk/util-user-agent-node": "3.329.0", "@aws-sdk/util-utf8": "3.310.0", + "@smithy/protocol-http": "^1.0.1", + "@smithy/types": "^1.0.0", "fast-xml-parser": "4.1.2", "tslib": "^2.5.0" }, @@ -693,11 +740,11 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.332.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.332.0.tgz", - "integrity": "sha512-FJI936QVSFd49PWOgTlW7e8rKO/6Y8sMnkvTJ/APQ1K8em+jWkaAMFBl15NrpOo/jlZCzhkkQDatDHAlbSUXGw==", + "version": "3.335.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.335.0.tgz", + "integrity": "sha512-WMR9buxEbEMcghVITk/buVm1ev4rrlUCY8MR9Gg0QI6hUdDUSP6QfWz2Hn++Tfe96v6maHFANvkRLk9NNZQBeg==", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.332.0", + "@aws-sdk/client-cognito-identity": "3.335.0", "@aws-sdk/property-provider": "3.329.0", "@aws-sdk/types": "3.329.0", "tslib": "^2.5.0" @@ -735,14 +782,14 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.332.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.332.0.tgz", - "integrity": "sha512-DTW6d6rcqizPVyvcIrwvxecQ7e5GONtVc5Wyf0RTfqf41sDOVZYmn6G+zEFSpBLW0975uZbJS0lyLWtJe2VujQ==", + "version": "3.335.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.335.0.tgz", + "integrity": "sha512-3AsKlpAnddLYGEZkfT8ZsAB+1WySSzbLA2eoJTW80nKWVUnvYV6gq/sNXEY43i7T2rOXmblJHbTuMAWA1ruMFg==", "dependencies": { "@aws-sdk/credential-provider-env": "3.329.0", "@aws-sdk/credential-provider-imds": "3.329.0", "@aws-sdk/credential-provider-process": "3.329.0", - "@aws-sdk/credential-provider-sso": "3.332.0", + "@aws-sdk/credential-provider-sso": "3.335.0", "@aws-sdk/credential-provider-web-identity": "3.329.0", "@aws-sdk/property-provider": "3.329.0", "@aws-sdk/shared-ini-file-loader": "3.329.0", @@ -754,15 +801,15 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.332.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.332.0.tgz", - "integrity": "sha512-KkBayS9k4WyJTvC86ngeRM+RmWxNCS1BHvudkR6PLXfnsNPDzxySDVY0UgxVhbNYDYsO561fXZt9ccpKyVWjgg==", + "version": "3.335.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.335.0.tgz", + "integrity": "sha512-aIelF8GBTbXuVntpeEdnbcajYtkO01OfSmXb08JxvtQ0tPCWY6SbLpNHUAIfBW1OVkm5E7SX+Hc1tawxq9IKAA==", "dependencies": { "@aws-sdk/credential-provider-env": "3.329.0", "@aws-sdk/credential-provider-imds": "3.329.0", - "@aws-sdk/credential-provider-ini": "3.332.0", + "@aws-sdk/credential-provider-ini": "3.335.0", "@aws-sdk/credential-provider-process": "3.329.0", - "@aws-sdk/credential-provider-sso": "3.332.0", + "@aws-sdk/credential-provider-sso": "3.335.0", "@aws-sdk/credential-provider-web-identity": "3.329.0", "@aws-sdk/property-provider": "3.329.0", "@aws-sdk/shared-ini-file-loader": "3.329.0", @@ -788,14 +835,14 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.332.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.332.0.tgz", - "integrity": "sha512-SaKXl48af3n6LRitcaEqbeg1YDXwQ0A5QziC1xQyYPraEIj3IZ/GyTjx04Lo2jxNYHuEOE8u4aTw1+IK1GDKbg==", + "version": "3.335.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.335.0.tgz", + "integrity": "sha512-omEF3m9Vy18QfuGuGx/48MaiKDOdvMZKZI9FKyQxFIwfqRyhmF2jzQ7070FD/E9YakscOZ0hSeYEPJ7nkJa8ww==", "dependencies": { - "@aws-sdk/client-sso": "3.332.0", + "@aws-sdk/client-sso": "3.335.0", "@aws-sdk/property-provider": "3.329.0", "@aws-sdk/shared-ini-file-loader": "3.329.0", - "@aws-sdk/token-providers": "3.332.0", + "@aws-sdk/token-providers": "3.335.0", "@aws-sdk/types": "3.329.0", "tslib": "^2.5.0" }, @@ -817,20 +864,20 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.332.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.332.0.tgz", - "integrity": "sha512-UZM8hCJqBBI4yEopVnfQ7HgUCuiYuWJziPFovQpbwvZKadibzo332/n6e5IsQbJxPjymqFLgTn3PQds/+1FOlQ==", - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.332.0", - "@aws-sdk/client-sso": "3.332.0", - "@aws-sdk/client-sts": "3.332.0", - "@aws-sdk/credential-provider-cognito-identity": "3.332.0", + "version": "3.335.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.335.0.tgz", + "integrity": "sha512-KWZL+B+6BDj1PfP7+Bb3/A6yFWxYtjYR7vi2UgD6QrmB09iUQtheiwObZY3f30OAq10O03gOmhxC2N1o6+i0sQ==", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.335.0", + "@aws-sdk/client-sso": "3.335.0", + "@aws-sdk/client-sts": "3.335.0", + "@aws-sdk/credential-provider-cognito-identity": "3.335.0", "@aws-sdk/credential-provider-env": "3.329.0", "@aws-sdk/credential-provider-imds": "3.329.0", - "@aws-sdk/credential-provider-ini": "3.332.0", - "@aws-sdk/credential-provider-node": "3.332.0", + "@aws-sdk/credential-provider-ini": "3.335.0", + "@aws-sdk/credential-provider-node": "3.335.0", "@aws-sdk/credential-provider-process": "3.329.0", - "@aws-sdk/credential-provider-sso": "3.332.0", + "@aws-sdk/credential-provider-sso": "3.335.0", "@aws-sdk/credential-provider-web-identity": "3.329.0", "@aws-sdk/property-provider": "3.329.0", "@aws-sdk/types": "3.329.0", @@ -1164,11 +1211,11 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.332.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.332.0.tgz", - "integrity": "sha512-fccbg6OSl0l658pxl2p1MoU9gEePo5B361+JNaN0zfRMu7c5HBXCpdl4djlFxAHjltrX9f1+BKqfGHYgI3h8SQ==", + "version": "3.335.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.335.0.tgz", + "integrity": "sha512-2Hu62xH4/6V+N5JWsPuvxCCmaf/QUnxtz48ClpxzBKM/whrTTkLku8W2fh2MmnzGzAHtT+N97jkIsy2B+onqIg==", "dependencies": { - "@aws-sdk/client-sso-oidc": "3.332.0", + "@aws-sdk/client-sso-oidc": "3.335.0", "@aws-sdk/property-provider": "3.329.0", "@aws-sdk/shared-ini-file-loader": "3.329.0", "@aws-sdk/types": "3.329.0", @@ -2045,6 +2092,10 @@ "resolved": "common/speculos", "link": true }, + "node_modules/@casimir/ssv": { + "resolved": "common/ssv", + "link": true + }, "node_modules/@casimir/types": { "resolved": "common/types", "link": true @@ -4117,6 +4168,7 @@ "version": "1.7.1", "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "dev": true, "funding": [ { "type": "individual", @@ -4718,9 +4770,9 @@ } }, "node_modules/@octokit/core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz", - "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.1.tgz", + "integrity": "sha512-tEDxFx8E38zF3gT7sSMDrT1tGumDgsw5yPG6BBh/X+5ClIQfMH/Yqocxz1PnHx6CHyF6pxmovUTOfZAUvQ0Lvw==", "dev": true, "dependencies": { "@octokit/auth-token": "^3.0.0", @@ -4770,12 +4822,12 @@ "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.0.tgz", - "integrity": "sha512-5T4iXjJdYCVA1rdWS1C+uZV9AvtZY9QgTG74kFiSFVj94dZXowyi/YK8f4SGjZaL69jZthGlBaDKRdCMCF9log==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.1.tgz", + "integrity": "sha512-64kiYiv//JIEk6XdEhysyWCmtKt+ranjUiCsokBKhTvmF+3WiH+vdlF+HSvD/6PmbVWRQ7BMoOC6nvDhblR18w==", "dev": true, "dependencies": { - "@octokit/types": "^9.2.2" + "@octokit/types": "^9.2.3" }, "engines": { "node": ">= 14" @@ -4794,12 +4846,12 @@ } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.1.0.tgz", - "integrity": "sha512-SWwz/hc47GaKJR6BlJI4WIVRodbAFRvrR0QRPSoPMs7krb7anYPML3psg+ThEz/kcwOdSNh/oA8qThi/Wvs4Fw==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.1.2.tgz", + "integrity": "sha512-R0oJ7j6f/AdqPLtB9qRXLO+wjI9pctUn8Ka8UGfGaFCcCv3Otx14CshQ89K4E88pmyYZS8p0rNTiprML/81jig==", "dev": true, "dependencies": { - "@octokit/types": "^9.2.2", + "@octokit/types": "^9.2.3", "deprecation": "^2.3.1" }, "engines": { @@ -4810,9 +4862,9 @@ } }, "node_modules/@octokit/request": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.3.tgz", - "integrity": "sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==", + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.5.tgz", + "integrity": "sha512-z83E8UIlPNaJUsXpjD8E0V5o/5f+vJJNbNcBwVZsX3/vC650U41cOkTLjq4PKk9BYonQGOnx7N17gvLyNjgGcQ==", "dev": true, "dependencies": { "@octokit/endpoint": "^7.0.0", @@ -4856,12 +4908,12 @@ } }, "node_modules/@octokit/types": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.2.tgz", - "integrity": "sha512-9BjDxjgQIvCjNWZsbqyH5QC2Yni16oaE6xL+8SUBMzcYPF4TGQBXGA97Cl3KceK9mwiNMb1mOYCz6FbCCLEL+g==", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.3.tgz", + "integrity": "sha512-MMeLdHyFIALioycq+LFcA71v0S2xpQUX2cw6pPbHQjaibcHYwLnmK/kMZaWuGfGfjBJZ3wRUq+dOaWsvrPJVvA==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^17.1.2" + "@octokit/openapi-types": "^17.2.0" } }, "node_modules/@openzeppelin/contracts": { @@ -5307,14 +5359,37 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.1.0.tgz", - "integrity": "sha512-w1qd368vtrwttm1PRJWPW1QHlbmHrVDGs1eBH/jZvRPUFS4MNXV9Q33EQdjOdeAxZ7O8+3wM7zxztm2nfUSyKw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.2.0.tgz", + "integrity": "sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@smithy/protocol-http": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.0.1.tgz", + "integrity": "sha512-9OrEn0WfOVtBNYJUjUAn9AOiJ4lzERCJJ/JeZs8E6yajTGxBaFRxUnNBHiNqoDJVg076hY36UmEnPx7xXrvUSg==", + "dependencies": { + "@smithy/types": "^1.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.0.0.tgz", + "integrity": "sha512-kc1m5wPBHQCTixwuaOh9vnak/iJm21DrSf9UK6yDE5S3mQQ4u11pqAUiKWnlrZnYkeLfAI9UEHj9OaMT1v5Umg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@solana/buffer-layout": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", @@ -5493,6 +5568,11 @@ "node-fetch": "^2.6.11" } }, + "node_modules/@trezor/connect/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, "node_modules/@trezor/env-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@trezor/env-utils/-/env-utils-1.0.1.tgz", @@ -6392,36 +6472,36 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.2.tgz", - "integrity": "sha512-CKZWo1dzsQYTNTft7whzjL0HsrEpMfiK7pjZ2WFE3bC1NA7caUjWioHSK+49y/LK7Bsm4poJZzAMnvZMQ7OTeg==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", "dependencies": { "@babel/parser": "^7.21.3", - "@vue/shared": "3.3.2", + "@vue/shared": "3.3.4", "estree-walker": "^2.0.2", "source-map-js": "^1.0.2" } }, "node_modules/@vue/compiler-dom": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.2.tgz", - "integrity": "sha512-6gS3auANuKXLw0XH6QxkWqyPYPunziS2xb6VRenM3JY7gVfZcJvkCBHkb5RuNY1FCbBO3lkIi0CdXUCW1c7SXw==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", "dependencies": { - "@vue/compiler-core": "3.3.2", - "@vue/shared": "3.3.2" + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.2.tgz", - "integrity": "sha512-jG4jQy28H4BqzEKsQqqW65BZgmo3vzdLHTBjF+35RwtDdlFE+Fk1VWJYUnDMMqkFBo6Ye1ltSKVOMPgkzYj7SQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", "dependencies": { "@babel/parser": "^7.20.15", - "@vue/compiler-core": "3.3.2", - "@vue/compiler-dom": "3.3.2", - "@vue/compiler-ssr": "3.3.2", - "@vue/reactivity-transform": "3.3.2", - "@vue/shared": "3.3.2", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", "estree-walker": "^2.0.2", "magic-string": "^0.30.0", "postcss": "^8.1.10", @@ -6440,12 +6520,12 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.2.tgz", - "integrity": "sha512-K8OfY5FQtZaSOJHHe8xhEfIfLrefL/Y9frv4k4NsyQL3+0lRKxr9QuJhfdBDjkl7Fhz8CzKh63mULvmOfx3l2w==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", "dependencies": { - "@vue/compiler-dom": "3.3.2", - "@vue/shared": "3.3.2" + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" } }, "node_modules/@vue/devtools-api": { @@ -6472,21 +6552,21 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.2.tgz", - "integrity": "sha512-yX8C4uTgg2Tdj+512EEMnMKbLveoITl7YdQX35AYgx8vBvQGszKiiCN46g4RY6/deeo/5DLbeUUGxCq1qWMf5g==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", "dependencies": { - "@vue/shared": "3.3.2" + "@vue/shared": "3.3.4" } }, "node_modules/@vue/reactivity-transform": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.2.tgz", - "integrity": "sha512-iu2WaQvlJHdnONrsyv4ibIEnSsuKF+aHFngGj/y1lwpHQtalpVhKg9wsKMoiKXS9zPNjG9mNKzJS9vudvjzvyg==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", "dependencies": { "@babel/parser": "^7.20.15", - "@vue/compiler-core": "3.3.2", - "@vue/shared": "3.3.2", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", "estree-walker": "^2.0.2", "magic-string": "^0.30.0" } @@ -6503,40 +6583,40 @@ } }, "node_modules/@vue/runtime-core": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.2.tgz", - "integrity": "sha512-qSl95qj0BvKfcsO+hICqFEoLhJn6++HtsPxmTkkadFbuhe3uQfJ8HmQwvEr7xbxBd2rcJB6XOJg7nWAn/ymC5A==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", "dependencies": { - "@vue/reactivity": "3.3.2", - "@vue/shared": "3.3.2" + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" } }, "node_modules/@vue/runtime-dom": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.2.tgz", - "integrity": "sha512-+drStsJT+0mtgHdarT7cXZReCcTFfm6ptxMrz0kAW5hms6UNBd8Q1pi4JKlncAhu+Ld/TevsSp7pqAZxBBoGng==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", "dependencies": { - "@vue/runtime-core": "3.3.2", - "@vue/shared": "3.3.2", + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", "csstype": "^3.1.1" } }, "node_modules/@vue/server-renderer": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.2.tgz", - "integrity": "sha512-QCwh6OGwJg6GDLE0fbQhRTR6tnU+XDJ1iCsTYHXBiezCXAhqMygFRij7BiLF4ytvvHcg5kX9joX5R5vP85++wg==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", "dependencies": { - "@vue/compiler-ssr": "3.3.2", - "@vue/shared": "3.3.2" + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" }, "peerDependencies": { - "vue": "3.3.2" + "vue": "3.3.4" } }, "node_modules/@vue/shared": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.2.tgz", - "integrity": "sha512-0rFu3h8JbclbnvvKrs7Fe5FNGV9/5X2rPD7KmOzhLSUAiQH5//Hq437Gv0fR5Mev3u/nbtvmLl8XgwCU20/ZfQ==" + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" }, "node_modules/@walletconnect/browser-utils": { "version": "1.8.0", @@ -6640,9 +6720,9 @@ } }, "node_modules/@walletconnect/jsonrpc-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.2.tgz", - "integrity": "sha512-CZe8tjJX73OWdHjrBHy7HtAapJ2tT0Q3TYhPBhRxi3643lwPIQWC9En45ldY14TZwgSewkbZ0FtGBZK0G7Bbyg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.3.tgz", + "integrity": "sha512-iIQ8hboBl3o5ufmJ8cuduGad0CQm3ZlsHtujv9Eu16xq89q+BG7Nh5VLxxUgmtpnrePgFkTwXirCTkwJH1v+Yw==", "dependencies": { "keyvaluestorage-interface": "^1.0.0", "tslib": "1.14.1" @@ -6654,12 +6734,12 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@walletconnect/jsonrpc-utils": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.7.tgz", - "integrity": "sha512-zJziApzUF/Il4VcwabnaU+0yo1QI4eUkYX99zmCVTHJvZOf2l0zjADf/OpKqWyeNFC3Io56Z/8uJHVtcNVvyFA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz", + "integrity": "sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==", "dependencies": { "@walletconnect/environment": "^1.0.1", - "@walletconnect/jsonrpc-types": "^1.0.2", + "@walletconnect/jsonrpc-types": "^1.0.3", "tslib": "1.14.1" } }, @@ -7101,7 +7181,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -7110,7 +7189,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -7285,7 +7363,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, "engines": { "node": ">=8" } @@ -8895,9 +8972,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001487", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001487.tgz", - "integrity": "sha512-83564Z3yWGqXsh2vaH/mhXfEM0wX+NlBCm1jYHOb97TrTWJEmPTccZgeLTPBUUb0PNVo+oomb7wkimZBIERClA==", + "version": "1.0.30001488", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001488.tgz", + "integrity": "sha512-NORIQuuL4xGpIy6iCCQGN4iFjlBXtfKWIenlUuyZJumLRIindLb7wXM+GO8erEhb7vXfcnf4BAg2PrSDN5TNLQ==", "funding": [ { "type": "opencollective", @@ -8917,7 +8994,6 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", - "dev": true, "engines": { "node": ">= 0.8.0" } @@ -9357,7 +9433,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -9368,8 +9443,7 @@ "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==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/colorette": { "version": "2.0.20", @@ -9615,9 +9689,9 @@ "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" }, "node_modules/constructs": { - "version": "10.2.25", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.2.25.tgz", - "integrity": "sha512-hNhL7Lq+MZ/6QGaa5BWsuBMKmj30Wr81AjJaQfyGN5W9sZmJXAoI/ZEgRxTHCqkB6o5QB0bnlrZc2mwwnqFsSg==", + "version": "10.2.28", + "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.2.28.tgz", + "integrity": "sha512-qP0ryyp1ZVM0sbLgnGwa4aEOsJYQ1ghK4WA3WkPyft9JsSfbU/Wf8fMujWZWl+6txnyYyuvXabsCxiscjTyzMQ==", "engines": { "node": ">= 16.14.0" } @@ -10915,9 +10989,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.396", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.396.tgz", - "integrity": "sha512-pqKTdqp/c5vsrc0xUPYXTDBo9ixZuGY8es4ZOjjd6HD6bFYbu5QA09VoW3fkY4LF1T0zYk86lN6bZnNlBuOpdQ==" + "version": "1.4.402", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.402.tgz", + "integrity": "sha512-gWYvJSkohOiBE6ecVYXkrDgNaUjo47QEKK0kQzmWyhkH+yoYiG44bwuicTGNSIQRG3WDMsWVZJLRnJnLNkbWvA==" }, "node_modules/elliptic": { "version": "6.5.4", @@ -13113,7 +13187,6 @@ "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, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -14851,7 +14924,6 @@ "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, "engines": { "node": ">= 4" } @@ -15317,9 +15389,9 @@ } }, "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dependencies": { "has": "^1.0.3" }, @@ -17515,9 +17587,7 @@ "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true, - "peer": true + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" }, "node_modules/lodash.uniqby": { "version": "4.7.0", @@ -19676,13 +19746,13 @@ } }, "node_modules/path-scurry": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.1.tgz", - "integrity": "sha512-UgmoiySyjFxP6tscZDgWGEAgsW5ok8W3F5CJDnnH2pozwSTGE6eH7vwTotMwATWA2r5xqdkKdxYPkwlJjAI/3g==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", + "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", "dev": true, "dependencies": { "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.0" + "minipass": "^5.0.0 || ^6.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -19701,9 +19771,9 @@ } }, "node_modules/path-scurry/node_modules/minipass": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.1.tgz", - "integrity": "sha512-Tenl5QPpgozlOGBiveNYHg2f6y+VpxsXRoIHFUVJuSmTonXRAE6q9b8Mp/O46762/2AlW4ye4Nkyvx0fgWDKbw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", + "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -21319,7 +21389,6 @@ "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, "engines": { "node": ">=0.10.0" } @@ -22778,7 +22847,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -23184,8 +23252,6 @@ "version": "6.8.1", "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "peer": true, "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -23234,8 +23300,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -23250,16 +23314,12 @@ "node_modules/table/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==", - "dev": true, - "peer": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "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, - "peer": true, "engines": { "node": ">=8" } @@ -23267,16 +23327,12 @@ "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", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "peer": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "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, - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -23293,8 +23349,6 @@ "version": "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, - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -24944,9 +24998,9 @@ } }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", + "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" }, "node_modules/tsort": { "version": "0.0.1", @@ -25020,9 +25074,9 @@ "dev": true }, "node_modules/twilio": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/twilio/-/twilio-4.11.0.tgz", - "integrity": "sha512-8ZTfl5+ByJ08c3ko+t9HQ0DYKn4D94GKvTl/N1IeXektaRbNZ81kYJJkdsx4XEz2p6Dv4qEx+0+SBCMwmAy79w==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/twilio/-/twilio-4.11.1.tgz", + "integrity": "sha512-gU1eZcCbXKz2ltYfpF4V9y7IRhSPvL4fIEpbU9nRDTYCnwVkKQiIhKjX3vqeYbP3H+UhshrH3sHHXN8f0zem4Q==", "dependencies": { "axios": "^0.26.1", "dayjs": "^1.8.29", @@ -26078,15 +26132,15 @@ } }, "node_modules/vue": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.2.tgz", - "integrity": "sha512-98hJcAhyDwZoOo2flAQBSPVYG/o0HA9ivIy2ktHshjE+6/q8IMQ+kvDKQzOZTFPxvnNMcGM+zS2A00xeZMA7tA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", "dependencies": { - "@vue/compiler-dom": "3.3.2", - "@vue/compiler-sfc": "3.3.2", - "@vue/runtime-dom": "3.3.2", - "@vue/server-renderer": "3.3.2", - "@vue/shared": "3.3.2" + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" } }, "node_modules/vue-eslint-parser": { @@ -26139,9 +26193,9 @@ } }, "node_modules/vue-router": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.0.tgz", - "integrity": "sha512-c+usESa6ZoWsm4PPdzRSyenp5A4dsUtnDJnrI03fY1IpIihA9TK3x5ffgkFDpjhLJZewsXoKURapNLFdZjuqTg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.1.tgz", + "integrity": "sha512-nW28EeifEp8Abc5AfmAShy5ZKGsGzjcnZ3L1yc2DYUo+MqbBClrRP9yda3dIekM4I50/KnEwo1wkBLf7kHH5Cw==", "dependencies": { "@vue/devtools-api": "^6.5.0" }, @@ -27162,7 +27216,6 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", - "dev": true, "engines": { "node": ">= 14" } @@ -27322,9 +27375,9 @@ } }, "node_modules/zx/node_modules/@types/node": { - "version": "18.16.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.10.tgz", - "integrity": "sha512-sMo3EngB6QkMBlB9rBe1lFdKSLqljyWPPWv6/FzSxh/IDlyVWSzE9RiF4eAuerQHybrWdqBgAGb03PM89qOasA==", + "version": "18.16.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.13.tgz", + "integrity": "sha512-uZRomboV1vBL61EBXneL4j9/hEn+1Yqa4LQdpGrKmXFyJmVfWc9JV9+yb2AlnOnuaDnb2PDO3hC6/LKmzJxP1A==", "dev": true }, "node_modules/zx/node_modules/chalk": { @@ -27451,7 +27504,7 @@ "name": "@casimir/dkg", "version": "0.0.1", "dependencies": { - "ethers": "^6.3.0" + "ethers": "^5.7.2" }, "devDependencies": { "@types/cors": "^2.8.12", @@ -27463,22 +27516,6 @@ "zx": "^7.1.1" } }, - "services/dkg/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/" - } - ] - }, - "services/dkg/node_modules/aes-js": { - "version": "4.0.0-beta.3", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.3.tgz", - "integrity": "sha512-/xJX0/VTPcbc5xQE2VUP91y1xN8q/rDfhEzLm+vLc3hYvb5+qHCnpJRuFcrKn63zumK/sCwYYzhG8HP78JYSTA==" - }, "services/dkg/node_modules/esbuild": { "version": "0.15.18", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", @@ -27516,57 +27553,6 @@ "esbuild-windows-arm64": "0.15.18" } }, - "services/dkg/node_modules/ethers": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.3.0.tgz", - "integrity": "sha512-CKFYvTne1YT4S1glTiu7TgGsj0t6c6GAD7evrIk8zbeUb6nK8dcUPAiAWM8uDX/1NmRTvLM9+1Vnn49hwKtEzw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@adraffy/ens-normalize": "1.9.0", - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.7.1", - "aes-js": "4.0.0-beta.3", - "tslib": "2.4.0", - "ws": "8.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "services/dkg/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "services/dkg/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "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 - } - } - }, "services/users": { "name": "@casimir/users", "version": "0.0.1", diff --git a/services/dkg/package.json b/services/dkg/package.json index c836c591c..ff89ae967 100644 --- a/services/dkg/package.json +++ b/services/dkg/package.json @@ -11,7 +11,7 @@ "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { - "ethers": "^6.3.0" + "ethers": "^5.7.2" }, "devDependencies": { "@types/cors": "^2.8.12", diff --git a/services/dkg/scripts/dev.ts b/services/dkg/scripts/dev.ts index eb27c0b83..10a6c9226 100644 --- a/services/dkg/scripts/dev.ts +++ b/services/dkg/scripts/dev.ts @@ -5,7 +5,6 @@ const resourcePath = 'scripts/resources/rockx-dkg-cli' void async function () { process.env.BIP39_PATH_INDEX = '6' process.env.MANAGER_ADDRESS = process.env.PUBLIC_MANAGER_ADDRESS - process.env.SSV_ADDRESS = '0xAfdb141Dd99b5a101065f40e3D7636262dce65b3' process.env.CLI_PATH = `./${resourcePath}/build/bin/rockx-dkg-cli` process.env.MESSENGER_SRV_ADDR = 'http://0.0.0.0:3000' process.env.USE_HARDCODED_OPERATORS = 'true' diff --git a/services/dkg/src/index.ts b/services/dkg/src/index.ts index 38596e036..7aa9c6b0b 100644 --- a/services/dkg/src/index.ts +++ b/services/dkg/src/index.ts @@ -8,19 +8,18 @@ const handlers = { PoolExitRequested: initiatePoolExitHandler } -;(async function () { - const { manager, ssv, provider, signer, cliPath, messengerUrl } = await config() +const { provider, signer, manager, cliPath, messengerUrl } = config() - const eventEmitter = await getEventEmitter({ manager, events: Object.keys(handlers) }) - for await (const event of eventEmitter) { +;(async function () { + const eventEmitter = getEventEmitter({ manager, events: Object.keys(handlers) }) + for await (const event of eventEmitter) { const [ id, details ] = event - const { filter } = details - console.log(`Event ${filter} received for pool ${Number(id)}`) + console.log(`Event ${details.event} received for pool ${id}`) - const handler = handlers[filter as keyof typeof handlers] - if (!handler) throw new Error(`No handler found for event ${filter}`) - await handler({ manager, ssv, provider, signer, cliPath, messengerUrl, id: Number(id) }) + const handler = handlers[details.event as keyof typeof handlers] + if (!handler) throw new Error(`No handler found for event ${details.event}`) + await handler({ provider, signer, manager, cliPath, messengerUrl, id: id }) } })() diff --git a/services/dkg/src/interfaces/CreateValidatorInput.ts b/services/dkg/src/interfaces/CreateValidatorInput.ts index dce846295..0c8ef3644 100644 --- a/services/dkg/src/interfaces/CreateValidatorInput.ts +++ b/services/dkg/src/interfaces/CreateValidatorInput.ts @@ -1,13 +1,13 @@ -import { ISSVNetwork } from '@casimir/ethereum/build/artifacts/types' +import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' import { ethers } from 'ethers' export interface CreateValidatorInput { - /** SSV network contract */ - ssv: ISSVNetwork & ethers.Contract + /** JSON RPC provider */ + provider: ethers.providers.JsonRpcProvider + /** Manager contract */ + manager: ethers.Contract & CasimirManager /** Operator registry IDs */ operatorIds: number[] - /** JSON RPC provider */ - provider: ethers.JsonRpcProvider /** Validator withdrawal address */ withdrawalAddress: string } \ No newline at end of file diff --git a/services/dkg/src/interfaces/HandlerInput.ts b/services/dkg/src/interfaces/HandlerInput.ts index d0616796b..e2a4a8a91 100644 --- a/services/dkg/src/interfaces/HandlerInput.ts +++ b/services/dkg/src/interfaces/HandlerInput.ts @@ -1,15 +1,13 @@ import { ethers } from 'ethers' -import { CasimirManager, ISSVNetwork } from '@casimir/ethereum/build/artifacts/types' +import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' export interface HandlerInput { - /** Manager contract */ - manager: CasimirManager & ethers.Contract - /** SSV network contract */ - ssv: ISSVNetwork & ethers.Contract /** JSON RPC node provider */ - provider: ethers.JsonRpcProvider + provider: ethers.providers.JsonRpcProvider /** Transaction signer */ signer: ethers.Signer + /** Manager contract */ + manager: CasimirManager & ethers.Contract /** DKG cli path */ cliPath: string /** DKG messenger service URL */ diff --git a/services/dkg/src/interfaces/ReshareValidatorInput.ts b/services/dkg/src/interfaces/ReshareValidatorInput.ts index f80fb9078..fd52d7e56 100644 --- a/services/dkg/src/interfaces/ReshareValidatorInput.ts +++ b/services/dkg/src/interfaces/ReshareValidatorInput.ts @@ -1,15 +1,15 @@ -import { ISSVNetwork } from '@casimir/ethereum/build/artifacts/types' +import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' import { ethers } from 'ethers' export interface ReshareValidatorInput { - /** SSV network contract */ - ssv: ISSVNetwork & ethers.Contract /** JSON RPC provider */ - provider: ethers.JsonRpcProvider - /** Operator registry IDs */ - operatorIds: number[] + provider: ethers.providers.JsonRpcProvider + /** Manager contract */ + manager: ethers.Contract & CasimirManager /** Validator public key */ publicKey: string + /** Operator registry IDs */ + operatorIds: number[] /** Old operator registry IDs */ oldOperatorIds: number[] /** Validator withdrawal address */ diff --git a/services/dkg/src/providers/config.ts b/services/dkg/src/providers/config.ts index 6dea4cd97..599fc08e7 100644 --- a/services/dkg/src/providers/config.ts +++ b/services/dkg/src/providers/config.ts @@ -1,33 +1,32 @@ import { ethers } from 'ethers' import CasimirManagerJson from '@casimir/ethereum/build/artifacts/src/CasimirManager.sol/CasimirManager.json' -import SSVNetworkJson from '@casimir/ethereum/build/artifacts/src/vendor/interfaces/ISSVNetwork.sol/ISSVNetwork.json' -import { CasimirManager, ISSVNetwork } from '@casimir/ethereum/build/artifacts/types' +import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' -export async function config() { +export function config() { + /** Get JSON RPC node provider */ const url = process.env.ETHEREUM_RPC_URL if (!url) throw new Error('No rpc url provided') - const provider = new ethers.JsonRpcProvider(url) + const provider = new ethers.providers.JsonRpcProvider(url) + /** Get transaction signer */ const mnemonic = process.env.BIP39_SEED - const pathIndex = process.env.BIP39_PATH_INDEX + // const pathIndex = process.env.BIP39_PATH_INDEX + // const path = `m/44'/60'/0'/0/${pathIndex || 0}` if (!mnemonic) throw new Error('No mnemonic provided') - ethers.Wallet.fromPhrase(mnemonic, provider) - const accounts = await provider.listAccounts() - const signer = accounts[Number(pathIndex || 0)] + const signer = ethers.Wallet.fromMnemonic(mnemonic, 'm/44\'/60\'/0\'/0/6').connect(provider) + /** Get manager contract */ const managerAddress = process.env.MANAGER_ADDRESS if (!managerAddress) throw new Error('No manager address provided') const manager = new ethers.Contract(managerAddress, CasimirManagerJson.abi, provider) as CasimirManager & ethers.Contract - - const ssvAddress = process.env.SSV_ADDRESS - if (!ssvAddress) throw new Error('No ssv address provided') - const ssv = new ethers.Contract(ssvAddress, SSVNetworkJson.abi, provider) as ISSVNetwork & ethers.Contract - + + /** Get DKG CLI path */ const cliPath = process.env.CLI_PATH if (!cliPath) throw new Error('No cli path provided') + /** Get DKG messenger service url */ const messengerUrl = process.env.MESSENGER_SRV_ADDR if (!messengerUrl) throw new Error('No messenger url provided') - return { manager, ssv, provider, signer, cliPath, messengerUrl } + return { provider, signer, manager, cliPath, messengerUrl } } diff --git a/services/dkg/src/providers/dkg.ts b/services/dkg/src/providers/dkg.ts index 485e67cd6..d6eade47c 100644 --- a/services/dkg/src/providers/dkg.ts +++ b/services/dkg/src/providers/dkg.ts @@ -5,14 +5,11 @@ import { DKGOptions } from '../interfaces/DKGOptions' import { ReshareInput } from '../interfaces/ReshareInput' import { getWithdrawalCredentials, runRetry } from '@casimir/helpers' import { CreateValidatorInput } from '../interfaces/CreateValidatorInput' -import { Validator, Cluster } from '@casimir/types' +import { Validator } from '@casimir/types' import { ReshareValidatorInput } from '../interfaces/ReshareValidatorInput' import { operatorStore } from '@casimir/data' -import { ClusterInput } from '../interfaces/ClusterInput' import { DepositDataInput } from '../interfaces/DepositDataInput' -import { ethers } from 'ethers' - -const lastPoolId = 0 +import { getCluster } from '@casimir/ssv' export class DKG { /** DKG CLI path */ @@ -31,7 +28,7 @@ export class DKG { * @returns {Promise} Validator with operator key shares and deposit data */ async createValidator(input: CreateValidatorInput): Promise { - const { provider, ssv, operatorIds, withdrawalAddress } = input + const { provider, manager, operatorIds, withdrawalAddress } = input const operators = this.getOperatorUrls(operatorIds) @@ -48,8 +45,11 @@ export class DKG { /** Get validator deposit data */ const { depositDataRoot, publicKey, signature, withdrawalCredentials } = await this.getDepositData({ ceremonyId, withdrawalAddress }) + /** Get SSV network address */ + const networkAddress = await manager.getSSVNetworkAddress() + /** Get SSV cluster snapshot */ - const cluster = await this.getCluster({ ssv, operatorIds, provider, withdrawalAddress }) + const cluster = await getCluster({ networkAddress, operatorIds, provider, withdrawalAddress }) /** Create validator */ const validator: Validator = { @@ -71,7 +71,7 @@ export class DKG { * @returns {Promise} Validator with operator key shares and deposit data */ async reshareValidator(input: ReshareValidatorInput): Promise { - const { ssv, provider, operatorIds, publicKey, oldOperatorIds, withdrawalAddress } = input + const { provider, manager, operatorIds, publicKey, oldOperatorIds, withdrawalAddress } = input const operators = this.getOperatorUrls(operatorIds) const oldOperators = this.getOperatorUrls(oldOperatorIds) @@ -85,8 +85,11 @@ export class DKG { /** Get validator deposit data */ const { depositDataRoot, signature, withdrawalCredentials } = await this.getDepositData({ ceremonyId, withdrawalAddress }) + /** Get SSV network address */ + const networkAddress = await manager.getSSVNetworkAddress() + /** Get SSV cluster snapshot */ - const cluster = await this.getCluster({ ssv, operatorIds, provider, withdrawalAddress }) + const cluster = await getCluster({ networkAddress, operatorIds, provider, withdrawalAddress }) /** Create validator */ const validator: Validator = { @@ -192,84 +195,4 @@ export class DKG { return group }, {}) } - - /** - * Get cluster snapshot - * @param {ClusterInput} input - Operator IDs and withdrawal address - * @returns {Promise} Cluster snapshot - */ - async getCluster(input: ClusterInput): Promise { - const { ssv, provider, operatorIds, withdrawalAddress } = input - - const DAY = 5400 - const WEEK = DAY * 7 - const MONTH = DAY * 30 - const latestBlockNumber = await provider.getBlockNumber() - let step = MONTH - let cluster - let biggestBlockNumber = 0 - - const eventList = [ - 'ClusterDeposited', - 'ClusterWithdrawn', - 'ValidatorAdded', - 'ValidatorRemoved', - 'ClusterLiquidated', - 'ClusterReactivated' - ] - - const topicFilter: ethers.TopicFilter = [] - for (const event of eventList) { - const topic = await ssv.filters[event](withdrawalAddress).getTopicFilter() - topicFilter.concat(topic) - } - - let fromBlock = latestBlockNumber - step - let toBlock = latestBlockNumber - - while (!cluster && fromBlock > 0) { - try { - const result = await provider.getLogs({ - address: await ssv.getAddress(), - fromBlock, - toBlock, - topics: topicFilter - }) - - for (const item of result) { - const { blockNumber, data, topics } = item - const log = ssv.interface.parseLog({ data, topics: topics as string[] }) - - const checkClusterEvent = eventList.includes(log.name) - const checkOwner = log.args.owner === withdrawalAddress - const checkOperators = JSON.stringify(log.args.operatorIds.map((value: string) => Number(value))) === JSON.stringify(operatorIds) - - if (checkClusterEvent && checkOwner && checkOperators) { - if (blockNumber > biggestBlockNumber) { - biggestBlockNumber = blockNumber - cluster = log.args.cluster - console.log('CLUSTER SNAPSHOT', cluster) - } - } - } - toBlock = fromBlock - } catch (e) { - console.error(e) - if (step === MONTH) { - step = WEEK - } else if (step === WEEK) { - step = DAY - } - } - fromBlock = toBlock - step - } - - return cluster || { - validatorCount: 0, - networkFeeIndex: 0, - index: 0, - balance: 0, - active: true - } - } } \ No newline at end of file diff --git a/services/dkg/src/providers/events.ts b/services/dkg/src/providers/events.ts index cd6856032..40bdf3bc5 100644 --- a/services/dkg/src/providers/events.ts +++ b/services/dkg/src/providers/events.ts @@ -2,17 +2,17 @@ import { ethers } from 'ethers' import { on, EventEmitter } from 'events' import { mergeAsyncIterables } from './iterables' -export async function getEventEmitter({ manager, events }: { manager: ethers.Contract, events: string[] }) { +export function getEventEmitter({ manager, events }: { manager: ethers.Contract, events: string[] }) { const iterables = [] for (const event of events) { - const iterable = await getEvent({ manager, event }) + const iterable = getEvent({ manager, event }) iterables.push(iterable) } return mergeAsyncIterables(iterables) } -async function getEvent({ manager, event }: { manager: ethers.Contract, event: string }) { - const emitter = new EventEmitter() - await manager.on(event, (...args) => emitter.emit(event, ...args)) - return on(emitter as EventEmitter, event) +function getEvent({ manager, event }: { manager: ethers.Contract, event: string }) { + const eventEmitter = new EventEmitter() + manager.on(event, (...args: any[]) => eventEmitter.emit(event, ...args)) + return on(eventEmitter, event) } \ No newline at end of file diff --git a/services/dkg/src/providers/handlers.ts b/services/dkg/src/providers/handlers.ts index 4a2d7a80f..b53142f71 100644 --- a/services/dkg/src/providers/handlers.ts +++ b/services/dkg/src/providers/handlers.ts @@ -5,15 +5,15 @@ import fs from 'fs' import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' export async function initiatePoolDepositHandler(input: HandlerInput) { - const { manager, ssv, provider, signer, cliPath, messengerUrl } = input + const { provider, signer, manager, cliPath, messengerUrl } = input const newOperatorIds = [1, 2, 3, 4] // Todo get new group here const dkg = new DKG({ cliPath, messengerUrl }) const validator = await dkg.createValidator({ - ssv, - operatorIds: newOperatorIds, provider, - withdrawalAddress: await manager.getAddress() + manager, + operatorIds: newOperatorIds, + withdrawalAddress: manager.address }) // Save validator for mocks @@ -39,7 +39,7 @@ export async function initiatePoolDepositHandler(input: HandlerInput) { cluster, signature, withdrawalCredentials, - ethers.parseEther('0.1') // Mock fee amount estimate ~ 10 SSV + ethers.utils.parseEther('0.1') // Mock fee amount estimate ~ 10 SSV ) await initiatePoolDeposit.wait() } @@ -59,6 +59,8 @@ export async function initiatePoolReshareHandler(input: HandlerInput) { // Get operators to sign reshare const dkg = new DKG({ cliPath, messengerUrl }) // const validator = await dkg.reshareValidator({ + // provider, + // manager, // publicKey, // operatorIds: newOperatorGroup, // oldOperatorIds: operatorIds, From d6464857a728f1a5ccb842a64edceb0a2e6fbf77 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Fri, 19 May 2023 23:48:18 -0400 Subject: [PATCH 34/78] Move dkg to validators service --- .gitmodules | 2 +- contracts/ethereum/docs/index.md | 14 ++++++++++++++ contracts/ethereum/src/CasimirManager.sol | 11 ----------- package-lock.json | 4 ++-- scripts/ethereum/dev.ts | 4 ++-- scripts/local/dev.ts | 2 +- services/dkg/README.md | 18 ------------------ services/dkg/scripts/resources/rockx-dkg-cli | 1 - services/{dkg => validators}/.gitignore | 0 services/validators/README.md | 18 ++++++++++++++++++ services/{dkg => validators}/package.json | 4 ++-- services/{dkg => validators}/scripts/clean.ts | 0 services/{dkg => validators}/scripts/dev.ts | 0 services/{dkg => validators}/src/index.ts | 0 .../src/interfaces/CreateValidatorInput.ts | 0 .../src/interfaces/DKGOptions.ts | 0 .../src/interfaces/DepositData.ts | 0 .../src/interfaces/DepositDataInput.ts | 0 .../src/interfaces/HandlerInput.ts | 0 .../src/interfaces/KeygenInput.ts | 0 .../src/interfaces/ReshareInput.ts | 0 .../src/interfaces/ReshareValidatorInput.ts | 0 .../src/providers/config.ts | 0 .../{dkg => validators}/src/providers/dkg.ts | 0 .../src/providers/events.ts | 0 .../src/providers/handlers.ts | 0 .../src/providers/iterables.ts | 0 services/{dkg => validators}/tsconfig.json | 0 28 files changed, 40 insertions(+), 38 deletions(-) delete mode 100644 services/dkg/README.md delete mode 160000 services/dkg/scripts/resources/rockx-dkg-cli rename services/{dkg => validators}/.gitignore (100%) create mode 100644 services/validators/README.md rename services/{dkg => validators}/package.json (87%) rename services/{dkg => validators}/scripts/clean.ts (100%) rename services/{dkg => validators}/scripts/dev.ts (100%) rename services/{dkg => validators}/src/index.ts (100%) rename services/{dkg => validators}/src/interfaces/CreateValidatorInput.ts (100%) rename services/{dkg => validators}/src/interfaces/DKGOptions.ts (100%) rename services/{dkg => validators}/src/interfaces/DepositData.ts (100%) rename services/{dkg => validators}/src/interfaces/DepositDataInput.ts (100%) rename services/{dkg => validators}/src/interfaces/HandlerInput.ts (100%) rename services/{dkg => validators}/src/interfaces/KeygenInput.ts (100%) rename services/{dkg => validators}/src/interfaces/ReshareInput.ts (100%) rename services/{dkg => validators}/src/interfaces/ReshareValidatorInput.ts (100%) rename services/{dkg => validators}/src/providers/config.ts (100%) rename services/{dkg => validators}/src/providers/dkg.ts (100%) rename services/{dkg => validators}/src/providers/events.ts (100%) rename services/{dkg => validators}/src/providers/handlers.ts (100%) rename services/{dkg => validators}/src/providers/iterables.ts (100%) rename services/{dkg => validators}/tsconfig.json (100%) diff --git a/.gitmodules b/.gitmodules index ce6368d16..b7eee3b6a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -14,5 +14,5 @@ path = scripts/trezor/resources/trezor-user-env url = https://github.com/trezor/trezor-user-env.git [submodule "services/keys/scripts/resources/rockx-dkg-cli"] - path = services/dkg/scripts/resources/rockx-dkg-cli + path = services/validators/scripts/resources/rockx-dkg-cli url = https://github.com/RockX-SG/rockx-dkg-cli.git diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index a5200917d..e16f8760a 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -609,6 +609,20 @@ Get the SSV fee percentage to charge on each deposit | ---- | ---- | ----------- | | [0] | uint32 | The SSV fee percentage to charge on each deposit | +### getSSVNetworkAddress + +```solidity +function getSSVNetworkAddress() external view returns (address ssvNetworkAddress) +``` + +Get the SSV network address + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| ssvNetworkAddress | address | The SSV network address | + ### getUpkeepAddress ```solidity diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index be0798a55..0163604db 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -456,17 +456,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { emit PoolDepositInitiated(poolId); } - function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) { - // If the _res length is less than 68, then the transaction failed silently (without a revert message) - if (_returnData.length < 68) return 'Transaction reverted silently'; - - assembly { - // Slice the sighash. - _returnData := add(_returnData, 0x04) - } - return abi.decode(_returnData, (string)); // All that remains is the revert string - } - /** * @notice Complete a given count of the next pending pools * @param count The number of pools to complete diff --git a/package-lock.json b/package-lock.json index 5b7d4514f..3c02abffd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2072,7 +2072,7 @@ "resolved": "common/data", "link": true }, - "node_modules/@casimir/dkg": { + "node_modules/@casimir/validators": { "resolved": "services/dkg", "link": true }, @@ -27501,7 +27501,7 @@ } }, "services/dkg": { - "name": "@casimir/dkg", + "name": "@casimir/validators", "version": "0.0.1", "dependencies": { "ethers": "^5.7.2" diff --git a/scripts/ethereum/dev.ts b/scripts/ethereum/dev.ts index 0ac79a64b..0c32ebcf2 100644 --- a/scripts/ethereum/dev.ts +++ b/scripts/ethereum/dev.ts @@ -82,10 +82,10 @@ void async function () { /** Start local oracle */ process.env.ETHEREUM_RPC_URL = 'http://localhost:8545' - $`npm run dev --workspace @casimir/dkg` + $`npm run dev --workspace @casimir/validators` process.on('SIGINT', () => { - const messes = ['dkg'] + const messes = ['validators'] if (clean) { const cleaners = messes.map(mess => `npm run clean --workspace @casimir/${mess}`).join(' & ') console.log(`\n🧹 Cleaning up: ${messes.map(mess => `@casimir/${mess}`).join(', ')}`) diff --git a/scripts/local/dev.ts b/scripts/local/dev.ts index 4d6d25dd6..1efaf501b 100644 --- a/scripts/local/dev.ts +++ b/scripts/local/dev.ts @@ -147,7 +147,7 @@ void async function () { $`npm run dev --workspace @casimir/${app}` process.on('SIGINT', () => { - const messes = ['data', 'dkg'] + const messes = ['data', 'validators'] if (clean) { const cleaners = messes.map(mess => `npm run clean --workspace @casimir/${mess}`).join(' & ') console.log(`\n🧹 Cleaning up: ${messes.map(mess => `@casimir/${mess}`).join(', ')}`) diff --git a/services/dkg/README.md b/services/dkg/README.md deleted file mode 100644 index 77369704e..000000000 --- a/services/dkg/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# @casimir/dkg - -Casimir DKG oracle service - -## About - -The distributed key generation (DKG) oracle is initially intended to be a single-instance service used to initiate, publish, and prove fair distributed key operations. It contains a [NodeJS](https://nodejs.org) application that listens for `PoolDepositRequested`, `PoolReshareRequested`, and `PoolExitRequested` events, which then internally uses the [RockX DKG CLI and messenger server](https://github.com/rockx/rockx-dkg-cli) to initiate and retrieve operator group DKG results. The `PoolDepositRequested` event starts a new DKG keygen and retrieves the results to submit a new validator via `initiatePoolDeposit`. The `PoolReshareRequested` event starts a new DKG reshare and retrieves the results to update an existing validator via `resharePool`. The `PoolExitRequested` event starts a new DKG exit and retrieves the results to submit a signed exit message directly to the Beacon chain. - -The DKG operations will have verifiable aspects that can eventually be used in proofs. The "what" and "where" of these proofs is a WIP depending on continued [DKG verification](https://docs.obol.tech/docs/next/charon/dkg#dkg-verification) research. - -> 🚩 The deployment strategy, including the API security, of this service is a WIP, and will be done in a way that allows for easy upgrades and/or replacement with a contract-native DKG trigger mechanism. Casimir is researching the best approach to trustless operations in collaboration with Chainlink, SSV, and RockX, and the @casimir/dkg service will prioritize a combination of security and decentralization as much as possible. - -### Future - -In the future, some aspects of this oracle service may be improved, or become obsolete, as the underlying decentralized protocols evolve: - -- SSV contract-native, zero-coordination key operation triggers (with SSV DKG support) may augment or replace the DKG messenger server and the need for a single-instance oracle service -- Contract-native validator exit triggers may remove the need for presigned validator exit messages diff --git a/services/dkg/scripts/resources/rockx-dkg-cli b/services/dkg/scripts/resources/rockx-dkg-cli deleted file mode 160000 index d54b6deec..000000000 --- a/services/dkg/scripts/resources/rockx-dkg-cli +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d54b6deec019c3c693f16311d7834a24a2975430 diff --git a/services/dkg/.gitignore b/services/validators/.gitignore similarity index 100% rename from services/dkg/.gitignore rename to services/validators/.gitignore diff --git a/services/validators/README.md b/services/validators/README.md new file mode 100644 index 000000000..5b15ce079 --- /dev/null +++ b/services/validators/README.md @@ -0,0 +1,18 @@ +# @casimir/validators + +Casimir validators oracle service + +## About + +The validator oracle service initiates and reports on validator operations: distributed key generation (DKG) ceremonies, DKG reshares, and DKG or presigned exit requests. It contains a [NodeJS](https://nodejs.org) application that listens for `PoolDepositRequested`, `PoolReshareRequested`, and `PoolExitRequested` events, which then internally uses the [RockX DKG CLI and messenger server](https://github.com/rockx/rockx-dkg-cli) to initiate and retrieve operator group DKG results. The `PoolDepositRequested` event starts a new DKG keygen and retrieves the results to submit a new validator via `initiatePoolDeposit`. The `PoolReshareRequested` event starts a new DKG reshare and retrieves the results to update an existing validator via `resharePool`. The `PoolExitRequested` event starts a new DKG exit and retrieves the results to submit a signed exit message directly to the Beacon chain. + +DKG operations and reports will theoretically have [verifiable](https://docs.obol.tech/docs/next/charon/dkg#dkg-verification) aspects that prove fair DKG ceremonies. + +> 🚩 The deployment strategy, including the API security, of this service is a WIP, and will be done in a way that allows for easy upgrades and/or replacement with a contract-native DKG trigger mechanism. Casimir is researching the best approach to trustless operations in collaboration with Chainlink, SSV, and RockX, and the @casimir/validators service will prioritize a combination of security and decentralization as much as possible. + +### Future + +In the future, some aspects of this oracle service may be improved, or become obsolete, as the underlying decentralized protocols evolve: + +- SSV contract-native, zero-coordination key operation triggers (with SSV DKG support) may augment or replace the DKG messenger server and the need for a single-instance oracle service +- Contract-native validator exit triggers may remove the need for presigned validator exit messages diff --git a/services/dkg/package.json b/services/validators/package.json similarity index 87% rename from services/dkg/package.json rename to services/validators/package.json index ff89ae967..1415fd45f 100644 --- a/services/dkg/package.json +++ b/services/validators/package.json @@ -1,7 +1,7 @@ { - "name": "@casimir/dkg", + "name": "@casimir/validators", "version": "0.0.1", - "description": "Casimir DKG oracle service", + "description": "Casimir validators oracle service", "main": "dist/index.js", "scripts": { "build": "tsc", diff --git a/services/dkg/scripts/clean.ts b/services/validators/scripts/clean.ts similarity index 100% rename from services/dkg/scripts/clean.ts rename to services/validators/scripts/clean.ts diff --git a/services/dkg/scripts/dev.ts b/services/validators/scripts/dev.ts similarity index 100% rename from services/dkg/scripts/dev.ts rename to services/validators/scripts/dev.ts diff --git a/services/dkg/src/index.ts b/services/validators/src/index.ts similarity index 100% rename from services/dkg/src/index.ts rename to services/validators/src/index.ts diff --git a/services/dkg/src/interfaces/CreateValidatorInput.ts b/services/validators/src/interfaces/CreateValidatorInput.ts similarity index 100% rename from services/dkg/src/interfaces/CreateValidatorInput.ts rename to services/validators/src/interfaces/CreateValidatorInput.ts diff --git a/services/dkg/src/interfaces/DKGOptions.ts b/services/validators/src/interfaces/DKGOptions.ts similarity index 100% rename from services/dkg/src/interfaces/DKGOptions.ts rename to services/validators/src/interfaces/DKGOptions.ts diff --git a/services/dkg/src/interfaces/DepositData.ts b/services/validators/src/interfaces/DepositData.ts similarity index 100% rename from services/dkg/src/interfaces/DepositData.ts rename to services/validators/src/interfaces/DepositData.ts diff --git a/services/dkg/src/interfaces/DepositDataInput.ts b/services/validators/src/interfaces/DepositDataInput.ts similarity index 100% rename from services/dkg/src/interfaces/DepositDataInput.ts rename to services/validators/src/interfaces/DepositDataInput.ts diff --git a/services/dkg/src/interfaces/HandlerInput.ts b/services/validators/src/interfaces/HandlerInput.ts similarity index 100% rename from services/dkg/src/interfaces/HandlerInput.ts rename to services/validators/src/interfaces/HandlerInput.ts diff --git a/services/dkg/src/interfaces/KeygenInput.ts b/services/validators/src/interfaces/KeygenInput.ts similarity index 100% rename from services/dkg/src/interfaces/KeygenInput.ts rename to services/validators/src/interfaces/KeygenInput.ts diff --git a/services/dkg/src/interfaces/ReshareInput.ts b/services/validators/src/interfaces/ReshareInput.ts similarity index 100% rename from services/dkg/src/interfaces/ReshareInput.ts rename to services/validators/src/interfaces/ReshareInput.ts diff --git a/services/dkg/src/interfaces/ReshareValidatorInput.ts b/services/validators/src/interfaces/ReshareValidatorInput.ts similarity index 100% rename from services/dkg/src/interfaces/ReshareValidatorInput.ts rename to services/validators/src/interfaces/ReshareValidatorInput.ts diff --git a/services/dkg/src/providers/config.ts b/services/validators/src/providers/config.ts similarity index 100% rename from services/dkg/src/providers/config.ts rename to services/validators/src/providers/config.ts diff --git a/services/dkg/src/providers/dkg.ts b/services/validators/src/providers/dkg.ts similarity index 100% rename from services/dkg/src/providers/dkg.ts rename to services/validators/src/providers/dkg.ts diff --git a/services/dkg/src/providers/events.ts b/services/validators/src/providers/events.ts similarity index 100% rename from services/dkg/src/providers/events.ts rename to services/validators/src/providers/events.ts diff --git a/services/dkg/src/providers/handlers.ts b/services/validators/src/providers/handlers.ts similarity index 100% rename from services/dkg/src/providers/handlers.ts rename to services/validators/src/providers/handlers.ts diff --git a/services/dkg/src/providers/iterables.ts b/services/validators/src/providers/iterables.ts similarity index 100% rename from services/dkg/src/providers/iterables.ts rename to services/validators/src/providers/iterables.ts diff --git a/services/dkg/tsconfig.json b/services/validators/tsconfig.json similarity index 100% rename from services/dkg/tsconfig.json rename to services/validators/tsconfig.json From 6acd3637a607a1ebbe6975fa795eaf051f919dcc Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Fri, 19 May 2023 23:58:09 -0400 Subject: [PATCH 35/78] Clean up submodules --- .gitmodules | 2 +- contracts/ethereum/docs/index.md | 6 ------ contracts/ethereum/helpers/{dkg.ts => validators.ts} | 0 contracts/ethereum/test/fixtures/shared.ts | 2 +- services/validators/scripts/resources/rockx-dkg-cli | 1 + 5 files changed, 3 insertions(+), 8 deletions(-) rename contracts/ethereum/helpers/{dkg.ts => validators.ts} (100%) create mode 160000 services/validators/scripts/resources/rockx-dkg-cli diff --git a/.gitmodules b/.gitmodules index b7eee3b6a..ae662684c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,6 +13,6 @@ [submodule "scripts/trezor/resources/trezor-user-env"] path = scripts/trezor/resources/trezor-user-env url = https://github.com/trezor/trezor-user-env.git -[submodule "services/keys/scripts/resources/rockx-dkg-cli"] +[submodule "services/validators/scripts/resources/rockx-dkg-cli"] path = services/validators/scripts/resources/rockx-dkg-cli url = https://github.com/RockX-SG/rockx-dkg-cli.git diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index e16f8760a..9a3d90e8d 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -180,12 +180,6 @@ Initiate the next ready pool | withdrawalCredentials | bytes | The withdrawal credentials | | feeAmount | uint256 | The fee amount | -### _getRevertMsg - -```solidity -function _getRevertMsg(bytes _returnData) internal pure returns (string) -``` - ### requestPoolExits ```solidity diff --git a/contracts/ethereum/helpers/dkg.ts b/contracts/ethereum/helpers/validators.ts similarity index 100% rename from contracts/ethereum/helpers/dkg.ts rename to contracts/ethereum/helpers/validators.ts diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 1662ee91c..57845f2e6 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -3,7 +3,7 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' import { deployContract } from '@casimir/ethereum/helpers/deploy' import { CasimirManager, CasimirUpkeep } from '@casimir/ethereum/build/artifacts/types' import { fulfillFunctionsRequest, runUpkeep } from '@casimir/ethereum/helpers/upkeep' -import { initiatePoolDepositHander } from '@casimir/ethereum/helpers/dkg' +import { initiatePoolDepositHander } from '@casimir/ethereum/helpers/validators' import { round } from '@casimir/ethereum/helpers/math' import { ContractConfig, DeploymentConfig } from '@casimir/types' diff --git a/services/validators/scripts/resources/rockx-dkg-cli b/services/validators/scripts/resources/rockx-dkg-cli new file mode 160000 index 000000000..a64cc0c51 --- /dev/null +++ b/services/validators/scripts/resources/rockx-dkg-cli @@ -0,0 +1 @@ +Subproject commit a64cc0c510d50eaa45b6d7c00ecd029a6b7d0923 From 6db309e4c2889f5a06394ca1e862b7cebe18e1c6 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Sat, 20 May 2023 16:50:41 -0400 Subject: [PATCH 36/78] Fix helper method name typo --- contracts/ethereum/helpers/validators.ts | 2 +- contracts/ethereum/test/fixtures/shared.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/ethereum/helpers/validators.ts b/contracts/ethereum/helpers/validators.ts index 10574b829..5a7d3cd04 100644 --- a/contracts/ethereum/helpers/validators.ts +++ b/contracts/ethereum/helpers/validators.ts @@ -9,7 +9,7 @@ const mockValidators: Validator[] = Object.values(validatorStore) const mockFee = 0.1 -export async function initiatePoolDepositHander({ manager, signer, index }: { manager: CasimirManager, signer: SignerWithAddress, index: number }) { +export async function initiatePoolDepositHandler({ manager, signer, index }: { manager: CasimirManager, signer: SignerWithAddress, index: number }) { const { depositDataRoot, publicKey, diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 57845f2e6..d2dc67c39 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -3,7 +3,7 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' import { deployContract } from '@casimir/ethereum/helpers/deploy' import { CasimirManager, CasimirUpkeep } from '@casimir/ethereum/build/artifacts/types' import { fulfillFunctionsRequest, runUpkeep } from '@casimir/ethereum/helpers/upkeep' -import { initiatePoolDepositHander } from '@casimir/ethereum/helpers/validators' +import { initiatePoolDepositHandler } from '@casimir/ethereum/helpers/validators' import { round } from '@casimir/ethereum/helpers/math' import { ContractConfig, DeploymentConfig } from '@casimir/types' @@ -108,7 +108,7 @@ export async function secondUserDepositFixture() { /** Initiate next ready pool */ const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length - await initiatePoolDepositHander({ manager, signer: dkg, index: nextValidatorIndex }) + await initiatePoolDepositHandler({ manager, signer: dkg, index: nextValidatorIndex }) /** Run upkeep */ const ranUpkeep = await runUpkeep({ upkeep, keeper }) @@ -209,7 +209,7 @@ export async function thirdUserDepositFixture() { /** Initiate next ready pool */ const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length - await initiatePoolDepositHander({ manager, signer: dkg, index: nextValidatorIndex }) + await initiatePoolDepositHandler({ manager, signer: dkg, index: nextValidatorIndex }) /** Run upkeep */ const ranUpkeep = await runUpkeep({ upkeep, keeper }) @@ -324,7 +324,7 @@ export async function fourthUserDepositFixture() { /** Initiate next ready pools (2) */ for (let i = 0; i < 2; i++) { const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length - await initiatePoolDepositHander({ manager, signer: dkg, index: nextValidatorIndex }) + await initiatePoolDepositHandler({ manager, signer: dkg, index: nextValidatorIndex }) } /** Run upkeep */ From fe3416673cf62c19a09b0f41a8c8b0d63f3adbd6 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Sat, 20 May 2023 18:17:47 -0400 Subject: [PATCH 37/78] Improve cluster event filters --- common/ssv/src/providers/clusters.ts | 58 +++++++++------------ contracts/ethereum/src/CasimirManager.sol | 9 ---- services/validators/src/providers/events.ts | 4 +- 3 files changed, 27 insertions(+), 44 deletions(-) diff --git a/common/ssv/src/providers/clusters.ts b/common/ssv/src/providers/clusters.ts index 689bdbc94..506526d86 100644 --- a/common/ssv/src/providers/clusters.ts +++ b/common/ssv/src/providers/clusters.ts @@ -30,47 +30,41 @@ export async function getCluster(input: ClusterInput): Promise { 'ClusterReactivated' ] - // Todo create query filter for events - + const eventFilters = eventList.map(event => ssv.filters[event](withdrawalAddress)) let fromBlock = latestBlockNumber - step let toBlock = latestBlockNumber while (!cluster && fromBlock > 0) { try { - const result = await ssv.queryFilter('*', fromBlock, toBlock) + const items = (await Promise.all( + eventFilters.map(async eventFilter => { + return await ssv.queryFilter(eventFilter, fromBlock, toBlock) + }) + )).flat() - for (const item of result) { - const { args, blockNumber, event } = item + for (const item of items) { + const { args, blockNumber } = item - try { - const checkClusterEvent = eventList.map(e => e.split('(')[0]).includes(event as string) - if (!checkClusterEvent) continue - const checkOwner = args?.owner === withdrawalAddress - if (!checkOwner) continue - const checkOperators = JSON.stringify(args?.operatorIds.map((value: string) => Number(value))) === JSON.stringify(operatorIds) - if (!checkOperators) continue - const checkCluster = args?.cluster !== undefined - if (!checkCluster) continue + const clusterMatch = args?.cluster !== undefined + const operatorsMatch = JSON.stringify(args?.operatorIds.map((value: string) => Number(value))) === JSON.stringify(operatorIds) + if (!clusterMatch || !operatorsMatch) continue - if (blockNumber > biggestBlockNumber) { - biggestBlockNumber = blockNumber - const [ - validatorCount, - networkFeeIndex, - index, - balance, - active - ] = args.cluster - cluster = { - validatorCount, - networkFeeIndex, - index, - balance, - active - } + if (blockNumber > biggestBlockNumber) { + biggestBlockNumber = blockNumber + const [ + validatorCount, + networkFeeIndex, + index, + balance, + active + ] = args.cluster + cluster = { + validatorCount, + networkFeeIndex, + index, + balance, + active } - } catch (e) { - console.error('ERROR FILTERING CLUSTER EVENTS', e) } } toBlock = fromBlock diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index 0163604db..947d6f0e3 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -684,7 +684,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ethFeePercent = _ethFeePercent; linkFeePercent = _linkFeePercent; ssvFeePercent = _ssvFeePercent; - // If new sum total, also set estimated block to use new percentages for swept rewards } /** @@ -828,14 +827,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { return exitingValidatorCount; } - /** - * @notice Get a list of all filled pool IDs - * @return A list of all filled pool IDs - */ - function getFilledPoolIds() external view returns (uint32[] memory) { - return readyPoolIds; - } - /** * @notice Get a list of all ready pool IDs * @return A list of all ready pool IDs diff --git a/services/validators/src/providers/events.ts b/services/validators/src/providers/events.ts index 40bdf3bc5..f15ff67d9 100644 --- a/services/validators/src/providers/events.ts +++ b/services/validators/src/providers/events.ts @@ -12,7 +12,5 @@ export function getEventEmitter({ manager, events }: { manager: ethers.Contract, } function getEvent({ manager, event }: { manager: ethers.Contract, event: string }) { - const eventEmitter = new EventEmitter() - manager.on(event, (...args: any[]) => eventEmitter.emit(event, ...args)) - return on(eventEmitter, event) + return on(manager as ethers.Contract & EventEmitter, event) } \ No newline at end of file From 4cce21d7dd9638c83d7cb3fb820f03d32bd891b8 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Fri, 26 May 2023 17:20:03 -0400 Subject: [PATCH 38/78] Add exit completion handling (tests failing) --- .github/workflows/release.yml | 1 + .gitmodules | 6 +- apps/web/src/composables/ssv.ts | 2 +- common/ssv/src/providers/clusters.ts | 39 +- contracts/ethereum/docs/index.md | 34 +- .../ethereum/functions/API-request-source.js | 10 +- .../FunctionsSandboxLibrary/Functions.js | 0 .../FunctionsSandboxLibrary/Log.js | 0 .../FunctionsSandboxLibrary/Sandbox.js | 0 .../FunctionsSandboxLibrary/Validator.js | 0 .../FunctionsSandboxLibrary/buildRequest.js | 0 .../FunctionsSandboxLibrary/encryptSecrets.js | 0 .../getRequestConfig.js | 0 .../FunctionsSandboxLibrary/handler.js | 0 .../FunctionsSandboxLibrary/index.js | 0 .../simulateRequest.js | 0 contracts/ethereum/hardhat.config.ts | 16 +- contracts/ethereum/helpers/oracle.ts | 67 ++ contracts/ethereum/helpers/upkeep.ts | 109 ++- contracts/ethereum/helpers/validators.ts | 37 - contracts/ethereum/scripts/dev.ts | 133 ++-- .../ethereum/scripts/resources/ssv-network | 1 + contracts/ethereum/scripts/test.ts | 2 +- contracts/ethereum/src/CasimirDAO.sol | 156 +++++ contracts/ethereum/src/CasimirManager.sol | 634 ++++++++++-------- contracts/ethereum/src/CasimirRecipient.sol | 20 + contracts/ethereum/src/CasimirRegistry.sol | 116 ++++ contracts/ethereum/src/CasimirUpkeep.sol | 201 +++--- .../ethereum/src/interfaces/ICasimirDAO.sol | 61 ++ .../src/interfaces/ICasimirManager.sol | 73 +- .../src/interfaces/ICasimirRecipient.sol | 4 + .../src/interfaces/ICasimirRegistry.sol | 27 + .../src/interfaces/ICasimirUpkeep.sol | 30 +- .../ethereum/src/mock/MockFunctionsOracle.sol | 3 +- .../src/vendor/interfaces/ISSVNetwork.sol | 290 +------- .../src/vendor/interfaces/ISSVNetworkCore.sol | 84 +-- .../vendor/interfaces/ISSVNetworkViews.sol | 4 + contracts/ethereum/test/fixtures/shared.ts | 624 ++++++++--------- contracts/ethereum/test/integration.ts | 45 +- contracts/ethereum/test/packing.ts | 17 + package-lock.json | 64 +- scripts/ethereum/dev.ts | 4 +- scripts/local/dev.ts | 2 +- services/{validators => oracle}/.gitignore | 0 services/{validators => oracle}/README.md | 4 +- services/{validators => oracle}/package.json | 4 +- .../{validators => oracle}/scripts/clean.ts | 0 .../{validators => oracle}/scripts/dev.ts | 0 .../scripts/resources/rockx-dkg-cli | 0 services/{validators => oracle}/src/index.ts | 2 +- .../src/interfaces/CreateValidatorInput.ts | 0 .../src/interfaces/DKGOptions.ts | 0 .../src/interfaces/DepositData.ts | 0 .../src/interfaces/DepositDataInput.ts | 0 .../src/interfaces/HandlerInput.ts | 0 .../src/interfaces/KeygenInput.ts | 0 .../src/interfaces/ReshareInput.ts | 0 .../src/interfaces/ReshareValidatorInput.ts | 0 .../src/providers/config.ts | 0 .../src/providers/dkg.ts | 0 .../src/providers/events.ts | 0 .../src/providers/handlers.ts | 10 +- .../src/providers/iterables.ts | 0 services/{validators => oracle}/tsconfig.json | 0 64 files changed, 1604 insertions(+), 1332 deletions(-) rename contracts/ethereum/{src/vendor => functions}/FunctionsSandboxLibrary/Functions.js (100%) rename contracts/ethereum/{src/vendor => functions}/FunctionsSandboxLibrary/Log.js (100%) rename contracts/ethereum/{src/vendor => functions}/FunctionsSandboxLibrary/Sandbox.js (100%) rename contracts/ethereum/{src/vendor => functions}/FunctionsSandboxLibrary/Validator.js (100%) rename contracts/ethereum/{src/vendor => functions}/FunctionsSandboxLibrary/buildRequest.js (100%) rename contracts/ethereum/{src/vendor => functions}/FunctionsSandboxLibrary/encryptSecrets.js (100%) rename contracts/ethereum/{src/vendor => functions}/FunctionsSandboxLibrary/getRequestConfig.js (100%) rename contracts/ethereum/{src/vendor => functions}/FunctionsSandboxLibrary/handler.js (100%) rename contracts/ethereum/{src/vendor => functions}/FunctionsSandboxLibrary/index.js (100%) rename contracts/ethereum/{src/vendor => functions}/FunctionsSandboxLibrary/simulateRequest.js (100%) create mode 100644 contracts/ethereum/helpers/oracle.ts delete mode 100644 contracts/ethereum/helpers/validators.ts create mode 160000 contracts/ethereum/scripts/resources/ssv-network create mode 100644 contracts/ethereum/src/CasimirDAO.sol create mode 100644 contracts/ethereum/src/CasimirRecipient.sol create mode 100644 contracts/ethereum/src/CasimirRegistry.sol create mode 100644 contracts/ethereum/src/interfaces/ICasimirDAO.sol create mode 100644 contracts/ethereum/src/interfaces/ICasimirRecipient.sol create mode 100644 contracts/ethereum/src/interfaces/ICasimirRegistry.sol create mode 100644 contracts/ethereum/src/vendor/interfaces/ISSVNetworkViews.sol create mode 100644 contracts/ethereum/test/packing.ts rename services/{validators => oracle}/.gitignore (100%) rename services/{validators => oracle}/README.md (92%) rename services/{validators => oracle}/package.json (87%) rename services/{validators => oracle}/scripts/clean.ts (100%) rename services/{validators => oracle}/scripts/dev.ts (100%) rename services/{validators => oracle}/scripts/resources/rockx-dkg-cli (100%) rename services/{validators => oracle}/src/index.ts (97%) rename services/{validators => oracle}/src/interfaces/CreateValidatorInput.ts (100%) rename services/{validators => oracle}/src/interfaces/DKGOptions.ts (100%) rename services/{validators => oracle}/src/interfaces/DepositData.ts (100%) rename services/{validators => oracle}/src/interfaces/DepositDataInput.ts (100%) rename services/{validators => oracle}/src/interfaces/HandlerInput.ts (100%) rename services/{validators => oracle}/src/interfaces/KeygenInput.ts (100%) rename services/{validators => oracle}/src/interfaces/ReshareInput.ts (100%) rename services/{validators => oracle}/src/interfaces/ReshareValidatorInput.ts (100%) rename services/{validators => oracle}/src/providers/config.ts (100%) rename services/{validators => oracle}/src/providers/dkg.ts (100%) rename services/{validators => oracle}/src/providers/events.ts (100%) rename services/{validators => oracle}/src/providers/handlers.ts (98%) rename services/{validators => oracle}/src/providers/iterables.ts (100%) rename services/{validators => oracle}/tsconfig.json (100%) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1f4bd11cb..999223c3f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -46,6 +46,7 @@ jobs: - name: Create Pull Request uses: peter-evans/create-pull-request@v3 with: + base: develop branch: master reviewers: robosupport token: ${{ github.token }} diff --git a/.gitmodules b/.gitmodules index ae662684c..6300cefb5 100644 --- a/.gitmodules +++ b/.gitmodules @@ -14,5 +14,9 @@ path = scripts/trezor/resources/trezor-user-env url = https://github.com/trezor/trezor-user-env.git [submodule "services/validators/scripts/resources/rockx-dkg-cli"] - path = services/validators/scripts/resources/rockx-dkg-cli + path = services/oracle/scripts/resources/rockx-dkg-cli url = https://github.com/RockX-SG/rockx-dkg-cli.git +[submodule "contracts/ethereum/scripts/resources/ssv-network"] + path = contracts/ethereum/scripts/resources/ssv-network + url = https://github.com/bloxapp/ssv-network.git + branch = contract-v3 diff --git a/apps/web/src/composables/ssv.ts b/apps/web/src/composables/ssv.ts index 938b4464c..4db734d06 100644 --- a/apps/web/src/composables/ssv.ts +++ b/apps/web/src/composables/ssv.ts @@ -64,7 +64,7 @@ export default function useSSV() { const { user } = useUsers() const provider = new ethers.providers.JsonRpcProvider(ethereumURL) const userStake = await manager.connect(provider).getUserStake(address) // to get user's stake balance - const poolStake = await manager.connect(provider).getStake() // to get total stake balance + const poolStake = await manager.connect(provider).getTotalStake() // to get total stake balance const poolIds = readyOrStake === 'ready' ? await manager.connect(provider).getReadyPoolIds() : await manager.connect(provider).getStakedPoolIds() // to get ready (open) pool IDs OR to get staked (active) pool IDs console.log('userStake :>> ', ethers.utils.formatEther(userStake)) diff --git a/common/ssv/src/providers/clusters.ts b/common/ssv/src/providers/clusters.ts index 506526d86..e4be8482d 100644 --- a/common/ssv/src/providers/clusters.ts +++ b/common/ssv/src/providers/clusters.ts @@ -1,8 +1,20 @@ import { ethers } from 'ethers' import { Cluster } from '@casimir/types' -import ISSVNetworkJson from '@casimir/ethereum/build/artifacts/src/vendor/interfaces/ISSVNetwork.sol/ISSVNetwork.json' +import SSVNetworkJson from '@casimir/ethereum/build/artifacts/scripts/resources/ssv-network/contracts/SSVNetwork.sol/SSVNetwork.json' import { ClusterInput } from '../interfaces/ClusterInput' +const DAY = 5400 +const WEEK = DAY * 7 +const MONTH = DAY * 30 +const eventList = [ + 'ClusterDeposited', + 'ClusterWithdrawn', + 'ValidatorAdded', + 'ValidatorRemoved', + 'ClusterLiquidated', + 'ClusterReactivated' +] + /** * Get cluster snapshot * @param {ClusterInput} input - Operator IDs and withdrawal address @@ -11,28 +23,15 @@ import { ClusterInput } from '../interfaces/ClusterInput' export async function getCluster(input: ClusterInput): Promise { const { provider, networkAddress, operatorIds, withdrawalAddress } = input - const ssv = new ethers.Contract(networkAddress, ISSVNetworkJson.abi, provider) - - const DAY = 5400 - const WEEK = DAY * 7 - const MONTH = DAY * 30 - const latestBlockNumber = await provider.getBlockNumber() - let step = MONTH - let cluster: Cluster | undefined - let biggestBlockNumber = 0 - - const eventList = [ - 'ClusterDeposited', - 'ClusterWithdrawn', - 'ValidatorAdded', - 'ValidatorRemoved', - 'ClusterLiquidated', - 'ClusterReactivated' - ] - + const ssv = new ethers.Contract(networkAddress, SSVNetworkJson.abi, provider) const eventFilters = eventList.map(event => ssv.filters[event](withdrawalAddress)) + + let step = MONTH + const latestBlockNumber = await provider.getBlockNumber() let fromBlock = latestBlockNumber - step let toBlock = latestBlockNumber + let biggestBlockNumber = 0 + let cluster: Cluster | undefined while (!cluster && fromBlock > 0) { try { diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 9a3d90e8d..ae55d6a13 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -272,7 +272,7 @@ Update the functions oracle address ### getStake ```solidity -function getStake() public view returns (uint256 stake) +function getTotalStake() public view returns (uint256 stake) ``` Get the manager stake @@ -443,10 +443,10 @@ Get the pending withdrawal queue | ---- | ---- | ----------- | | [0] | struct ICasimirManager.Withdrawal[] | pendingWithdrawalQueue The pending withdrawal queue | -### getValidatorPublicKeys +### getDepositedPoolCount ```solidity -function getValidatorPublicKeys() external view returns (bytes[]) +function getDepositedPoolCount() external view returns (bytes[]) ``` Get validator public keys @@ -457,10 +457,10 @@ Get validator public keys | ---- | ---- | ----------- | | [0] | bytes[] | A list of pending and active validator public keys | -### getExitingValidatorCount +### getExitingPoolCount ```solidity -function getExitingValidatorCount() external view returns (uint256) +function getExitingPoolCount() external view returns (uint256) ``` Get the count of exiting validators @@ -471,20 +471,6 @@ Get the count of exiting validators | ---- | ---- | ----------- | | [0] | uint256 | The count of exiting validators | -### getFilledPoolIds - -```solidity -function getFilledPoolIds() external view returns (uint32[]) -``` - -Get a list of all filled pool IDs - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32[] | A list of all filled pool IDs | - ### getReadyPoolIds ```solidity @@ -1015,16 +1001,16 @@ function getLINKFeePercent() external view returns (uint32) function getSSVFeePercent() external view returns (uint32) ``` -### getValidatorPublicKeys +### getDepositedPoolCount ```solidity -function getValidatorPublicKeys() external view returns (bytes[]) +function getDepositedPoolCount() external view returns (bytes[]) ``` -### getExitingValidatorCount +### getExitingPoolCount ```solidity -function getExitingValidatorCount() external view returns (uint256) +function getExitingPoolCount() external view returns (uint256) ``` ### getReadyPoolIds @@ -1048,7 +1034,7 @@ function getStakedPoolIds() external view returns (uint32[]) ### getStake ```solidity -function getStake() external view returns (uint256) +function getTotalStake() external view returns (uint256) ``` ### getBufferedStake diff --git a/contracts/ethereum/functions/API-request-source.js b/contracts/ethereum/functions/API-request-source.js index 2794b57cb..d7f42a7ec 100644 --- a/contracts/ethereum/functions/API-request-source.js +++ b/contracts/ethereum/functions/API-request-source.js @@ -1,5 +1,11 @@ // Arguments can be provided when a request is initated on-chain and used in the request source code as shown below +// const getSweptBalance = ethers.utils.id('getSweptBalance()').slice(0, 10) +// console.log(getSweptBalance) + +// const getDepositedPoolCount = ethers.utils.id('getDepositedPoolCount()').slice(0, 10) +// console.log(getDepositedPoolCount) + function repeat(str, num) { if (str.length === 0 || num <= 1) { if (num === 1) { @@ -33,7 +39,7 @@ const managerAddress = "0x07e05700cb4e946ba50244e27f01805354cd8ef0" // We want to get a string (not bytes) array of length of the number of validators // See PoR Address List -const getValidatorPublicKeys = "0xeab1442e" +const getDepositedPoolCount = "0xeab1442e" const getPublicKeys = await Functions.makeHttpRequest({ url: 'http://localhost:8545', @@ -43,7 +49,7 @@ const getPublicKeys = await Functions.makeHttpRequest({ method: 'eth_call', params: [{ to: managerAddress, - data: getValidatorPublicKeys + data: getDepositedPoolCount }, 'latest'], id: 1 } diff --git a/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/Functions.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/Functions.js similarity index 100% rename from contracts/ethereum/src/vendor/FunctionsSandboxLibrary/Functions.js rename to contracts/ethereum/functions/FunctionsSandboxLibrary/Functions.js diff --git a/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/Log.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/Log.js similarity index 100% rename from contracts/ethereum/src/vendor/FunctionsSandboxLibrary/Log.js rename to contracts/ethereum/functions/FunctionsSandboxLibrary/Log.js diff --git a/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/Sandbox.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/Sandbox.js similarity index 100% rename from contracts/ethereum/src/vendor/FunctionsSandboxLibrary/Sandbox.js rename to contracts/ethereum/functions/FunctionsSandboxLibrary/Sandbox.js diff --git a/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/Validator.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/Validator.js similarity index 100% rename from contracts/ethereum/src/vendor/FunctionsSandboxLibrary/Validator.js rename to contracts/ethereum/functions/FunctionsSandboxLibrary/Validator.js diff --git a/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/buildRequest.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/buildRequest.js similarity index 100% rename from contracts/ethereum/src/vendor/FunctionsSandboxLibrary/buildRequest.js rename to contracts/ethereum/functions/FunctionsSandboxLibrary/buildRequest.js diff --git a/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/encryptSecrets.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/encryptSecrets.js similarity index 100% rename from contracts/ethereum/src/vendor/FunctionsSandboxLibrary/encryptSecrets.js rename to contracts/ethereum/functions/FunctionsSandboxLibrary/encryptSecrets.js diff --git a/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/getRequestConfig.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/getRequestConfig.js similarity index 100% rename from contracts/ethereum/src/vendor/FunctionsSandboxLibrary/getRequestConfig.js rename to contracts/ethereum/functions/FunctionsSandboxLibrary/getRequestConfig.js diff --git a/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/handler.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/handler.js similarity index 100% rename from contracts/ethereum/src/vendor/FunctionsSandboxLibrary/handler.js rename to contracts/ethereum/functions/FunctionsSandboxLibrary/handler.js diff --git a/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/index.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/index.js similarity index 100% rename from contracts/ethereum/src/vendor/FunctionsSandboxLibrary/index.js rename to contracts/ethereum/functions/FunctionsSandboxLibrary/index.js diff --git a/contracts/ethereum/src/vendor/FunctionsSandboxLibrary/simulateRequest.js b/contracts/ethereum/functions/FunctionsSandboxLibrary/simulateRequest.js similarity index 100% rename from contracts/ethereum/src/vendor/FunctionsSandboxLibrary/simulateRequest.js rename to contracts/ethereum/functions/FunctionsSandboxLibrary/simulateRequest.js diff --git a/contracts/ethereum/hardhat.config.ts b/contracts/ethereum/hardhat.config.ts index 71f480b80..ad14be8eb 100644 --- a/contracts/ethereum/hardhat.config.ts +++ b/contracts/ethereum/hardhat.config.ts @@ -25,9 +25,9 @@ const forkingChainId = { mainnet: 1, goerli: 5 }[forkingNetwork] const externalEnv = { mainnet: { + ORACLE_ADDRESS: '0x0000000000000000000000000000000000000000', BEACON_DEPOSIT_ADDRESS: '0x00000000219ab540356cBB839Cbe05303d7705Fa', - DKG_ORACLE_ADDRESS: '0x0000000000000000000000000000000000000000', - FUNCTIONS_ORACLE_ADDRESS: '0x0000000000000000000000000000000000000000', + FUNCTIONS_ADDRESS: '0x0000000000000000000000000000000000000000', FUNCTIONS_SUBSCRIPTION_ID: '1', LINK_TOKEN_ADDRESS: '0x514910771AF9Ca656af840dff83E8264EcF986CA', SSV_NETWORK_ADDRESS: '0x0000000000000000000000000000000000000000', @@ -37,9 +37,9 @@ const externalEnv = { WETH_TOKEN_ADDRESS: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2' }, goerli: { + ORACLE_ADDRESS: '0x0000000000000000000000000000000000000000', BEACON_DEPOSIT_ADDRESS: '0x07b39F4fDE4A38bACe212b546dAc87C58DfE3fDC', - DKG_ORACLE_ADDRESS: '0x0000000000000000000000000000000000000000', - FUNCTIONS_ORACLE_ADDRESS: '0x3de1bE9407645533CD0CbeCf88dFE5297E7125e6', + FUNCTIONS_ADDRESS: '0x3de1bE9407645533CD0CbeCf88dFE5297E7125e6', FUNCTIONS_SUBSCRIPTION_ID: '1', LINK_TOKEN_ADDRESS: '0x326C977E6efc84E512bB9C30f76E30c160eD06FB', SSV_NETWORK_ADDRESS: '0xAfdb141Dd99b5a101065f40e3D7636262dce65b3', @@ -84,7 +84,7 @@ const config: HardhatUserConfig = { }, networks: { hardhat: { - accounts: mnemonic ? { ...hid, accountsBalance: '10000000000000000000000' } : undefined, + accounts: mnemonic ? hid : undefined, chainId: forkingChainId || 1337, forking: forkingUrl ? { url: forkingUrl } : undefined, mining: miningInterval ? mining : { auto: true }, @@ -93,19 +93,19 @@ const config: HardhatUserConfig = { gasPrice: 'auto' }, ganache: { - accounts: mnemonic ? { ...hid } : undefined, + accounts: mnemonic ? hid : undefined, url: 'http://127.0.0.1:8545', allowUnlimitedContractSize: true }, mainnet: { - accounts: mnemonic ? { ...hid } : undefined, + accounts: mnemonic ? hid : undefined, url: hardhatUrl || '', allowUnlimitedContractSize: true, gas: 'auto', gasPrice: 'auto' }, goerli: { - accounts: mnemonic ? { ...hid } : undefined, + accounts: mnemonic ? hid : undefined, url: hardhatUrl || '', allowUnlimitedContractSize: true, gas: 'auto', diff --git a/contracts/ethereum/helpers/oracle.ts b/contracts/ethereum/helpers/oracle.ts new file mode 100644 index 000000000..bd3f5c7ff --- /dev/null +++ b/contracts/ethereum/helpers/oracle.ts @@ -0,0 +1,67 @@ +import { ethers } from 'hardhat' +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' +import { CasimirManager } from '../build/artifacts/types' +import { validatorStore } from '@casimir/data' +import { Validator } from '@casimir/types' +import { getCluster } from '@casimir/ssv' + +const mockValidators: Validator[] = Object.values(validatorStore) + +const mockFee = 0.1 + +export async function initiatePoolDepositHandler({ manager, signer, id }: { manager: CasimirManager, signer: SignerWithAddress, id: number }) { + const { + depositDataRoot, + publicKey, + signature, + withdrawalCredentials, + operatorIds, + shares, + cluster: _cluster + } = mockValidators[id] + + let cluster + + if (id === 1) { + cluster = _cluster + } else { + const networkAddress = await manager.getSSVNetworkAddress() + const withdrawalAddress = manager.address + cluster = await getCluster({ provider: ethers.provider, networkAddress, operatorIds, withdrawalAddress }) + } + + const initiatePool = await manager.connect(signer).initiatePoolDeposit( + depositDataRoot, + publicKey, + signature, + withdrawalCredentials, + operatorIds, + shares, + cluster, + ethers.utils.parseEther(mockFee.toString()) // Mock fee amount estimate ~ 10 SSV + ) + await initiatePool.wait() +} + +export async function completePoolExitHandler({ manager, signer, id }: { manager: CasimirManager, signer: SignerWithAddress, id: number }) { + const stakedPoolIds = await manager.getStakedPoolIds() + const poolIndex = stakedPoolIds.findIndex((poolId: number) => poolId === id) + const pool = await manager.getPool(id) + const operatorIds = pool.operatorIds.map((operatorId) => operatorId.toNumber()) + + // Todo unhardcode + const finalEffectiveBalance = ethers.utils.parseEther('32') + const blamePercents = [0, 0, 0, 0] + + const networkAddress = await manager.getSSVNetworkAddress() + const withdrawalAddress = manager.address + const cluster = await getCluster({ provider: ethers.provider, networkAddress, operatorIds, withdrawalAddress }) + + const initiatePool = await manager.connect(signer).completePoolExit( + poolIndex, + finalEffectiveBalance, + blamePercents, + cluster + ) + await initiatePool.wait() +} \ No newline at end of file diff --git a/contracts/ethereum/helpers/upkeep.ts b/contracts/ethereum/helpers/upkeep.ts index 6490923b3..20ca1d90d 100644 --- a/contracts/ethereum/helpers/upkeep.ts +++ b/contracts/ethereum/helpers/upkeep.ts @@ -1,6 +1,50 @@ import { ethers } from 'hardhat' import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import { CasimirUpkeep } from '../build/artifacts/types' +import { CasimirManager, CasimirUpkeep } from '../build/artifacts/types' + +export enum RequestType { + BALANCE = 0, + DEPOSITS = 1, + EXITS = 2, + SLASHES = 3 +} + +export async function performReport({ + manager, + upkeep, + keeper, + values, + requestId +}: { + manager: CasimirManager, + upkeep: CasimirUpkeep, + keeper: SignerWithAddress, + values: number[], + requestId: number +}) { + await runUpkeep({ upkeep, keeper }) + + for (let i = 0; i < values.length; i++) { + const value = values[i] + const checkBalance = i == RequestType.BALANCE + const checkDeposits = i == RequestType.DEPOSITS && (await manager.getPendingPoolIds()).length > 0 + const checkExits = i == RequestType.EXITS && (await manager.getExitingPoolCount()).toNumber() > 0 + const checkSlashes = i == RequestType.SLASHES + if (checkBalance || checkDeposits || checkExits || checkSlashes) { + requestId++ + await fulfillFunctionsRequest({ + upkeep, + keeper, + value: checkBalance ? ethers.utils.parseEther(value.toString()).toString() : value.toString(), + requestId + }) + } + } + + await runUpkeep({ upkeep, keeper }) + + return requestId +} export async function runUpkeep({ upkeep, keeper @@ -10,8 +54,9 @@ export async function runUpkeep({ let ranUpkeep = false const checkData = ethers.utils.toUtf8Bytes('') const { ...check } = await upkeep.connect(keeper).checkUpkeep(checkData) - const { upkeepNeeded, performData } = check + const { upkeepNeeded } = check if (upkeepNeeded) { + const performData = ethers.utils.toUtf8Bytes('') const performUpkeep = await upkeep.connect(keeper).performUpkeep(performData) await performUpkeep.wait() ranUpkeep = true @@ -20,40 +65,44 @@ export async function runUpkeep({ } export async function fulfillFunctionsRequest({ - upkeep, keeper, nextActiveBalanceAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount + upkeep, + keeper, + value, + requestId }: { upkeep: CasimirUpkeep, keeper: SignerWithAddress, - nextActiveBalanceAmount: number, - nextSweptRewardsAmount: number, - nextSweptExitsAmount: number, - nextDepositedCount: number, - nextExitedCount: number + value: string, + requestId: number }) { - const activeBalanceAmount = ethers.utils.parseUnits(nextActiveBalanceAmount.toString(), 'gwei').toString() - const sweptRewardsAmount = ethers.utils.parseUnits(nextSweptRewardsAmount.toString(), 'gwei').toString() - const sweptExitsAmount = ethers.utils.parseUnits(nextSweptExitsAmount.toString(), 'gwei').toString() - const depositedCount = nextDepositedCount.toString() - const exitedCount = nextExitedCount.toString() - const requestId = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [1])) - const packedResponse = packResponse( - activeBalanceAmount, - sweptRewardsAmount, - sweptExitsAmount, - depositedCount, - exitedCount - ) - const responseBytes = ethers.utils.defaultAbiCoder.encode(['uint256'], [packedResponse.toString()]) + const requestIdHash = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [requestId])) + const response = ethers.BigNumber.from(value) + const responseBytes = ethers.utils.defaultAbiCoder.encode(['uint256'], [response.toString()]) const errorBytes = ethers.utils.toUtf8Bytes('') - const mockFulfillRequest = await upkeep.connect(keeper).mockFulfillRequest(requestId, responseBytes, errorBytes) + const mockFulfillRequest = await upkeep.connect(keeper).mockFulfillRequest(requestIdHash, responseBytes, errorBytes) await mockFulfillRequest.wait() } -function packResponse(activeBalanceAmount: string, sweptRewardsAmount: string, sweptExitsAmount: string, depositedCount: string, exitedCount: string) { - let packed = ethers.BigNumber.from(activeBalanceAmount) - packed = packed.or(ethers.BigNumber.from(sweptRewardsAmount).shl(64)) - packed = packed.or(ethers.BigNumber.from(sweptExitsAmount).shl(128)) - packed = packed.or(ethers.BigNumber.from(depositedCount).shl(192)) - packed = packed.or(ethers.BigNumber.from(exitedCount).shl(224)) +export function packResponse({ values, bits }: { values: string[], bits: number[] }) { + let packed = ethers.BigNumber.from('0') + values.forEach((value, i) => { + if (i === 0) { + console.log('active value', value) + packed = ethers.BigNumber.from(value) + } else { + const shift = bits.slice(0, i).reduce((a, b) => a + b, 0) + packed = packed.or(ethers.BigNumber.from(value).shl(shift)) + } + }) return packed -} \ No newline at end of file +} + +export function unpackResponse({ packed, bits }: { packed: string, bits: number[] }) { + return bits.map((_, i) => { + if (i === 0) { + return ethers.BigNumber.from(packed).and(ethers.BigNumber.from('0xFFFFFFFFFFFFFFFF')).toString() + } + const shift = bits.slice(0, i).reduce((a, b) => a + b, 0) + return ethers.BigNumber.from(packed).shr(shift).and(ethers.BigNumber.from('0xFFFFFFFFFFFFFFFF')).toString() + }) +} diff --git a/contracts/ethereum/helpers/validators.ts b/contracts/ethereum/helpers/validators.ts deleted file mode 100644 index 5a7d3cd04..000000000 --- a/contracts/ethereum/helpers/validators.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { ethers } from 'hardhat' -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import { CasimirManager } from '../build/artifacts/types' -import { validatorStore } from '@casimir/data' -import { Validator } from '@casimir/types' -import { getCluster } from '@casimir/ssv' - -const mockValidators: Validator[] = Object.values(validatorStore) - -const mockFee = 0.1 - -export async function initiatePoolDepositHandler({ manager, signer, index }: { manager: CasimirManager, signer: SignerWithAddress, index: number }) { - const { - depositDataRoot, - publicKey, - operatorIds, - shares, - signature, - withdrawalCredentials - } = mockValidators[index] - - const networkAddress = await manager.getSSVNetworkAddress() - const withdrawalAddress = manager.address - const cluster = await getCluster({ provider: ethers.provider, networkAddress, operatorIds, withdrawalAddress }) - - const initiatePool = await manager.connect(signer).initiatePoolDeposit( - depositDataRoot, - publicKey, - operatorIds, - shares, - cluster, - signature, - withdrawalCredentials, - ethers.utils.parseEther(mockFee.toString()) // Mock fee amount estimate ~ 10 SSV - ) - await initiatePool.wait() -} \ No newline at end of file diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 257be2760..b34d8847d 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -2,20 +2,21 @@ import { deployContract } from '@casimir/ethereum/helpers/deploy' import { ContractConfig, DeploymentConfig } from '@casimir/types' import { CasimirUpkeep, CasimirManager } from '@casimir/ethereum/build/artifacts/types' import { ethers } from 'hardhat' -import { fulfillFunctionsRequest, runUpkeep } from '@casimir/ethereum/helpers/upkeep' +import { performReport } from '@casimir/ethereum/helpers/upkeep' import { round } from '@casimir/ethereum/helpers/math' import EventEmitter, { on } from 'events' +import { time, setBalance } from '@nomicfoundation/hardhat-network-helpers' void async function () { - const [, , , , fourthUser, keeper, dkg] = await ethers.getSigners() + const [, , , , fourthUser, keeper, oracle] = await ethers.getSigners() let config: DeploymentConfig = { CasimirManager: { address: '', args: { + oracleAddress: oracle.address || process.env.ORACLE_ADDRESS, beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, - dkgOracleAddress: dkg.address || process.env.DKG_ORACLE_ADDRESS, - functionsOracleAddress: process.env.FUNCTIONS_ORACLE_ADDRESS, + functionsAddress: process.env.FUNCTIONS_ADDRESS, functionsSubscriptionId: process.env.FUNCTIONS_SUBSCRIPTION_ID, linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, @@ -67,89 +68,73 @@ void async function () { /** Stake 160 from the fourth user */ setTimeout(async () => { - const stakeAmount = 160 - const feePercent = await manager.getFeePercent() - const depositAmount = stakeAmount * ((100 + feePercent) / 100) + const depositAmount = 160 * ((100 + await manager.getFeePercent()) / 100) const stake = await manager.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await stake?.wait() }, 1000) - /** Perform upkeep and fulfill dkg answer after each pool is initiated by the local oracle */ - for await (const event of on(manager as unknown as EventEmitter, 'PoolDepositInitiated')) { - const [id, details] = event - console.log(`Pool ${id} initiated at block number ${details.blockNumber}`) - } - /** Simulate rewards per staked validator */ + let requestId = 0 const blocksPerReward = 50 const rewardPerValidator = 0.105 let lastRewardBlock = await ethers.provider.getBlockNumber() for await (const block of on(ethers.provider as unknown as EventEmitter, 'block')) { if (block - blocksPerReward === lastRewardBlock) { lastRewardBlock = block - const validatorCount = await manager.getValidatorPublicKeys() - if (validatorCount?.length) { - console.log(`Rewarding ${validatorCount.length} validators ${rewardPerValidator} each`) - const rewardAmount = rewardPerValidator * validatorCount.length - - /** Perform upkeep */ - const ranUpkeepBefore = await runUpkeep({ upkeep, keeper }) - - /** Fulfill functions request */ - if (ranUpkeepBefore) { - const nextActiveBalanceAmount = round( - parseFloat( - ethers.utils.formatEther( - (await manager.getActiveStake()).add((await manager.getPendingPoolIds()).length * 32) - ) - ) + rewardAmount - ) - const nextSweptRewardsAmount = 0 - const nextSweptExitsAmount = 0 - const nextDepositedCount = (await manager.getPendingPoolIds()).length - const nextExitedCount = 0 - - console.log('Fulfilling before sweep:') - console.log('nextActiveBalanceAmount', nextActiveBalanceAmount) - console.log('nextSweptRewardsAmount', nextSweptRewardsAmount) - console.log('nextSweptExitsAmount', nextSweptExitsAmount) - console.log('nextDepositedCount', nextDepositedCount) - console.log('nextExitedCount', nextExitedCount) - - await fulfillFunctionsRequest({ upkeep, keeper, nextActiveBalanceAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) - } + const depositedPoolCount = await manager.getDepositedPoolCount() + if (depositedPoolCount) { + console.log(`Rewarding ${depositedPoolCount} validators ${rewardPerValidator} each`) + await time.increase(time.duration.days(1)) + const rewardAmount = rewardPerValidator * depositedPoolCount.toNumber() + let nextActiveBalanceAmount = round( + parseFloat( + ethers.utils.formatEther( + (await manager.getLatestActiveBalance()).add((await manager.getPendingPoolIds()).length * 32) + ) + ) + rewardAmount + ) + let nextCompletedDeposits = (await manager.getPendingPoolIds()).length + let nextValues = [ + nextActiveBalanceAmount, // activeBalanceAmount + nextCompletedDeposits, // completedDeposits + 0, // completedExits + 0, // slashedExits + ] + requestId = await performReport({ + manager, + upkeep, + keeper, + values: nextValues, + requestId + }) /** Sweep rewards before next upkeep (balance will increment silently) */ - const sweep = await keeper.sendTransaction({ to: manager.address, value: ethers.utils.parseEther(rewardAmount.toString()) }) - await sweep.wait() - - /** Perform upkeep */ - const ranUpkeepAfter = await runUpkeep({ upkeep, keeper }) - - /** Fulfill functions request */ - if (ranUpkeepAfter) { - const nextActiveBalanceAmount = round( - parseFloat( - ethers.utils.formatEther( - (await manager.getActiveStake()).add((await manager.getPendingPoolIds()).length * 32) - ) - ) - rewardAmount - ) - const nextSweptRewardsAmount = rewardAmount - const nextSweptExitsAmount = 0 - const nextDepositedCount = (await manager.getPendingPoolIds()).length - const nextExitedCount = 0 - - console.log('Fulfilling after sweep:') - console.log('nextActiveBalanceAmount', nextActiveBalanceAmount) - console.log('nextSweptRewardsAmount', nextSweptRewardsAmount) - console.log('nextSweptExitsAmount', nextSweptExitsAmount) - console.log('nextDepositedCount', nextDepositedCount) - console.log('nextExitedCount', nextExitedCount) - - await fulfillFunctionsRequest({ upkeep, keeper, nextActiveBalanceAmount, nextSweptRewardsAmount, nextSweptExitsAmount, nextDepositedCount, nextExitedCount }) - } - + const currentBalance = await ethers.provider.getBalance(manager.address) + const nextBalance = currentBalance.add(ethers.utils.parseEther(rewardAmount.toString())) + await setBalance(manager.address, nextBalance) + + await time.increase(time.duration.days(1)) + nextActiveBalanceAmount = round( + parseFloat( + ethers.utils.formatEther( + (await manager.getLatestActiveBalance()).add((await manager.getPendingPoolIds()).length * 32) + ) + ) - rewardAmount + ) + nextCompletedDeposits = (await manager.getPendingPoolIds()).length + nextValues = [ + nextActiveBalanceAmount, // activeBalanceAmount + nextCompletedDeposits, // completedDeposits + 0, // completedExits + 0, // slashedExits + ] + requestId = await performReport({ + manager, + upkeep, + keeper, + values: nextValues, + requestId + }) } } } diff --git a/contracts/ethereum/scripts/resources/ssv-network b/contracts/ethereum/scripts/resources/ssv-network new file mode 160000 index 000000000..514884702 --- /dev/null +++ b/contracts/ethereum/scripts/resources/ssv-network @@ -0,0 +1 @@ +Subproject commit 514884702fbc2606688330d2913f46cd718b6c18 diff --git a/contracts/ethereum/scripts/test.ts b/contracts/ethereum/scripts/test.ts index d219059ea..960f25213 100644 --- a/contracts/ethereum/scripts/test.ts +++ b/contracts/ethereum/scripts/test.ts @@ -20,5 +20,5 @@ void async function () { await run('npm run build --workspace @casimir/ethereum') - run('mocha --require hardhat/register --recursive --exit --extension ts --timeout 60000') + run('npx mocha --require hardhat/register --recursive --exit --extension ts --timeout 60000') }() \ No newline at end of file diff --git a/contracts/ethereum/src/CasimirDAO.sol b/contracts/ethereum/src/CasimirDAO.sol new file mode 100644 index 000000000..24fbb4973 --- /dev/null +++ b/contracts/ethereum/src/CasimirDAO.sol @@ -0,0 +1,156 @@ +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; + +import './interfaces/ICasimirDAO.sol'; + +// Todo enable adding and removing owners + +contract CasimirDAO is ICasimirDAO { + + address[] public owners; + mapping(address => bool) public isOwner; + uint public numConfirmationsRequired; + + mapping(uint => mapping(address => bool)) public isConfirmed; + + Transaction[] public transactions; + + modifier onlyOwner() { + require(isOwner[msg.sender], "Not owner"); + _; + } + + modifier txExists(uint _txIndex) { + require(_txIndex < transactions.length, "TX does not exist"); + _; + } + + modifier notExecuted(uint _txIndex) { + require(!transactions[_txIndex].executed, "TX already executed"); + _; + } + + modifier notConfirmed(uint _txIndex) { + require(!isConfirmed[_txIndex][msg.sender], "TX already confirmed"); + _; + } + + constructor(address[] memory _owners, uint _numConfirmationsRequired) { + require(_owners.length > 0, "Owners required"); + require( + _numConfirmationsRequired > 0 && + _numConfirmationsRequired <= _owners.length, + "Invalid number of required confirmations" + ); + + for (uint i = 0; i < _owners.length; i++) { + address owner = _owners[i]; + + require(owner != address(0), "Invalid owner"); + require(!isOwner[owner], "Owner not unique"); + + isOwner[owner] = true; + owners.push(owner); + } + + numConfirmationsRequired = _numConfirmationsRequired; + } + + receive() external payable { + emit Deposit(msg.sender, msg.value, address(this).balance); + } + + function submitTransaction( + address _to, + uint _value, + bytes memory _data + ) public onlyOwner { + uint txIndex = transactions.length; + + transactions.push( + Transaction({ + to: _to, + value: _value, + data: _data, + executed: false, + numConfirmations: 0 + }) + ); + + emit SubmitTransaction(msg.sender, txIndex, _to, _value, _data); + } + + function confirmTransaction( + uint _txIndex + ) public onlyOwner txExists(_txIndex) notExecuted(_txIndex) notConfirmed(_txIndex) { + Transaction storage transaction = transactions[_txIndex]; + transaction.numConfirmations += 1; + isConfirmed[_txIndex][msg.sender] = true; + + emit ConfirmTransaction(msg.sender, _txIndex); + } + + function executeTransaction( + uint _txIndex + ) public onlyOwner txExists(_txIndex) notExecuted(_txIndex) { + Transaction storage transaction = transactions[_txIndex]; + + require( + transaction.numConfirmations >= numConfirmationsRequired, + "Cannot execute TX" + ); + + transaction.executed = true; + + (bool success, ) = transaction.to.call{value: transaction.value}( + transaction.data + ); + require(success, "TX failed"); + + emit ExecuteTransaction(msg.sender, _txIndex); + } + + function revokeConfirmation( + uint _txIndex + ) public onlyOwner txExists(_txIndex) notExecuted(_txIndex) { + Transaction storage transaction = transactions[_txIndex]; + + require(isConfirmed[_txIndex][msg.sender], "TX not confirmed"); + + transaction.numConfirmations -= 1; + isConfirmed[_txIndex][msg.sender] = false; + + emit RevokeConfirmation(msg.sender, _txIndex); + } + + function getOwners() public view returns (address[] memory) { + return owners; + } + + function getTransactionCount() public view returns (uint) { + return transactions.length; + } + + function getTransaction( + uint _txIndex + ) + public + view + returns ( + address to, + uint value, + bytes memory data, + bool executed, + uint numConfirmations + ) + { + Transaction storage transaction = transactions[_txIndex]; + return ( + transaction.to, + transaction.value, + transaction.data, + transaction.executed, + transaction.numConfirmations + ); + } +} \ No newline at end of file diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index 947d6f0e3..d8c86d146 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -55,8 +55,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /* Immutable */ /*************/ - /** DKG oracle address */ - address private immutable dkgOracleAddress; + /** Manager oracle address */ + address private immutable oracleAddress; /** Upkeep contract */ ICasimirUpkeep private immutable upkeep; /** Beacon deposit contract */ @@ -87,56 +87,68 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /* Dynamic State */ /********************/ - /** Latest active (consensus) balance */ - uint256 latestActiveBalance; - /** Latest active (consensus) stake after fees */ - uint256 latestActiveStake; + /** Latest active rewards */ + int256 private latestActiveRewards; + /** Latest active balance */ + uint256 private latestActiveBalance; + /** Latest active balance after fees */ + uint256 private latestActiveBalanceAfterFees; + /** Exited balance */ + uint256 private finalizableExitedBalance; + /** Exited pool count */ + uint256 finalizableExitedPoolCount; + /** Current report period */ + uint32 private reportPeriod; /** Last pool ID created */ - uint32 lastPoolId; + uint32 private lastPoolId; /** Token addresses */ mapping(Token => address) private tokenAddresses; /** Unswapped tokens by address */ mapping(address => uint256) private unswappedTokens; /** All users */ mapping(address => User) private users; - /** All pools (open, ready, or staked) */ + /** Sum of scaled rewards to balance ratios (intial value required) */ + uint256 private stakeRatioSum = 1000 ether; + /** Pending withdrawals */ + Withdrawal[] private pendingWithdrawalQueue; + /** Total pending withdrawals */ + uint256 private pendingWithdrawals; + /** Total pending withdrawals count */ + uint256 private pendingWithdrawalCount; + /** All pools (ready, pending, or staked) */ mapping(uint32 => Pool) private pools; /** Total deposits not yet in pools */ - uint256 private openDeposits; + uint256 private prepoolBalance; + /** Total withdrawable deposits */ + uint256 private exitedBalance; + /** Total reserved (execution) fees */ + uint256 private reservedFees; /** IDs of pools ready for initiation */ uint32[] private readyPoolIds; /** IDS of pools pending deposit confirmation */ uint32[] private pendingPoolIds; /** IDs of pools staked */ uint32[] private stakedPoolIds; - /** Public keys of registered validators */ - bytes[] private validatorPublicKeys; - /** Exiting validator count */ - uint256 private exitingValidatorCount; - /** Sum of scaled rewards to stake ratios (intial value required) */ - uint256 stakeRatioSum = 1000 ether; - /** Requested withdrawals */ - Withdrawal[] private requestedWithdrawalQueue; - /** Pending withdrawals */ - Withdrawal[] private pendingWithdrawalQueue; - /** Total requested withdrawals */ - uint256 private requestedWithdrawals; - /** Total pending withdrawals */ - uint256 private pendingWithdrawals; - /** Total fees reserved */ - uint256 private reservedFees; + /** Active pool count */ + uint256 private depositedPoolCount; + /** Slashed pool count */ + uint256 private slashedPoolCount; + /** Exiting pool count */ + uint256 private exitingPoolCount; + /** Total fee percentage */ + uint32 private feePercent = 5; /** ETH fee percentage */ - uint32 ethFeePercent = 3; + uint32 private ethFeePercent = 3; /** LINK fee percentage */ - uint32 linkFeePercent = 1; + uint32 private linkFeePercent = 1; /** SSV fee percentage */ - uint32 ssvFeePercent = 1; + uint32 private ssvFeePercent = 1; /** * @notice Constructor + * @param _oracleAddress The manager oracle address * @param beaconDepositAddress The Beacon deposit address - * @param _dkgOracleAddress The DKG oracle address - * @param functionsOracleAddress The Chainlink functions oracle address + * @param functionsAddress The Chainlink functions oracle address * @param functionsSubscriptionId The Chainlink functions subscription ID * @param linkTokenAddress The Chainlink token address * @param ssvNetworkAddress The SSV network address @@ -146,9 +158,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param wethTokenAddress The WETH contract address */ constructor( + address _oracleAddress, address beaconDepositAddress, - address _dkgOracleAddress, - address functionsOracleAddress, + address functionsAddress, uint32 functionsSubscriptionId, address linkTokenAddress, address ssvNetworkAddress, @@ -157,8 +169,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { address swapRouterAddress, address wethTokenAddress ) { + oracleAddress = _oracleAddress; beaconDeposit = IDepositContract(beaconDepositAddress); - dkgOracleAddress = _dkgOracleAddress; linkToken = IERC20(linkTokenAddress); tokenAddresses[Token.LINK] = linkTokenAddress; ssvNetwork = ISSVNetwork(ssvNetworkAddress); @@ -170,11 +182,18 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { upkeep = new CasimirUpkeep( address(this), - functionsOracleAddress, + functionsAddress, functionsSubscriptionId ); } + /** + * @notice Redirect users to the deposit function + */ + receive() external payable { + revert("Use depositStake() instead"); + } + /** * @notice Deposit user stake */ @@ -210,36 +229,32 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Rebalance the rewards to stake ratio and redistribute swept rewards * @param activeBalance The active consensus balance - * @param sweptRewards The swept consensus rewards - * @param sweptExits The swept consensus exits + * @param newSweptRewards The swept consensus rewards + * @param newDeposits The count of new deposits + * @param newExits The count of new exits */ function rebalanceStake( uint256 activeBalance, - uint256 sweptRewards, - uint256 sweptExits, - uint32 depositCount, - uint32 exitCount + uint256 newSweptRewards, + uint256 newDeposits, + uint256 newExits ) external { require( msg.sender == address(upkeep), "Only upkeep can rebalance stake" ); - uint256 expectedDeposits = depositCount * poolCapacity; - uint256 expectedExits = exitCount * poolCapacity; - int256 expectedEffective = int256( - stakedPoolIds.length * - poolCapacity + - expectedDeposits + - expectedExits - ); int256 previousExpectedEffective = int256( - stakedPoolIds.length * poolCapacity + getExpectedEffectiveBalance() ); + uint256 expectedDeposits = newDeposits * poolCapacity; + uint256 expectedExits = newExits * poolCapacity; + int256 expectedEffective = previousExpectedEffective + + int256(expectedDeposits + expectedExits); int256 previousActiveRewards = int256(latestActiveBalance) - previousExpectedEffective; int256 actualActiveBalance = int256( - activeBalance + sweptRewards + sweptExits + activeBalance + newSweptRewards + finalizableExitedBalance ); int256 actualActiveRewards = actualActiveBalance - expectedEffective; int256 change = actualActiveRewards - previousActiveRewards; @@ -251,39 +266,41 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { stakeRatioSum += Math.mulDiv( stakeRatioSum, gainAfterFees, - getStake() + getTotalStake() ); - latestActiveStake += gainAfterFees; + latestActiveBalanceAfterFees += gainAfterFees; emit StakeRebalanced(gainAfterFees); } else { - stakeRatioSum += Math.mulDiv(stakeRatioSum, gain, getStake()); - latestActiveStake += gain; + stakeRatioSum += Math.mulDiv( + stakeRatioSum, + gain, + getTotalStake() + ); + latestActiveBalanceAfterFees += gain; emit StakeRebalanced(gain); } } else if (change < 0) { uint256 loss = SafeCast.toUint256(-change); - stakeRatioSum -= Math.mulDiv(stakeRatioSum, loss, getStake()); - latestActiveStake -= loss; + stakeRatioSum -= Math.mulDiv(stakeRatioSum, loss, getTotalStake()); + latestActiveBalanceAfterFees -= loss; emit StakeRebalanced(loss); } latestActiveBalance = activeBalance; - latestActiveStake += expectedDeposits; - latestActiveStake -= sweptExits; + latestActiveBalanceAfterFees += expectedDeposits; + latestActiveBalanceAfterFees -= finalizableExitedBalance; - /** Deposit swept rewards */ - if (sweptRewards > 0) { - latestActiveStake -= subtractFees(sweptRewards); - depositRewards(sweptRewards); + if (newSweptRewards > 0) { + latestActiveBalanceAfterFees -= subtractFees(newSweptRewards); + depositRewards(newSweptRewards); } - /** Complete the deposit count of pending pools */ - if (depositCount > 0) { - completePoolDeposits(depositCount); - } + reportPeriod++; + finalizableExitedBalance = 0; + finalizableExitedPoolCount = 0; } /** @@ -297,16 +314,16 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ); while (amount > 0) { - uint256 remainingCapacity = poolCapacity - openDeposits; + uint256 remainingCapacity = poolCapacity - prepoolBalance; if (remainingCapacity > amount) { - openDeposits += amount; + prepoolBalance += amount; amount = 0; } else { lastPoolId++; uint32 poolId = lastPoolId; Pool storage pool; pool = pools[poolId]; - openDeposits = 0; + prepoolBalance = 0; amount -= remainingCapacity; pool.deposits = poolCapacity; readyPoolIds.push(poolId); @@ -327,44 +344,34 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { "Withdrawing more than user stake" ); - requestedWithdrawalQueue.push( - Withdrawal({user: msg.sender, amount: amount}) - ); - requestedWithdrawals += amount; - - emit WithdrawalRequested(msg.sender, amount); - } - - /** - * @notice Initiate a given count of requested withdrawals - * @param count The number of withdrawals to initiate - */ - function initiateRequestedWithdrawals(uint256 count) external { - require( - msg.sender == address(upkeep), - "Only upkeep can initiate withdrawals" - ); - - while (count > 0) { - count--; - - Withdrawal memory withdrawal = requestedWithdrawalQueue[0]; - users[withdrawal.user].stakeRatioSum0 = stakeRatioSum; - users[withdrawal.user].stake0 -= withdrawal.amount; - requestedWithdrawalQueue.remove(0); - requestedWithdrawals -= withdrawal.amount; - - if (withdrawal.amount <= openDeposits) { - openDeposits -= withdrawal.amount; - withdrawal.user.send(withdrawal.amount); - - emit WithdrawalCompleted(withdrawal.user, withdrawal.amount); - } else { - pendingWithdrawalQueue.push(withdrawal); - pendingWithdrawals += withdrawal.amount; - - emit WithdrawalInitiated(withdrawal.user, withdrawal.amount); + users[msg.sender].stakeRatioSum0 = stakeRatioSum; + users[msg.sender].stake0 -= amount; + + if (amount <= getWithdrawableBalance()) { + completeWithdrawal(msg.sender, amount); + } else { + pendingWithdrawalQueue.push( + Withdrawal({ + user: msg.sender, + amount: amount, + period: reportPeriod + }) + ); + pendingWithdrawals += amount; + pendingWithdrawalCount++; + + uint256 coveredExitBalance = exitingPoolCount * poolCapacity; + if ( + pendingWithdrawals > coveredExitBalance + ) { + uint256 exitsRequired = (pendingWithdrawals - coveredExitBalance) / poolCapacity; + if (exitsRequired == 0) { + exitsRequired = 1; + } + requestPoolExits(exitsRequired); } + + emit WithdrawalInitiated(msg.sender, amount); } } @@ -382,46 +389,71 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { count--; Withdrawal memory withdrawal = pendingWithdrawalQueue[0]; + + if (withdrawal.period > reportPeriod) { + break; + } + pendingWithdrawalQueue.remove(0); pendingWithdrawals -= withdrawal.amount; - withdrawal.user.send(withdrawal.amount); + pendingWithdrawalCount--; + + completeWithdrawal(withdrawal.user, withdrawal.amount); emit WithdrawalCompleted(withdrawal.user, withdrawal.amount); } } + /** + * @notice Complete a withdrawal + * @param sender The withdrawal sender + * @param amount The withdrawal amount + */ + function completeWithdrawal(address sender, uint256 amount) private { + if (amount <= exitedBalance) { + exitedBalance -= amount; + } else { + uint256 remainder = amount - exitedBalance; + exitedBalance = 0; + prepoolBalance -= remainder; + } + + sender.send(amount); + + emit WithdrawalCompleted(sender, amount); + } + /** * @notice Initiate the next ready pool * @param depositDataRoot The deposit data root * @param publicKey The validator public key - * @param operatorIds The operator IDs - * @param shares The operator shares * @param signature The signature * @param withdrawalCredentials The withdrawal credentials + * @param operatorIds The operator IDs + * @param shares The operator shares * @param feeAmount The fee amount */ function initiatePoolDeposit( bytes32 depositDataRoot, bytes calldata publicKey, + bytes calldata signature, + bytes calldata withdrawalCredentials, uint64[] memory operatorIds, bytes calldata shares, ISSVNetworkCore.Cluster memory cluster, - bytes calldata signature, - bytes calldata withdrawalCredentials, uint256 feeAmount ) external { require( - msg.sender == dkgOracleAddress, - "Only DKG oracle can initiate pools" + msg.sender == oracleAddress, + "Only manager oracle can initiate pools" ); require(readyPoolIds.length > 0, "No ready pools"); require(reservedFees >= feeAmount, "Not enough reserved fees"); - reservedFees -= feeAmount; + // Todo validate deposit data root - // Todo validate deposit data + reservedFees -= feeAmount; - // Todo transfer LINK fees to keeper and functions subscriptions (, uint256 ssvFees) = processFees(feeAmount); uint32 poolId = readyPoolIds[0]; @@ -432,9 +464,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { pool.shares = shares; pool.signature = signature; pool.withdrawalCredentials = withdrawalCredentials; + readyPoolIds.remove(0); pendingPoolIds.push(poolId); - validatorPublicKeys.push(publicKey); + depositedPoolCount++; beaconDeposit.deposit{value: pool.deposits}( pool.publicKey, @@ -443,6 +476,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { pool.depositDataRoot ); + linkToken.approve(address(upkeep), linkToken.balanceOf(address(this))); + ssvToken.approve(address(ssvNetwork), ssvFees); ssvNetwork.registerValidator( @@ -460,7 +495,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Complete a given count of the next pending pools * @param count The number of pools to complete */ - function completePoolDeposits(uint256 count) private { + function completePoolDeposits(uint256 count) external { + require( + msg.sender == address(upkeep), + "Only upkeep can complete pool deposits" + ); require(pendingPoolIds.length >= count, "Not enough pending pools"); while (count > 0) { @@ -478,12 +517,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Request a given count of staked pool exits * @param count The number of exits to request */ - function requestPoolExits(uint256 count) external { - require( - msg.sender == address(upkeep), - "Only upkeep can request pool exits" - ); - + function requestPoolExits(uint256 count) private { uint256 index = 0; while (count > 0) { uint32 poolId = stakedPoolIds[index]; @@ -494,88 +528,75 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { index++; pool.exiting = true; - exitingValidatorCount++; + exitingPoolCount++; emit PoolExitRequested(poolId); } } } + /** + * @notice Report a pool slash + * @param poolId The pool ID + */ + function reportPoolSlash(uint32 poolId) external { + require( + msg.sender == oracleAddress, + "Only manager oracle can initiate pools" + ); + Pool storage pool = pools[poolId]; + if (!pool.exiting) { + pool.exiting = true; + exitingPoolCount++; + } + if (!pool.slashed) { + pool.slashed = true; + slashedPoolCount++; + } + } + /** * @notice Complete a pool exit * @param poolIndex The staked pool index - * @param validatorIndex The staked validator (internal) index + * @param finalEffectiveBalance The final effective balance + * @param blamePercents The operator blame percents (0 if balance is 32 ether) + * @param cluster The SSV cluster snapshot */ function completePoolExit( uint256 poolIndex, - uint256 validatorIndex + uint256 finalEffectiveBalance, + uint32[] memory blamePercents, + ISSVNetworkCore.Cluster memory cluster ) external { require( - msg.sender == address(upkeep), - "Only upkeep can complete pool exits" + msg.sender == oracleAddress, + "Only manager oracle can complete pool exits" ); - require(exitingValidatorCount > 0, "No exiting validators"); + require(exitingPoolCount > 0, "No exiting validators"); uint32 poolId = stakedPoolIds[poolIndex]; Pool storage pool = pools[poolId]; require(pool.exiting, "Pool is not exiting"); - bytes memory validatorPublicKey = pool.publicKey; - bytes memory stakedValidatorPublicKey = validatorPublicKeys[ - validatorIndex - ]; + uint64[] memory operatorIds = pool.operatorIds; + bytes memory publicKey = pool.publicKey; - require( - keccak256(validatorPublicKey) == - keccak256(stakedValidatorPublicKey), - "Pool validator does not match staked validator" - ); + // Todo recover lost funds from collateral using blame percents + + depositedPoolCount--; + exitingPoolCount--; + finalizableExitedPoolCount++; + finalizableExitedBalance += finalEffectiveBalance; stakedPoolIds.remove(poolIndex); delete pools[poolId]; - validatorPublicKeys.remove(validatorIndex); - exitingValidatorCount--; - // ssvNetwork.removeValidator(validatorPublicKey); + ssvNetwork.removeValidator(publicKey, operatorIds, cluster); emit PoolExited(poolId); } - /** - * @notice Register an operator with the pool manager - * @param operatorId The operator ID - */ - function registerOperator(uint32 operatorId) external payable { - // - } - - /** - * @notice Reshare a given pool's validator - * @param poolId The pool ID - * @param operatorIds The operator IDs - * @param shares The operator shares - */ - function resharePool( - uint32 poolId, - uint64[] memory operatorIds, - bytes memory shares - ) external { - require( - msg.sender == dkgOracleAddress, - "Only DKG oracle can initiate pools" - ); - - Pool memory pool = pools[poolId]; - require(pool.reshareCount < 3, "Pool has been reshared twice"); - - pool.operatorIds = operatorIds; - pool.shares = shares; - pool.reshareCount++; - - emit PoolReshared(poolId); - } - /** * @dev Get reservable fees from a given amount * @param amount The amount to reserve fees from @@ -584,7 +605,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function subtractFees( uint256 amount ) private view returns (uint256 amountAfterFees) { - uint32 feePercent = getFeePercent(); amountAfterFees = Math.mulDiv(amount, 100, 100 + feePercent); } @@ -599,14 +619,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ) private returns (uint256 linkFees, uint256 ssvFees) { wrapFees(amount); - uint32 feePercent = getFeePercent(); - (uint256 swappedLINK, uint256 unswappedLINK) = swapFees( tokenAddresses[Token.WETH], tokenAddresses[Token.LINK], Math.mulDiv(amount, linkFeePercent, feePercent) ); - linkToken.approve(address(upkeep), linkToken.balanceOf(address(this))); linkFees = swappedLINK; unswappedTokens[tokenAddresses[Token.LINK]] += unswappedLINK; @@ -615,7 +632,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { tokenAddresses[Token.SSV], Math.mulDiv(amount, ssvFeePercent, feePercent) ); - ssvToken.approve(address(upkeep), ssvToken.balanceOf(address(this))); ssvFees = swappedSSV; unswappedTokens[tokenAddresses[Token.SSV]] += unswappedSSV; } @@ -681,6 +697,12 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint32 _linkFeePercent, uint32 _ssvFeePercent ) external onlyOwner { + require( + _ethFeePercent + _linkFeePercent + _ssvFeePercent == + getFeePercent(), + "Total fee percentage must remain the same" + ); + ethFeePercent = _ethFeePercent; linkFeePercent = _linkFeePercent; ssvFeePercent = _ssvFeePercent; @@ -688,115 +710,153 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Update the functions oracle address - * @param oracle New oracle address + * @param functionsAddress New functions oracle address + */ + function setFunctionsAddress(address functionsAddress) external onlyOwner { + upkeep.setOracleAddress(functionsAddress); + } + + /** + * @notice Get the total user stake for a given user address + * @param userAddress The user address + * @return userStake The total user stake */ - function setOracleAddress(address oracle) external onlyOwner { - upkeep.setOracleAddress(oracle); + function getUserStake( + address userAddress + ) public view returns (uint256 userStake) { + require(users[userAddress].stake0 > 0, "User does not have a stake"); + userStake = Math.mulDiv( + users[userAddress].stake0, + stakeRatioSum, + users[userAddress].stakeRatioSum0 + ); } /** - * @notice Get the manager stake - * @return stake The manager stake + * @notice Get the total stake + * @return totalStake The total stake */ - function getStake() public view returns (uint256 stake) { - stake = getBufferedStake() + getPendingStake() + getActiveStake(); + function getTotalStake() public view returns (uint256 totalStake) { + totalStake = + getBufferedBalance() + + getPendingBalance() + + latestActiveBalanceAfterFees - + pendingWithdrawals; } /** - * @notice Get the manager buffered (execution) stake - * @return stake The manager buffered (execution) stake + * @notice Get the buffered balance + * @return bufferedBalance The buffered balance */ - function getBufferedStake() public view returns (uint256 stake) { - stake = openDeposits + readyPoolIds.length * poolCapacity; + function getBufferedBalance() + public + view + returns (uint256 bufferedBalance) + { + bufferedBalance = getWithdrawableBalance() + getReadyBalance(); } /** - * @notice Get the manager pending (consensus) stake - * @return stake The manager pending (consensus) stake + * @notice Get the ready balance + * @return readyBalance The ready balance */ - function getPendingStake() public view returns (uint256 stake) { - stake = pendingPoolIds.length * poolCapacity; + function getReadyBalance() public view returns (uint256 readyBalance) { + readyBalance = readyPoolIds.length * poolCapacity; } /** - * @notice Get the manager active (consensus) stake - * @return stake The manager active (consensus) stake + * @notice Get the pending balance + * @return pendingBalance The pending balance */ - function getActiveStake() public view returns (uint256 stake) { - stake = latestActiveStake; + function getPendingBalance() public view returns (uint256 pendingBalance) { + pendingBalance = pendingPoolIds.length * poolCapacity; } /** - * @notice Get the total user stake for a given user address - * @param userAddress The user address - * @return userStake The total user stake + * @notice Get the withdrawable balanace + * @return withdrawableBalance The withdrawable balanace */ - function getUserStake( - address userAddress - ) public view returns (uint256 userStake) { - require(users[userAddress].stake0 > 0, "User does not have a stake"); - userStake = Math.mulDiv( - users[userAddress].stake0, - stakeRatioSum, - users[userAddress].stakeRatioSum0 - ); + function getWithdrawableBalance() public view returns (uint256) { + return prepoolBalance + exitedBalance; } /** - * @notice Get the manager reserved fees - * @return reservedFees The manager reserved fees + * @notice Get the reserved fees + * @return reservedFees The reserved fees */ function getReservedFees() public view returns (uint256) { return reservedFees; } /** - * @notice Get the manager swept balance - * @return balance The manager swept balance + * @notice Get the swept balance + * @return balance The swept balance */ function getSweptBalance() public view returns (uint256 balance) { balance = address(this).balance - - getBufferedStake() - + getBufferedBalance() - getReservedFees(); } /** - * @notice Get the total fee percentage - * @return feePercent The total fee percentage + * @notice Get the expected effective balance + * @return expectedEffectiveBalance The expected effective balance */ - function getFeePercent() public view returns (uint32 feePercent) { - feePercent = ethFeePercent + linkFeePercent + ssvFeePercent; + function getExpectedEffectiveBalance() + public + view + returns (uint256 expectedEffectiveBalance) + { + expectedEffectiveBalance = stakedPoolIds.length * poolCapacity; } - // External view functions + /** + * @notice Get the report period + * @return reportPeriod The report period + */ + function getReportPeriod() public view returns (uint32) { + return reportPeriod; + } /** - * @notice Get the total requested withdrawals - * @return requestedWithdrawals The total requested withdrawals + * @notice Get the latest active balance + * @return activeBalance The latest active balance */ - function getRequestedWithdrawals() external view returns (uint256) { - return requestedWithdrawals; + function getLatestActiveBalance() public view returns (uint256) { + return latestActiveBalance; } /** - * @notice Get the total pending withdrawals - * @return pendingWithdrawals The total pending withdrawals + * @notice Get the latest active balance after fees + * @return activeBalanceAfterFees The latest active balance after fees */ - function getPendingWithdrawals() external view returns (uint256) { - return pendingWithdrawals; + function getLatestActiveBalanceAfterFees() public view returns (uint256) { + return latestActiveBalanceAfterFees; } /** - * @notice Get the requested withdrawal queue - * @return requestedWithdrawalQueue The requested withdrawal queue + * @notice Get the latest active rewards + * @return activeRewards The latest active rewards */ - function getRequestedWithdrawalQueue() - external - view - returns (Withdrawal[] memory) - { - return requestedWithdrawalQueue; + function getLatestActiveRewards() public view returns (int256) { + return latestActiveRewards; + } + + /** + * @notice Get the finalizable exited balance + * @return finalizableExitedBalance The finalizable exited balance + */ + function getFinalizableExitedBalance() public view returns (uint256) { + return finalizableExitedBalance; + } + + /** + * @notice Get the finalizable exited pool count + * @return finalizableExitedPoolCount The finalizable exited pool count + */ + function getFinalizableExitedPoolCount() public view returns (uint256) { + return finalizableExitedPoolCount; } /** @@ -804,7 +864,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @return pendingWithdrawalQueue The pending withdrawal queue */ function getPendingWithdrawalQueue() - external + public view returns (Withdrawal[] memory) { @@ -812,51 +872,91 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Get validator public keys - * @return A list of pending and active validator public keys + * @notice Get the eligibility of a pending withdrawal + * @return pendingWithdrawalEligibility The eligibility of a pending withdrawal + */ + function getPendingWithdrawalEligibility( + uint256 index, + uint256 period + ) public view returns (bool) { + if (pendingWithdrawalCount > index) { + return pendingWithdrawalQueue[index].period <= period; + } + return false; + } + + /** + * @notice Get the total pending withdrawals + * @return pendingWithdrawals The total pending withdrawals + */ + function getPendingWithdrawals() public view returns (uint256) { + return pendingWithdrawals; + } + + /** + * @notice Get the total pending withdrawal count + * @return pendingWithdrawalCount The total pending withdrawal count + */ + function getPendingWithdrawalCount() public view returns (uint256) { + return pendingWithdrawalCount; + } + + /** + * @notice Get the total fee percentage + * @return feePercent The total fee percentage + */ + function getFeePercent() public view returns (uint32) { + return feePercent; + } + + // External view functions + + /** + * @notice Get the count of active pools + * @return depositedPoolCount The count of active pools */ - function getValidatorPublicKeys() external view returns (bytes[] memory) { - return validatorPublicKeys; + function getDepositedPoolCount() external view returns (uint256) { + return depositedPoolCount; } /** - * @notice Get the count of exiting validators - * @return The count of exiting validators + * @notice Get the count of exiting pools + * @return exitingPoolCount The count of exiting pools */ - function getExitingValidatorCount() external view returns (uint256) { - return exitingValidatorCount; + function getExitingPoolCount() external view returns (uint256) { + return exitingPoolCount; } /** - * @notice Get a list of all ready pool IDs - * @return A list of all ready pool IDs + * @notice Get the ready pool IDs + * @return readyPoolIds The ready pool IDs */ function getReadyPoolIds() external view returns (uint32[] memory) { return readyPoolIds; } /** - * @notice Get a list of all pending pool IDs - * @return A list of all pending pool IDs + * @notice Get the pending pool IDs + * @return pendingPoolIds The pending pool IDs */ function getPendingPoolIds() external view returns (uint32[] memory) { return pendingPoolIds; } /** - * @notice Get a list of all staked pool IDs - * @return A list of all staked pool IDs + * @notice Get the staked pool IDs + * @return stakedPoolIds The staked pool IDs */ function getStakedPoolIds() external view returns (uint32[] memory) { return stakedPoolIds; } /** - * @notice Get the total manager open deposits - * @return The total manager open deposits + * @notice Get the pre-pool balance + * @return prepoolBalance The pre-pool balance */ - function getOpenDeposits() external view returns (uint256) { - return openDeposits; + function getPrepoolBalance() external view returns (uint256) { + return prepoolBalance; } /** @@ -870,7 +970,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Get the ETH fee percentage to charge on each deposit - * @return The ETH fee percentage to charge on each deposit + * @return ethFeePercent The ETH fee percentage to charge on each deposit */ function getETHFeePercent() external view returns (uint32) { return ethFeePercent; @@ -878,7 +978,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Get the LINK fee percentage to charge on each deposit - * @return The LINK fee percentage to charge on each deposit + * @return linkFeePercent The LINK fee percentage to charge on each deposit */ function getLINKFeePercent() external view returns (uint32) { return linkFeePercent; @@ -886,7 +986,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Get the SSV fee percentage to charge on each deposit - * @return The SSV fee percentage to charge on each deposit + * @return ssvFeePercent The SSV fee percentage to charge on each deposit */ function getSSVFeePercent() external view returns (uint32) { return ssvFeePercent; @@ -896,7 +996,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Get the SSV network address * @return ssvNetworkAddress The SSV network address */ - function getSSVNetworkAddress() external view returns (address ssvNetworkAddress) { + function getSSVNetworkAddress() + external + view + returns (address ssvNetworkAddress) + { ssvNetworkAddress = address(ssvNetwork); } @@ -907,12 +1011,4 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function getUpkeepAddress() external view returns (address upkeepAddress) { upkeepAddress = address(upkeep); } - - // Dev-only functions - - /** - * @dev Will be removed in production - * @dev Used for mocking sweeps from Beacon to the manager - */ - receive() external payable nonReentrant {} } diff --git a/contracts/ethereum/src/CasimirRecipient.sol b/contracts/ethereum/src/CasimirRecipient.sol new file mode 100644 index 000000000..296d6c4e6 --- /dev/null +++ b/contracts/ethereum/src/CasimirRecipient.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; + +import "./interfaces/ICasimirRecipient.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; + +// Dev-only imports +import "hardhat/console.sol"; + +/** + * @title Recipient contract that distributes validator execution fee rewards + */ +contract CasimirRecipient is Ownable, ReentrancyGuard, ICasimirRecipient { + uint256 private rewards; + + receive() external payable nonReentrant { + rewards += msg.value; + } +} \ No newline at end of file diff --git a/contracts/ethereum/src/CasimirRegistry.sol b/contracts/ethereum/src/CasimirRegistry.sol new file mode 100644 index 000000000..a45d4124c --- /dev/null +++ b/contracts/ethereum/src/CasimirRegistry.sol @@ -0,0 +1,116 @@ +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; + +import './interfaces/ICasimirManager.sol'; +import './interfaces/ICasimirRegistry.sol'; +import './libraries/Types.sol'; +import './vendor/interfaces/ISSVNetworkViews.sol'; + +// Todo efficiently reshare or exit pools when deregistering + +contract CasimirRegistry is ICasimirRegistry { + using TypesAddress for address; + + ICasimirManager private manager; + ISSVNetworkViews private ssvNetworkViews; + uint256 requiredCollateral = 4 ether; + uint256 minimumCollateralDeposit = 100000000000000000; + mapping(uint64 => Operator) private operators; + + constructor(address managerAddress, address ssvNetworkViewsAddress) { + manager = ICasimirManager(managerAddress); + ssvNetworkViews = ISSVNetworkViews(ssvNetworkViewsAddress); + } + + /** + * @notice Register an operator with the set + * @param operatorId The operator ID + */ + function registerOperator(uint64 operatorId) external payable { + require(msg.value >= requiredCollateral, "Insufficient registration collateral"); + (address operatorOwner, , , ,) = ssvNetworkViews.getOperatorById(operatorId); + require(msg.sender == operatorOwner, "Only operator owner can register"); + + operators[operatorId] = Operator({ + id: operatorId, + collateral: int256(msg.value), + poolCount: 0, + deregistering: false + }); + + emit OperatorRegistered(operatorId); + } + + /** + * @notice Request to deregister an operator from the set + * @param operatorId The operator ID + */ + function requestOperatorDeregistration(uint64 operatorId) external { + Operator storage operator = operators[operatorId]; + require(operator.collateral >= 0, "Operator owes collateral"); + (address operatorOwner, , , ,) = ssvNetworkViews.getOperatorById(operatorId); + require(msg.sender == operatorOwner, "Only operator owner can request deregister"); + + operator.deregistering = true; + + emit OperatorDeregistrationRequested(operatorId); + + // Now the oracle reshares or exits their pools as needed then deregisters + } + + /** + * @notice Deregister an operator from the set + * @param operatorId The operator ID + */ + function completeOperatorDeregistration(uint64 operatorId) external { + require(msg.sender == address(manager), "Only manager can deregister operators"); + Operator storage operator = operators[operatorId]; + require(operator.collateral >= 0, "Operator owes collateral"); + + (address operatorOwner, , , ,) = ssvNetworkViews.getOperatorById(operatorId); + + delete operators[operatorId]; + + if (operator.collateral > 0) { + operatorOwner.send(uint256(operator.collateral)); + } + + emit OperatorDeregistrationCompleted(operatorId); + } + + /** + * @notice Deposit collateral for an operator + * @param operatorId The operator ID + */ + function depositCollateral(uint64 operatorId) external payable { + require(msg.value > minimumCollateralDeposit, "Insufficient collateral deposit"); + Operator storage operator = operators[operatorId]; + require(operator.id != 0, "Operator is not registered"); + (address operatorOwner, , , ,) = ssvNetworkViews.getOperatorById(operatorId); + require(msg.sender == operatorOwner, "Only operator owner can deposit collateral"); + + operator.collateral += int256(msg.value); + } + + /** + * @notice Set the collateral for an operator + * @param operatorId The operator ID + * @param collateral The collateral + */ + function setOperatorCollateral(uint64 operatorId, int256 collateral) external { + require(msg.sender == address(manager), "Only manager can set operator collateral"); + + Operator storage operator = operators[operatorId]; + operator.collateral = collateral; + } + + + /** + * @notice Get the collateral for an operator + * @param operatorId The operator ID + * @return The collateral + */ + function getOperatorCollateral(uint64 operatorId) external view returns (int256) { + return operators[operatorId].collateral; + } +} \ No newline at end of file diff --git a/contracts/ethereum/src/CasimirUpkeep.sol b/contracts/ethereum/src/CasimirUpkeep.sol index 5ec43423d..4be88ab88 100644 --- a/contracts/ethereum/src/CasimirUpkeep.sol +++ b/contracts/ethereum/src/CasimirUpkeep.sol @@ -1,9 +1,6 @@ // SPDX-License-Identifier: Apache pragma solidity 0.8.18; -// 1. Handle exits, withdrawals, and clusters -// 2. Pick between Functions, EA, and custom oracle - import "./interfaces/ICasimirUpkeep.sol"; import "./interfaces/ICasimirManager.sol"; import {Functions, FunctionsClient} from "@chainlink/contracts/src/v0.8/dev/functions/FunctionsClient.sol"; @@ -27,7 +24,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /*************/ /** Oracle heartbeat */ - uint256 public constant reportHeartbeat = 0; // Will use a ~quarter of a day in production + uint256 public constant reportHeartbeat = 1 days; /** Pool capacity */ uint256 public constant poolCapacity = 32 ether; @@ -42,20 +39,38 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /* Dynamic State */ /********************/ - /** Binary request source code */ - bytes public requestCBOR; - /** Latest request ID */ - bytes32 public latestRequestId; - /** Latest fulfilled request ID */ - bytes32 public latestFulfilledRequestId; - /** Latest response */ - bytes private latestResponse; - /** Latest response timestamp */ - uint256 private latestResponseTimestamp; + /** Current report status */ + Status private status; + /** Current report remaining requests */ + uint256 remainingRequests; + /** Current report period */ + uint256 currentPeriod; + /** Current report pending pool count */ + uint256 currentPendingPoolCount; + /** Current report exiting pool count */ + uint256 currentExitingPoolCount; + /** Current report block */ + uint256 currentRequestBlock; + /** Current report swept balance */ + uint256 private currentSweptBalance; + /** Current report active balance */ + uint256 private reportedActiveBalance; + /** Current report completed deposits */ + uint256 private reportedDeposits; + /** Current report completed exits */ + uint256 private reportedExits; + /** Current report completed slashes */ + uint256 private reportedSlashes; + /** Finalizable completed deposits */ + uint256 private finalizableDeposits; + /** Current report requests */ + mapping(bytes32 => RequestType) private requests; + /** Latest report request timestamp */ + uint256 private latestReportTimestamp; /** Latest error */ bytes private latestError; - /** Latest response count */ - uint256 private responseCounter; + /** Binary request source code */ + bytes public requestCBOR; /** Fulfillment gas limit */ uint32 fulfillGasLimit; /** Functions subscription ID */ @@ -132,95 +147,123 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { public view override - returns (bool upkeepNeeded, bytes memory performData) + returns (bool upkeepNeeded, bytes memory) { - if ((block.timestamp - latestResponseTimestamp) >= reportHeartbeat) { - upkeepNeeded = true; - } - - int256 requiredWithdrawals = int256(manager.getRequestedWithdrawals() + manager.getPendingWithdrawals()) - int256(manager.getExitingValidatorCount() * 32 ether); - if (requiredWithdrawals > 0) { - upkeepNeeded = true; - } - // Todo provide required withdrawals as performData (or some optimial input, maybe validator count) - - if (latestFulfilledRequestId != "" && latestFulfilledRequestId != latestRequestId) { - upkeepNeeded = false; + if (status == Status.FINALIZED) { + bool checkActive = manager.getDepositedPoolCount() > 0; + bool heartbeatLapsed = (block.timestamp - latestReportTimestamp) >= reportHeartbeat; + upkeepNeeded = checkActive && heartbeatLapsed; + } else if (status == Status.PROCESSING) { + bool exitsFinalizable = reportedExits == manager.getFinalizableExitedPoolCount(); + upkeepNeeded = exitsFinalizable; } - - performData = abi.encode(requiredWithdrawals); } /** * @notice Perform the upkeep */ function performUpkeep(bytes calldata) external override { - (bool upkeepNeeded, bytes memory performData) = checkUpkeep(""); + (bool upkeepNeeded, ) = checkUpkeep(""); require(upkeepNeeded, "Upkeep not needed"); - int256 requiredWithdrawals = abi.decode(performData, (int256)); - - /** Initiate withdrawals and request exits */ - if (requiredWithdrawals > 0) { - // Todo this should bound withdrawals and request exits - manager.initiateRequestedWithdrawals(manager.getRequestedWithdrawalQueue().length); - manager.completePendingWithdrawals(manager.getPendingWithdrawalQueue().length); + if (status == Status.FINALIZED) { + status = Status.REQUESTING; + + latestReportTimestamp = block.timestamp; + currentPeriod = manager.getReportPeriod(); + currentPendingPoolCount = manager.getPendingPoolIds().length; + currentExitingPoolCount = manager.getExitingPoolCount(); + currentSweptBalance = manager.getSweptBalance(); + + Functions.Request memory req; + for (uint256 i = 1; i < 5; i++) { + RequestType requestType = RequestType(i); + bool checkBalance = requestType == RequestType.BALANCE; + bool checkDeposits = requestType == RequestType.DEPOSITS && currentPendingPoolCount > 0; + bool checkExits = requestType == RequestType.EXITS && currentExitingPoolCount > 0; + bool checkSlashes = requestType == RequestType.SLASHES; + if (checkBalance || checkDeposits || checkExits || checkSlashes) { + bytes32 requestId = sendRequest(req, functionsSubscriptionId, fulfillGasLimit); + requests[requestId] = RequestType(i); + remainingRequests++; + } + } + } else { + if ( + manager.getPendingWithdrawals() > 0 && + manager.getPendingWithdrawalEligibility(0, currentPeriod) && + manager.getPendingWithdrawals() <= manager.getWithdrawableBalance() + ) { + manager.completePendingWithdrawals(5); + } + + if (finalizableDeposits > 0) { + uint256 maxCompletions = finalizableDeposits > 5 ? 5 : finalizableDeposits; + finalizableDeposits -= maxCompletions; + manager.completePoolDeposits(maxCompletions); + } + + if (!manager.getPendingWithdrawalEligibility(0, currentPeriod) && finalizableDeposits == 0) { + status = Status.FINALIZED; + + manager.rebalanceStake({ + activeBalance: reportedActiveBalance, + newSweptRewards: currentSweptBalance - manager.getFinalizableExitedBalance(), + newDeposits: reportedDeposits, + newExits: reportedExits + }); + + reportedActiveBalance = 0; + reportedDeposits = 0; + reportedExits = 0; + reportedSlashes = 0; + } } - /** Placeholder request */ - Functions.Request memory req; - - /** Request a report */ - bytes32 requestId = sendRequest(req, functionsSubscriptionId, fulfillGasLimit); - latestRequestId = requestId; - - emit UpkeepPerformed(performData); + emit UpkeepPerformed(status); } /** * @notice Callback that is invoked once the DON has resolved the request or hit an error * @param requestId The request ID, returned by sendRequest() * @param response Aggregated response from the user code - * @param err Aggregated error from the user code or from the sweptStake pipeline + * @param _error Aggregated error from the user code or from the sweptStake pipeline * Either response or error parameter will be set, but never both */ function fulfillRequest( bytes32 requestId, bytes memory response, - bytes memory err + bytes memory _error ) internal override { - latestFulfilledRequestId = requestId; - latestResponseTimestamp = block.timestamp; - latestResponse = response; - latestError = err; - responseCounter = responseCounter + 1; - - if (err.length == 0) { - /** Decode report */ - uint256 report = abi.decode(response, (uint256)); - - /** Unpack values */ - uint256 activeStake = uint256(uint64(report)) * 1 gwei; - uint256 sweptRewards = uint256(uint64(report >> 64)) * 1 gwei; - uint256 sweptExits = uint256(uint64(report >> 128)) * 1 gwei; - uint32 depositCount = uint32(report >> 192); - uint32 exitCount = uint32(report >> 224); - - // if (sweptExits < exitCount * poolCapacity) { - // sweptExits = amount recovered from blamed operator collateral - // } - - /** Rebalance the stake */ - manager.rebalanceStake( - activeStake, - sweptRewards, - sweptExits, - depositCount, - exitCount - ); + // Todo handle errors + latestError = _error; + + if (_error.length == 0) { + uint256 value = abi.decode(response, (uint256)); + RequestType requestType = requests[requestId]; + + if (requestType != RequestType.NONE) { + delete requests[requestId]; + remainingRequests--; + + if (requestType == RequestType.BALANCE) { + reportedActiveBalance = value; + } else if (requestType == RequestType.DEPOSITS) { + reportedDeposits = value; + finalizableDeposits = value; + } else if (requestType == RequestType.EXITS) { + reportedExits = value; + } else { + reportedSlashes = value; + } + + if (remainingRequests == 0) { + status = Status.PROCESSING; + } + } } - emit OCRResponse(requestId, response, err); + emit OCRResponse(requestId, response, _error); } /** diff --git a/contracts/ethereum/src/interfaces/ICasimirDAO.sol b/contracts/ethereum/src/interfaces/ICasimirDAO.sol new file mode 100644 index 000000000..ed90fb64d --- /dev/null +++ b/contracts/ethereum/src/interfaces/ICasimirDAO.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; + +interface ICasimirDAO { + event Deposit(address indexed sender, uint amount, uint balance); + event SubmitTransaction( + address indexed owner, + uint indexed txIndex, + address indexed to, + uint value, + bytes data + ); + event ConfirmTransaction(address indexed owner, uint indexed txIndex); + event RevokeConfirmation(address indexed owner, uint indexed txIndex); + event ExecuteTransaction(address indexed owner, uint indexed txIndex); + + struct Transaction { + address to; + uint value; + bytes data; + bool executed; + uint numConfirmations; + } + + receive() external payable; + + function submitTransaction( + address _to, + uint _value, + bytes memory _data + ) external; + + function confirmTransaction( + uint _txIndex + ) external; + + function executeTransaction( + uint _txIndex + ) external; + + function revokeConfirmation( + uint _txIndex + ) external; + + function getOwners() external view returns (address[] memory); + + function getTransactionCount() external view returns (uint); + + function getTransaction( + uint _txIndex + ) + external + view + returns ( + address to, + uint value, + bytes memory data, + bool executed, + uint numConfirmations + ); +} \ No newline at end of file diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index 9b343936a..bd7f61999 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -8,33 +8,33 @@ interface ICasimirManager { /* Structs */ /***********/ - /** Processed deposit with stake and fee amounts */ struct ProcessedDeposit { uint256 ethAmount; uint256 linkAmount; uint256 ssvAmount; } - /** Pool used for running a validator */ + struct Pool { uint256 deposits; bool exiting; - uint256 reshareCount; + bool slashed; bytes32 depositDataRoot; bytes publicKey; - uint64[] operatorIds; - bytes shares; bytes signature; bytes withdrawalCredentials; + uint64[] operatorIds; + bytes shares; } - /** User staking account */ + struct User { uint256 stake0; uint256 stakeRatioSum0; } - /** Withdrawal */ + struct Withdrawal { address user; uint256 amount; + uint256 period; } /**********/ @@ -62,40 +62,39 @@ interface ICasimirManager { function depositStake() external payable; function rebalanceStake( - uint256 activeStake, - uint256 sweptRewards, - uint256 sweptExits, - uint32 depositCount, - uint32 exitCount + uint256 activeBalance, + uint256 newSweptRewards, + uint256 newDeposits, + uint256 newExits ) external; function requestWithdrawal(uint256 amount) external; - function initiateRequestedWithdrawals(uint256 count) external; - function completePendingWithdrawals(uint256 count) external; function initiatePoolDeposit( bytes32 depositDataRoot, bytes calldata publicKey, + bytes calldata signature, + bytes calldata withdrawalCredentials, uint64[] memory operatorIds, bytes calldata shares, ISSVNetworkCore.Cluster memory cluster, - bytes calldata signature, - bytes calldata withdrawalCredentials, uint256 feeAmount ) external; - function requestPoolExits(uint256 count) external; + function completePoolDeposits(uint256 count) external; function completePoolExit( uint256 poolIndex, - uint256 validatorIndex + uint256 finalEffectiveBalance, + uint32[] memory blamePercents, + ISSVNetworkCore.Cluster memory cluster ) external; function setFeePercents(uint32 ethFeePercent, uint32 linkFeePercent, uint32 ssvFeePercent) external; - function setOracleAddress(address oracleAddress) external; + function setFunctionsAddress(address functionsAddress) external; function getFeePercent() external view returns (uint32); @@ -105,12 +104,12 @@ interface ICasimirManager { function getSSVFeePercent() external view returns (uint32); - function getValidatorPublicKeys() + function getDepositedPoolCount() external view - returns (bytes[] memory); + returns (uint256); - function getExitingValidatorCount() + function getExitingPoolCount() external view returns (uint256); @@ -121,21 +120,35 @@ interface ICasimirManager { function getStakedPoolIds() external view returns (uint32[] memory); - function getStake() external view returns (uint256); + function getTotalStake() external view returns (uint256); - function getBufferedStake() external view returns (uint256); + function getBufferedBalance() external view returns (uint256); - function getActiveStake() external view returns (uint256); + function getExpectedEffectiveBalance() external view returns (uint256); - function getOpenDeposits() external view returns (uint256); + function getReportPeriod() external view returns (uint32); - function getUserStake(address userAddress) external view returns (uint256); + function getFinalizableExitedPoolCount() external view returns (uint256); - function getRequestedWithdrawals() external view returns (uint256); + function getFinalizableExitedBalance() external view returns (uint256); - function getPendingWithdrawals() external view returns (uint256); + function getLatestActiveBalance() external view returns (uint256); + + function getLatestActiveBalanceAfterFees() external view returns (uint256); + + function getPendingWithdrawalEligibility(uint256 index, uint256 period) external view returns (bool); + + function getWithdrawableBalance() external view returns (uint256); - function getRequestedWithdrawalQueue() external view returns (Withdrawal[] memory); + function getPrepoolBalance() external view returns (uint256); + + function getSweptBalance() external view returns (uint256); + + function getUserStake(address userAddress) external view returns (uint256); function getPendingWithdrawalQueue() external view returns (Withdrawal[] memory); + + function getPendingWithdrawals() external view returns (uint256); + + function getPendingWithdrawalCount() external view returns (uint256); } diff --git a/contracts/ethereum/src/interfaces/ICasimirRecipient.sol b/contracts/ethereum/src/interfaces/ICasimirRecipient.sol new file mode 100644 index 000000000..99267604d --- /dev/null +++ b/contracts/ethereum/src/interfaces/ICasimirRecipient.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; + +interface ICasimirRecipient {} \ No newline at end of file diff --git a/contracts/ethereum/src/interfaces/ICasimirRegistry.sol b/contracts/ethereum/src/interfaces/ICasimirRegistry.sol new file mode 100644 index 000000000..2651deee5 --- /dev/null +++ b/contracts/ethereum/src/interfaces/ICasimirRegistry.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; + +interface ICasimirRegistry { + event OperatorRegistered(uint64 operatorId); + event OperatorDeregistrationRequested(uint64 operatorId); + event OperatorDeregistrationCompleted(uint64 operatorId); + + struct Operator { + uint64 id; + int256 collateral; + uint256 poolCount; + bool deregistering; + } + + function registerOperator(uint64 operatorId) external payable; + + function requestOperatorDeregistration(uint64 operatorId) external; + + function completeOperatorDeregistration(uint64 operatorId) external; + + function depositCollateral(uint64 operatorId) external payable; + + function setOperatorCollateral(uint64 operatorId, int256 collateral) external; + + function getOperatorCollateral(uint64 operatorId) external view returns (int256); +} \ No newline at end of file diff --git a/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol b/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol index a3d2a06d1..5cf10f69b 100644 --- a/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol +++ b/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol @@ -4,16 +4,24 @@ pragma solidity 0.8.18; import "@chainlink/contracts/src/v0.8/interfaces/AutomationCompatibleInterface.sol"; interface ICasimirUpkeep is AutomationCompatibleInterface { - /***********/ - /* Structs */ - /***********/ - - struct OracleReport { - uint256 activeStake; - uint256 sweptRewards; - uint256 sweptExits; - // bytes[] exitedValidatorPublicKeys; - // uint256[] exitedValidatorIndices; + /***************/ + /* Enumerators */ + /***************/ + + /** Upkeep statuses */ + enum Status { + FINALIZED, + REQUESTING, + PROCESSING + } + + /** Request types */ + enum RequestType { + NONE, + BALANCE, + DEPOSITS, + EXITS, + SLASHES } /**********/ @@ -21,7 +29,7 @@ interface ICasimirUpkeep is AutomationCompatibleInterface { /**********/ event OCRResponse(bytes32 indexed requestId, bytes result, bytes err); - event UpkeepPerformed(bytes performData); + event UpkeepPerformed(Status status); /*************/ /* Functions */ diff --git a/contracts/ethereum/src/mock/MockFunctionsOracle.sol b/contracts/ethereum/src/mock/MockFunctionsOracle.sol index 7f1eeef09..cf7542aea 100644 --- a/contracts/ethereum/src/mock/MockFunctionsOracle.sol +++ b/contracts/ethereum/src/mock/MockFunctionsOracle.sol @@ -10,7 +10,7 @@ import "hardhat/console.sol"; */ contract MockFunctionsOracle { - uint256 private latestRequestIdNumber = 1; + uint256 private latestRequestIdNumber; uint64 private subscriptionId; bytes private data; uint32 private gasLimit; @@ -41,6 +41,7 @@ contract MockFunctionsOracle { subscriptionId = _subscriptionId; data = _data; gasLimit = _gasLimit; + latestRequestIdNumber++; requestId = keccak256(abi.encode(latestRequestIdNumber)); } } diff --git a/contracts/ethereum/src/vendor/interfaces/ISSVNetwork.sol b/contracts/ethereum/src/vendor/interfaces/ISSVNetwork.sol index 0f9a16565..0ab45d3db 100644 --- a/contracts/ethereum/src/vendor/interfaces/ISSVNetwork.sol +++ b/contracts/ethereum/src/vendor/interfaces/ISSVNetwork.sol @@ -1,292 +1,4 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.18; -import "./ISSVNetworkCore.sol"; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -interface ISSVNetwork is ISSVNetworkCore { - /**********/ - /* Events */ - /**********/ - - /** - * @dev Emitted when a new operator has been added. - * @param operatorId operator's ID. - * @param owner Operator's ethereum address that can collect fees. - * @param publicKey Operator's public key. Will be used to encrypt secret shares of validators keys. - * @param fee Operator's fee. - */ - event OperatorAdded( - uint64 indexed operatorId, - address indexed owner, - bytes publicKey, - uint256 fee - ); - - /** - * @dev Emitted when operator has been removed. - * @param operatorId operator's ID. - */ - event OperatorRemoved(uint64 indexed operatorId); - - /** - * @dev Emitted when the whitelist of an operator is updated. - * @param operatorId operator's ID. - * @param whitelisted operator's new whitelisted address. - */ - event OperatorWhitelistUpdated( - uint64 indexed operatorId, - address whitelisted - ); - - /** - * @dev Emitted when the validator has been added. - * @param publicKey The public key of a validator. - * @param operatorIds The operator ids list. - * @param shares snappy compressed shares(a set of encrypted and public shares). - * @param cluster All the cluster data. - */ - event ValidatorAdded( - address indexed owner, - uint64[] operatorIds, - bytes publicKey, - bytes shares, - Cluster cluster - ); - - /** - * @dev Emitted when the validator is removed. - * @param publicKey The public key of a validator. - * @param operatorIds The operator ids list. - * @param cluster All the cluster data. - */ - event ValidatorRemoved( - address indexed owner, - uint64[] operatorIds, - bytes publicKey, - Cluster cluster - ); - - event OperatorFeeDeclared( - address indexed owner, - uint64 indexed operatorId, - uint256 blockNumber, - uint256 fee - ); - - event OperatorFeeCancellationDeclared( - address indexed owner, - uint64 indexed operatorId - ); - - /** - * @dev Emitted when an operator's fee is updated. - * @param owner Operator's owner. - * @param blockNumber from which block number. - * @param fee updated fee value. - */ - event OperatorFeeExecuted( - address indexed owner, - uint64 indexed operatorId, - uint256 blockNumber, - uint256 fee - ); - - event ClusterLiquidated( - address indexed owner, - uint64[] operatorIds, - Cluster cluster - ); - - event ClusterReactivated( - address indexed owner, - uint64[] operatorIds, - Cluster cluster - ); - - event OperatorFeeIncreaseLimitUpdated(uint64 value); - - event DeclareOperatorFeePeriodUpdated(uint64 value); - - event ExecuteOperatorFeePeriodUpdated(uint64 value); - - event LiquidationThresholdPeriodUpdated(uint64 value); - - event MinimumLiquidationCollateralUpdated(uint256 value); - - /** - * @dev Emitted when the network fee is updated. - * @param oldFee The old fee - * @param newFee The new fee - */ - event NetworkFeeUpdated(uint256 oldFee, uint256 newFee); - - /** - * @dev Emitted when transfer fees are withdrawn. - * @param value The amount of tokens withdrawn. - * @param recipient The recipient address. - */ - event NetworkEarningsWithdrawn(uint256 value, address recipient); - - event ClusterWithdrawn( - address indexed owner, - uint64[] operatorIds, - uint256 value, - Cluster cluster - ); - event OperatorWithdrawn( - address indexed owner, - uint64 indexed operatorId, - uint256 value - ); - - event ClusterDeposited( - address indexed owner, - uint64[] operatorIds, - uint256 value, - Cluster cluster - ); - - event FeeRecipientAddressUpdated( - address indexed owner, - address recipientAddress - ); - - /****************/ - /* Initializers */ - /****************/ - - /** - * @dev Initializes the contract. - * @param token_ The network token. - * @param operatorMaxFeeIncrease_ The step limit to increase the operator fee - * @param declareOperatorFeePeriod_ The period an operator needs to wait before they can approve their fee. - * @param executeOperatorFeePeriod_ The length of the period in which an operator can approve their fee. - */ - function initialize( - string calldata initialVersion_, - IERC20 token_, - uint64 operatorMaxFeeIncrease_, - uint64 declareOperatorFeePeriod_, - uint64 executeOperatorFeePeriod_, - uint64 minimumBlocksBeforeLiquidation_, - uint256 minimumLiquidationCollateral_ - ) external; - - /*******************************/ - /* Operator External Functions */ - /*******************************/ - - /** - * @dev Registers a new operator. - * @param publicKey Operator's public key. Used to encrypt secret shares of validators keys. - * @param fee operator's fee. When fee is set to zero (mostly for private operators), it can not be increased. - */ - function registerOperator( - bytes calldata publicKey, - uint256 fee - ) external returns (uint64); - - /** - * @dev Removes an operator. - * @param operatorId Operator's id. - */ - function removeOperator(uint64 operatorId) external; - - function setOperatorWhitelist( - uint64 operatorId, - address whitelisted - ) external; - - function declareOperatorFee(uint64 operatorId, uint256 fee) external; - - function executeOperatorFee(uint64 operatorId) external; - - function cancelDeclaredOperatorFee(uint64 operatorId) external; - - function reduceOperatorFee(uint64 operatorId, uint256 fee) external; - - function setFeeRecipientAddress(address feeRecipientAddress) external; - - /********************************/ - /* Validator External Functions */ - /********************************/ - - function registerValidator( - bytes calldata publicKey, - uint64[] memory operatorIds, - bytes calldata sharesEncrypted, - uint256 amount, - Cluster memory cluster - ) external; - - function removeValidator( - bytes calldata publicKey, - uint64[] memory operatorIds, - Cluster memory cluster - ) external; - - /**************************/ - /* Cluster External Functions */ - /**************************/ - - function liquidate( - address owner, - uint64[] memory operatorIds, - Cluster memory cluster - ) external; - - function reactivate( - uint64[] memory operatorIds, - uint256 amount, - Cluster memory cluster - ) external; - - /******************************/ - /* Balance External Functions */ - /******************************/ - - function deposit( - address owner, - uint64[] memory operatorIds, - uint256 amount, - Cluster memory cluster - ) external; - - function withdrawOperatorEarnings( - uint64 operatorId, - uint256 tokenAmount - ) external; - - function withdrawOperatorEarnings(uint64 operatorId) external; - - function withdraw( - uint64[] memory operatorIds, - uint256 tokenAmount, - Cluster memory cluster - ) external; - - /**************************/ - /* DAO External Functions */ - /**************************/ - - function updateNetworkFee(uint256 fee) external; - - function withdrawNetworkEarnings(uint256 amount) external; - - function updateOperatorFeeIncreaseLimit( - uint64 newOperatorMaxFeeIncrease - ) external; - - function updateDeclareOperatorFeePeriod( - uint64 newDeclareOperatorFeePeriod - ) external; - - function updateExecuteOperatorFeePeriod( - uint64 newExecuteOperatorFeePeriod - ) external; - - function updateLiquidationThresholdPeriod(uint64 blocks) external; - - function updateMinimumLiquidationCollateral(uint256 amount) external; -} +import "../../../scripts/resources/ssv-network/contracts/ISSVNetwork.sol"; diff --git a/contracts/ethereum/src/vendor/interfaces/ISSVNetworkCore.sol b/contracts/ethereum/src/vendor/interfaces/ISSVNetworkCore.sol index e7a5562ce..f14f515bd 100644 --- a/contracts/ethereum/src/vendor/interfaces/ISSVNetworkCore.sol +++ b/contracts/ethereum/src/vendor/interfaces/ISSVNetworkCore.sol @@ -1,86 +1,4 @@ // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.18; -import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; - -interface ISSVNetworkCore { - /***********/ - /* Structs */ - /***********/ - - struct Validator { - address owner; - bool active; - } - struct Snapshot { - /// @dev block is the last block in which last index was set. For Operator, it's also used to identify an active / inactive one. - uint64 block; - /// @dev index is the last index calculated by index += (currentBlock - block) * fee - uint64 index; - /// @dev accumulated is all the accumulated earnings, calculated by accumulated + lastIndex * validatorCount - uint64 balance; - } - - struct Operator { - address owner; - /// @dev when fee is set to zero (mostly for private operators), it can not be increased - uint64 fee; - uint32 validatorCount; - Snapshot snapshot; - } - - struct OperatorFeeChangeRequest { - uint64 fee; - uint64 approvalBeginTime; - uint64 approvalEndTime; - } - - struct Cluster { - uint32 validatorCount; - uint64 networkFeeIndex; - uint64 index; - uint256 balance; - bool active; - } - - struct DAO { - uint32 validatorCount; - uint64 balance; - uint64 block; - } - - struct Network { - uint64 networkFee; - uint64 networkFeeIndex; - uint64 networkFeeIndexBlockNumber; - } - - /**********/ - /* Errors */ - /**********/ - - error CallerNotOwner(); - error CallerNotWhitelisted(); - error FeeTooLow(); - error FeeExceedsIncreaseLimit(); - error NoFeeDelcared(); - error ApprovalNotWithinTimeframe(); - error OperatorDoesNotExist(); - error InsufficientBalance(); - error ValidatorAlreadyExists(); - error ValidatorDoesNotExist(); - error ClusterNotLiquidatable(); - error InvalidPublicKeyLength(); - error InvalidOperatorIdsLength(); - error ValidatorOwnedByOtherAddress(); - error ClusterAlreadyEnabled(); - error ClusterIsLiquidated(); - error ClusterDoesNotExists(); - error IncorrectClusterState(); - error UnsortedOperatorsList(); - error NewBlockPeriodIsBelowMinimum(); - error ExceedValidatorLimit(); - error TokenTransferFailed(); - error SameFeeChangeNotAllowed(); - error FeeIncreaseNotAllowed(); -} +import "../../../scripts/resources/ssv-network/contracts/ISSVNetworkCore.sol"; diff --git a/contracts/ethereum/src/vendor/interfaces/ISSVNetworkViews.sol b/contracts/ethereum/src/vendor/interfaces/ISSVNetworkViews.sol new file mode 100644 index 000000000..245918eb4 --- /dev/null +++ b/contracts/ethereum/src/vendor/interfaces/ISSVNetworkViews.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.18; + +import "../../../scripts/resources/ssv-network/contracts/ISSVNetworkViews.sol"; diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index d2dc67c39..5e9356359 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -1,28 +1,22 @@ import { ethers } from 'hardhat' -import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' +import { loadFixture, time, setBalance } from '@nomicfoundation/hardhat-network-helpers' import { deployContract } from '@casimir/ethereum/helpers/deploy' import { CasimirManager, CasimirUpkeep } from '@casimir/ethereum/build/artifacts/types' -import { fulfillFunctionsRequest, runUpkeep } from '@casimir/ethereum/helpers/upkeep' -import { initiatePoolDepositHandler } from '@casimir/ethereum/helpers/validators' +import { performReport } from '@casimir/ethereum/helpers/upkeep' +import { completePoolExitHandler, initiatePoolDepositHandler } from '@casimir/ethereum/helpers/oracle' import { round } from '@casimir/ethereum/helpers/math' import { ContractConfig, DeploymentConfig } from '@casimir/types' -const getSweptBalance = ethers.utils.id('getSweptBalance()').slice(0, 10) -console.log(getSweptBalance) - -const getValidatorPublicKeys = ethers.utils.id('getValidatorPublicKeys()').slice(0, 10) -console.log(getValidatorPublicKeys) - /** Fixture to deploy SSV manager contract */ export async function deploymentFixture() { - const [owner, , , , , keeper, dkg] = await ethers.getSigners() + const [owner, , , , , keeper, oracle] = await ethers.getSigners() let config: DeploymentConfig = { CasimirManager: { address: '', args: { + oracleAddress: oracle.address || process.env.ORACLE_ADDRESS, beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, - dkgOracleAddress: dkg.address || process.env.DKG_ORACLE_ADDRESS, - functionsOracleAddress: process.env.FUNCTIONS_ORACLE_ADDRESS, + functionsAddress: process.env.FUNCTIONS_ADDRESS, functionsSubscriptionId: process.env.FUNCTIONS_SUBSCRIPTION_ID, linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, @@ -54,7 +48,7 @@ export async function deploymentFixture() { /** Link mock external contracts to Casimir */ if (name === 'CasimirManager') { - (config[name as keyof typeof config] as ContractConfig).args.functionsOracleAddress = config.MockFunctionsOracle?.address + (config[name as keyof typeof config] as ContractConfig).args.functionsAddress = config.MockFunctionsOracle?.address } const { args, options, proxy } = config[name as keyof typeof config] as ContractConfig @@ -72,419 +66,385 @@ export async function deploymentFixture() { const manager = await ethers.getContractAt('CasimirManager', config.CasimirManager.address as string) as CasimirManager const upkeep = await ethers.getContractAt('CasimirUpkeep', await manager.getUpkeepAddress()) as CasimirUpkeep - return { manager: manager as CasimirManager, upkeep: upkeep as CasimirUpkeep, owner, keeper, dkg } + return { manager: manager as CasimirManager, upkeep: upkeep as CasimirUpkeep, owner, keeper, oracle } } /** Fixture to stake 16 for the first user */ export async function firstUserDepositFixture() { - const { manager, upkeep, owner, keeper, dkg } = await loadFixture(deploymentFixture) + const { manager, upkeep, owner, keeper, oracle } = await loadFixture(deploymentFixture) const [, firstUser] = await ethers.getSigners() - const stakeAmount = 16 - const depositAmount = round(stakeAmount * ((100 + await manager.getFeePercent()) / 100), 10) + const depositAmount = round(16 * ((100 + await manager.getFeePercent()) / 100), 10) const deposit = await manager.connect(firstUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await deposit.wait() - /** Run upkeep */ - await runUpkeep({ upkeep, keeper }) - - return { manager, upkeep, owner, firstUser, keeper, dkg } + return { manager, upkeep, owner, firstUser, keeper, oracle } } /** Fixture to stake 24 for the second user */ export async function secondUserDepositFixture() { - const { manager, upkeep, owner, firstUser, keeper, dkg } = await loadFixture(firstUserDepositFixture) + const { manager, upkeep, owner, firstUser, keeper, oracle } = await loadFixture(firstUserDepositFixture) const [, , secondUser] = await ethers.getSigners() - const stakeAmount = 24 - const nextActiveBalanceAmount = 32 - const nextSweptRewardsAmount = 0 - const nextSweptExitsAmount = 0 - const nextDepositedCount = 1 - const nextExitedCount = 0 - const depositAmount = round(stakeAmount * ((100 + await manager.getFeePercent()) / 100), 10) + const depositAmount = round(24 * ((100 + await manager.getFeePercent()) / 100), 10) const deposit = await manager.connect(secondUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await deposit.wait() - /** Initiate next ready pool */ - const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length - await initiatePoolDepositHandler({ manager, signer: dkg, index: nextValidatorIndex }) - - /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, keeper }) - - /** Fulfill functions request */ - if (ranUpkeep) { - await fulfillFunctionsRequest({ - upkeep, - keeper, - nextActiveBalanceAmount, - nextSweptRewardsAmount, - nextSweptExitsAmount, - nextDepositedCount, - nextExitedCount - }) - } - - return { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } + const nextPoolId = 1 + await initiatePoolDepositHandler({ manager, signer: oracle, id: nextPoolId }) + + + await time.increase(time.duration.days(1)) + let requestId = 0 + const nextValues = [ + 32, // activeBalance + 1, // deposits + 0, // exits + 0, // slashes + ] + + requestId = await performReport({ + manager, + upkeep, + keeper, + values: nextValues, + requestId + }) + + return { manager, upkeep, owner, firstUser, secondUser, keeper, oracle, requestId } } /** Fixture to report increase of 0.105 in total rewards before fees */ export async function rewardsPostSecondUserDepositFixture() { - const { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } = await loadFixture(secondUserDepositFixture) - - const rewardsAmount = 0.105 - const nextActiveBalanceAmount = 32 + rewardsAmount - const nextSweptRewardsAmount = 0 - const nextSweptExitsAmount = 0 - const nextDepositedCount = 0 - const nextExitedCount = 0 - - /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, keeper }) - - /** Fulfill functions request */ - if (ranUpkeep) { - await fulfillFunctionsRequest({ - upkeep, - keeper, - nextActiveBalanceAmount, - nextSweptRewardsAmount, - nextSweptExitsAmount, - nextDepositedCount, - nextExitedCount - }) - } - - return { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } + const { manager, upkeep, owner, firstUser, secondUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(secondUserDepositFixture) + + await time.increase(time.duration.days(1)) + let requestId = latestRequestId + const nextValues = [ + 32.105, // activeBalance + 0, // deposits + 0, // exits + 0, // slashes + ] + + requestId = await performReport({ + manager, + upkeep, + keeper, + values: nextValues, + requestId + }) + + return { manager, upkeep, owner, firstUser, secondUser, keeper, oracle, requestId } } /** Fixture to sweep 0.105 to the manager */ export async function sweepPostSecondUserDepositFixture() { - const { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } = await loadFixture(secondUserDepositFixture) + const { manager, upkeep, owner, firstUser, secondUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(secondUserDepositFixture) const sweptRewards = 0.105 - const sweep = await keeper.sendTransaction({ to: manager.address, value: ethers.utils.parseEther(sweptRewards.toString()) }) - await sweep.wait() - - const nextActiveBalanceAmount = 32 - const nextSweptRewardsAmount = sweptRewards - const nextSweptExitsAmount = 0 - const nextDepositedCount = 0 - const nextExitedCount = 0 - - /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, keeper }) - - /** Fulfill functions request */ - if (ranUpkeep) { - await fulfillFunctionsRequest({ - upkeep, - keeper, - nextActiveBalanceAmount, - nextSweptRewardsAmount, - nextSweptExitsAmount, - nextDepositedCount, - nextExitedCount - }) - } - - return { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } + const currentBalance = await ethers.provider.getBalance(manager.address) + const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptRewards.toString())) + await setBalance(manager.address, nextBalance) + + await time.increase(time.duration.days(1)) + let requestId = latestRequestId + const nextValues = [ + 32, // activeBalance + 0, // deposits + 0, // exits + 0, // slashes + ] + requestId = await performReport({ + manager, + upkeep, + keeper, + values: nextValues, + requestId + }) + + return { manager, upkeep, owner, firstUser, secondUser, keeper, oracle, requestId } } /** Fixture to stake 24 for the third user */ export async function thirdUserDepositFixture() { - const { manager, upkeep, owner, firstUser, secondUser, keeper, dkg } = await loadFixture(sweepPostSecondUserDepositFixture) + const { manager, upkeep, owner, firstUser, secondUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(sweepPostSecondUserDepositFixture) const [, , , thirdUser] = await ethers.getSigners() - const stakeAmount = 24 - const nextActiveBalanceAmount = 64 - const nextSweptRewardsAmount = 0 - const nextSweptExitsAmount = 0 - const nextDepositedCount = 1 - const nextExitedCount = 0 - const depositAmount = round(stakeAmount * ((100 + await manager.getFeePercent()) / 100), 10) + const depositAmount = round(24 * ((100 + await manager.getFeePercent()) / 100), 10) const deposit = await manager.connect(thirdUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await deposit.wait() - /** Initiate next ready pool */ - const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length - await initiatePoolDepositHandler({ manager, signer: dkg, index: nextValidatorIndex }) - - /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, keeper }) - - /** Fulfill functions request */ - if (ranUpkeep) { - await fulfillFunctionsRequest({ - upkeep, - keeper, - nextActiveBalanceAmount, - nextSweptRewardsAmount, - nextSweptExitsAmount, - nextDepositedCount, - nextExitedCount - }) - } - - return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } + const readyPools = await manager.getReadyPoolIds() + const nextPoolId = readyPools[readyPools.length - 1] + await initiatePoolDepositHandler({ manager, signer: oracle, id: nextPoolId }) + + await time.increase(time.duration.days(1)) + let requestId = latestRequestId + const nextValues = [ + 64, // activeBalance + 1, // deposits + 0, // exits + 0, // slashes + ] + requestId = await performReport({ + manager, + upkeep, + keeper, + values: nextValues, + requestId + }) + + return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId } } /** Fixture to report increase of 0.21 in total rewards before fees */ export async function rewardsPostThirdUserDepositFixture() { - const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } = await loadFixture(thirdUserDepositFixture) - - const rewardsAmount = 0.21 - const nextActiveBalanceAmount = 64 + rewardsAmount - const nextSweptRewardsAmount = 0 - const nextSweptExitsAmount = 0 - const nextDepositedCount = 0 - const nextExitedCount = 0 - - /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, keeper }) - - /** Fulfill functions request */ - if (ranUpkeep) { - await fulfillFunctionsRequest({ - upkeep, - keeper, - nextActiveBalanceAmount, - nextSweptRewardsAmount, - nextSweptExitsAmount, - nextDepositedCount, - nextExitedCount - }) - } - - return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } + const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(thirdUserDepositFixture) + + await time.increase(time.duration.days(1)) + let requestId = latestRequestId + const nextValues = [ + 64.21, // activeBalance + 0, // deposits + 0, // exits + 0, // slashes + ] + requestId = await performReport({ + manager, + upkeep, + keeper, + values: nextValues, + requestId + }) + + return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId } } /** Fixture to sweep 0.21 to the manager */ export async function sweepPostThirdUserDepositFixture() { - const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } = await loadFixture(rewardsPostThirdUserDepositFixture) + const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(rewardsPostThirdUserDepositFixture) const sweptRewards = 0.21 - const sweep = await keeper.sendTransaction({ to: manager.address, value: ethers.utils.parseEther(sweptRewards.toString()) }) - await sweep.wait() - - const nextActiveBalanceAmount = 64 - const nextSweptRewardsAmount = sweptRewards - const nextSweptExitsAmount = 0 - const nextDepositedCount = 0 - const nextExitedCount = 0 - - /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, keeper }) - - /** Fulfill functions request */ - if (ranUpkeep) { - await fulfillFunctionsRequest({ - upkeep, - keeper, - nextActiveBalanceAmount, - nextSweptRewardsAmount, - nextSweptExitsAmount, - nextDepositedCount, - nextExitedCount - }) - } - - return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, dkg } + const currentBalance = await ethers.provider.getBalance(manager.address) + const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptRewards.toString())) + await setBalance(manager.address, nextBalance) + + await time.increase(time.duration.days(1)) + let requestId = latestRequestId + const nextValues = [ + 64, // activeBalance + 0, // deposits + 0, // exits + 0, // slashes + ] + requestId = await performReport({ + manager, + upkeep, + keeper, + values: nextValues, + requestId + }) + + return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId } } /** Fixture to partial withdraw 0.3 to the first user */ export async function firstUserPartialWithdrawalFixture() { - const { manager, upkeep, firstUser, secondUser, thirdUser, keeper, dkg } = await loadFixture(sweepPostThirdUserDepositFixture) - const openDeposits = await manager.getOpenDeposits() - const withdraw = await manager.connect(firstUser).requestWithdrawal(openDeposits) + const { manager, upkeep, firstUser, secondUser, thirdUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(sweepPostThirdUserDepositFixture) + const prepoolBalance = await manager.getPrepoolBalance() + const withdraw = await manager.connect(firstUser).requestWithdrawal(prepoolBalance) await withdraw.wait() - /** Run upkeep */ - await runUpkeep({ upkeep, keeper }) - - return { manager, upkeep, firstUser, secondUser, thirdUser, keeper, dkg } + await time.increase(time.duration.days(1)) + let requestId = latestRequestId + const nextValues = [ + 64, // activeBalance + 0, // deposits + 0, // exits + 0, // slashes + ] + requestId = await performReport({ + manager, + upkeep, + keeper, + values: nextValues, + requestId + }) + + return { manager, upkeep, firstUser, secondUser, thirdUser, keeper, oracle, requestId } } /** Fixture to stake 72 for the fourth user */ export async function fourthUserDepositFixture() { - const { manager, upkeep, firstUser, secondUser, thirdUser, keeper, dkg } = await loadFixture(firstUserPartialWithdrawalFixture) + const { manager, upkeep, firstUser, secondUser, thirdUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(firstUserPartialWithdrawalFixture) const [, , , , fourthUser] = await ethers.getSigners() - const stakeAmount = 72 - const nextActiveBalanceAmount = 128 - const nextSweptRewardsAmount = 0 - const nextSweptExitsAmount = 0 - const nextDepositedCount = 2 - const nextExitedCount = 0 - const depositAmount = round(stakeAmount * ((100 + await manager.getFeePercent()) / 100), 10) + const depositAmount = round(72 * ((100 + await manager.getFeePercent()) / 100), 10) const deposit = await manager.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await deposit.wait() /** Initiate next ready pools (2) */ + const readyPools = await manager.getReadyPoolIds() for (let i = 0; i < 2; i++) { - const nextValidatorIndex = (await manager.getPendingPoolIds()).length + (await manager.getStakedPoolIds()).length - await initiatePoolDepositHandler({ manager, signer: dkg, index: nextValidatorIndex }) - } - - /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, keeper }) - - /** Fulfill functions request */ - if (ranUpkeep) { - await fulfillFunctionsRequest({ - upkeep, - keeper, - nextActiveBalanceAmount, - nextSweptRewardsAmount, - nextSweptExitsAmount, - nextDepositedCount, - nextExitedCount - }) + const nextPoolId = readyPools[i] + await initiatePoolDepositHandler({ manager, signer: oracle, id: nextPoolId }) } - return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } + await time.increase(time.duration.days(1)) + let requestId = latestRequestId + const nextValues = [ + 128, // activeBalance + 2, // deposits + 0, // exits + 0, // slashes + ] + requestId = await performReport({ + manager, + upkeep, + keeper, + values: nextValues, + requestId + }) + + return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } } /** Fixture to simulate a validator stake penalty that decreases the active balance */ export async function activeBalanceLossFixture() { - const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } = await loadFixture(fourthUserDepositFixture) - - const nextActiveBalanceAmount = 126 - const nextSweptRewardsAmount = 0 - const nextSweptExitsAmount = 0 - const nextDepositedCount = 0 - const nextExitedCount = 0 - - /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, keeper }) - - /** Fulfill functions request */ - if (ranUpkeep) { - await fulfillFunctionsRequest({ - upkeep, - keeper, - nextActiveBalanceAmount, - nextSweptRewardsAmount, - nextSweptExitsAmount, - nextDepositedCount, - nextExitedCount - }) - } - - return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } + const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(fourthUserDepositFixture) + + await time.increase(time.duration.days(1)) + let requestId = latestRequestId + const nextValues = [ + 126, // activeBalance + 0, // deposits + 0, // exits + 0, // slashes + ] + requestId = await performReport({ + manager, + upkeep, + keeper, + values: nextValues, + requestId + }) + + return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } } /** Fixture to simulate a validator reward that brings the active balance back to expected */ export async function activeBalanceRecoveryFixture() { - const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } = await loadFixture(activeBalanceLossFixture) - - let nextActiveBalanceAmount = 126 - const nextSweptRewardsAmount = 0 - const nextSweptExitsAmount = 0 - const nextDepositedCount = 0 - const nextExitedCount = 0 + const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(activeBalanceLossFixture) /** Simulate two distinct reported gains */ + let nextActiveBalanceAmount = 127 + let requestId = latestRequestId for (let i = 0; i < 2; i++) { - nextActiveBalanceAmount += 1 - - /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, keeper }) + await time.increase(time.duration.days(1)) + const nextValues = [ + nextActiveBalanceAmount, // activeBalance + 0, // deposits + 0, // exits + 0, // slashes + ] + requestId = await performReport({ + manager, + upkeep, + keeper, + values: nextValues, + requestId + }) - /** Fulfill functions request */ - if (ranUpkeep) { - await fulfillFunctionsRequest({ - upkeep, - keeper, - nextActiveBalanceAmount, - nextSweptRewardsAmount, - nextSweptExitsAmount, - nextDepositedCount, - nextExitedCount - }) - } + nextActiveBalanceAmount += 1 } - return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } + return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } } -// /** Fixture to full withdraw ~24.07 */ -// export async function thirdUserFullWithdrawalFixture() { -// const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } = await loadFixture(fourthUserDepositFixture) - -// const thirdStake = await manager.getUserStake(thirdUser.address) -// const withdraw = await manager.connect(thirdUser).requestWithdrawal(thirdStake) -// await withdraw.wait() +/** Fixture to full withdraw ~24.07 */ +export async function thirdUserFullWithdrawalFixture() { + const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(fourthUserDepositFixture) -// /** Run upkeep */ -// await runUpkeep({ upkeep, keeper }) + const thirdStake = await manager.getUserStake(thirdUser.address) + const withdraw = await manager.connect(thirdUser).requestWithdrawal(thirdStake) + await withdraw.wait() -// return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } -// } + const exitRequests = await manager.queryFilter(manager.filters.PoolExitRequested(), -1, 'latest') + const exitRequest = exitRequests[0] + const { poolId } = exitRequest.args + await completePoolExitHandler({ manager, signer: oracle, id: poolId }) + + await time.increase(time.duration.days(1)) + let requestId = latestRequestId + const nextValues = [ + 128, // activeBalance + 0, // deposits + 1, // exits + 0, // slashes + ] + requestId = await performReport({ + manager, + upkeep, + keeper, + values: nextValues, + requestId + }) + + return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } +} /** Fixture to simulate stakes and rewards */ export async function simulationFixture() { - const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } = await loadFixture(activeBalanceRecoveryFixture) + const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(thirdUserFullWithdrawalFixture) const rewardsPerValidator = 0.105 - let nextActiveBalanceAmount = 128 + let nextActiveBalanceAmount = 96 let totalRewards = 0 - + let requestId = latestRequestId for (let i = 0; i < 5; i++) { - const validatorCount = (await manager.getValidatorPublicKeys())?.length - if (validatorCount) { - const rewardsAmount = rewardsPerValidator * validatorCount + const depositedPoolCount = await manager.getDepositedPoolCount() + if (depositedPoolCount) { + await time.increase(time.duration.days(1)) + const rewardsAmount = rewardsPerValidator * depositedPoolCount.toNumber() totalRewards += round(rewardsAmount, 10) - nextActiveBalanceAmount = round(nextActiveBalanceAmount + rewardsAmount, 10) - const nextSweptRewardsAmount = 0 - const nextSweptExitsAmount = 0 - const nextDepositedCount = 0 - const nextExitedCount = 0 - - /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, keeper }) - - /** Fulfill functions request */ - if (ranUpkeep) { - await fulfillFunctionsRequest({ - upkeep, - keeper, - nextActiveBalanceAmount, - nextSweptRewardsAmount, - nextSweptExitsAmount, - nextDepositedCount, - nextExitedCount - }) - } + nextActiveBalanceAmount = round(nextActiveBalanceAmount + rewardsAmount, 10) + const nextValues = [ + nextActiveBalanceAmount, // activeBalance + 0, // deposits + 0, // exits + 0, // slashes + ] + requestId = await performReport({ + manager, + upkeep, + keeper, + values: nextValues, + requestId + }) } } const sweptRewards = totalRewards - const sweep = await keeper.sendTransaction({ to: manager.address, value: ethers.utils.parseEther(sweptRewards.toString()) }) - await sweep.wait() - - nextActiveBalanceAmount = 128 - const nextSweptRewardsAmount = sweptRewards - const nextSweptExitsAmount = 0 - const nextDepositedCount = 0 - const nextExitedCount = 0 - - /** Run upkeep */ - const ranUpkeep = await runUpkeep({ upkeep, keeper }) - - /** Fulfill functions request */ - if (ranUpkeep) { - await fulfillFunctionsRequest({ - upkeep, - keeper, - nextActiveBalanceAmount, - nextSweptRewardsAmount, - nextSweptExitsAmount, - nextDepositedCount, - nextExitedCount - }) - } - - return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, dkg } + const currentBalance = await ethers.provider.getBalance(manager.address) + const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptRewards.toString())) + await setBalance(manager.address, nextBalance) + + + await time.increase(time.duration.days(1)) + const nextValues = [ + 96, // activeBalance + 0, // deposits + 0, // exits + 0, // slashes + ] + requestId = await performReport({ + manager, + upkeep, + keeper, + values: nextValues, + requestId + }) + + return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } } \ No newline at end of file diff --git a/contracts/ethereum/test/integration.ts b/contracts/ethereum/test/integration.ts index 86832f9bc..69ea6dafd 100644 --- a/contracts/ethereum/test/integration.ts +++ b/contracts/ethereum/test/integration.ts @@ -1,13 +1,13 @@ import { ethers } from 'hardhat' import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' import { expect } from 'chai' -import { firstUserDepositFixture, rewardsPostSecondUserDepositFixture, secondUserDepositFixture, thirdUserDepositFixture, rewardsPostThirdUserDepositFixture, simulationFixture, firstUserPartialWithdrawalFixture, fourthUserDepositFixture, sweepPostSecondUserDepositFixture, sweepPostThirdUserDepositFixture, activeBalanceLossFixture, activeBalanceRecoveryFixture } from './fixtures/shared' +import { firstUserDepositFixture, rewardsPostSecondUserDepositFixture, secondUserDepositFixture, thirdUserDepositFixture, rewardsPostThirdUserDepositFixture, simulationFixture, firstUserPartialWithdrawalFixture, fourthUserDepositFixture, sweepPostSecondUserDepositFixture, sweepPostThirdUserDepositFixture, activeBalanceLossFixture, activeBalanceRecoveryFixture, thirdUserFullWithdrawalFixture } from './fixtures/shared' describe('Casimir manager', async function () { it('First user\'s 16.0 stake increases the total stake to 16.0', async function () { const { manager } = await loadFixture(firstUserDepositFixture) - const stake = await manager.getStake() + const stake = await manager.getTotalStake() expect(ethers.utils.formatEther(stake)).equal('16.0') }) @@ -31,7 +31,7 @@ describe('Casimir manager', async function () { it('Second user\'s 24.0 stake increases the total stake to 40.0', async function () { const { manager } = await loadFixture(secondUserDepositFixture) - const stake = await manager.getStake() + const stake = await manager.getTotalStake() expect(ethers.utils.formatEther(stake)).equal('40.0') }) @@ -43,11 +43,11 @@ describe('Casimir manager', async function () { it('Functions oracle reports an increase of 0.1 in total after fees', async function () { const { manager } = await loadFixture(rewardsPostSecondUserDepositFixture) - const stake = await manager.getStake() + const stake = await manager.getTotalStake() expect(ethers.utils.formatEther(stake)).equal('40.1') }) - it('First and second user\'s stake earns them 0.04 and 0.06, respectively, after some time', async function () { + it('First and second user\'s stake earns them 0.04 and 0.06', async function () { const { manager, firstUser, secondUser } = await loadFixture(rewardsPostSecondUserDepositFixture) const firstStake = await manager.getUserStake(firstUser.address) const secondStake = await manager.getUserStake(secondUser.address) @@ -55,10 +55,10 @@ describe('Casimir manager', async function () { expect(ethers.utils.formatEther(secondStake)).equal('24.06') }) - it('First pool\'s 0.1 is swept and compounded after some time', async function () { + it('First pool\'s 0.1 is swept and compounded', async function () { const { manager } = await loadFixture(sweepPostSecondUserDepositFixture) - const bufferedStake = await manager.getBufferedStake() - expect(ethers.utils.formatEther(bufferedStake)).equal('8.1') + const bufferedBalance = await manager.getBufferedBalance() + expect(ethers.utils.formatEther(bufferedBalance)).equal('8.1') }) it('Third user\'s 24.0 stake completes the second pool with 32.0', async function () { @@ -75,7 +75,7 @@ describe('Casimir manager', async function () { it('Third user\'s 24.0 stake increases the total stake to 64.1', async function () { const { manager } = await loadFixture(thirdUserDepositFixture) - const stake = await manager.getStake() + const stake = await manager.getTotalStake() expect(ethers.utils.formatEther(stake)).equal('64.1') }) @@ -87,11 +87,11 @@ describe('Casimir manager', async function () { it('Functions oracle reports an increase of 0.2 in total after fees', async function () { const { manager } = await loadFixture(rewardsPostThirdUserDepositFixture) - const stake = await manager.getStake() + const stake = await manager.getTotalStake() expect(ethers.utils.formatEther(stake)).equal('64.3') }) - it('First, second, and third user\'s stake earns them ~0.09, ~0.135 and ~0.075, respectively, after some time', async function () { + it('First, second, and third user\'s stake earns them ~0.09, ~0.135 and ~0.075', async function () { const { manager, firstUser, secondUser, thirdUser } = await loadFixture(rewardsPostThirdUserDepositFixture) const firstStake = await manager.getUserStake(firstUser.address) const secondStake = await manager.getUserStake(secondUser.address) @@ -102,9 +102,9 @@ describe('Casimir manager', async function () { expect(ethers.utils.formatEther(thirdStake)).equal('24.074882995319812792') }) - it('First and second pool\'s 0.2 is swept and compounded after some time', async function () { + it('First and second pool\'s 0.2 is swept and compounded', async function () { const { manager } = await loadFixture(sweepPostThirdUserDepositFixture) - const bufferedStake = await manager.getBufferedStake() + const bufferedStake = await manager.getBufferedBalance() expect(ethers.utils.formatEther(bufferedStake)).equal('0.3') }) @@ -139,19 +139,30 @@ describe('Casimir manager', async function () { it('A loss is reported and brings the active stake below expected', async function () { const { manager } = await loadFixture(activeBalanceLossFixture) - const activeStake = await manager.getActiveStake() + const activeStake = await manager.getLatestActiveBalance() expect(ethers.utils.formatEther(activeStake)).equal('126.0') }) it('Gains are reported and bring the active stake back to expected', async function () { const { manager } = await loadFixture(activeBalanceRecoveryFixture) - const activeStake = await manager.getActiveStake() + const activeStake = await manager.getLatestActiveBalance() expect(ethers.utils.formatEther(activeStake)).equal('128.0') }) + it('Third user full withdrawal is completed on exit report', async function () { + const { manager, firstUser, secondUser, thirdUser, fourthUser } = await loadFixture(thirdUserFullWithdrawalFixture) + console.log('Third user full withdrawal is completed on exit report') + const stake = await manager.getTotalStake() + const firstStake = await manager.getUserStake(firstUser.address) + const secondStake = await manager.getUserStake(secondUser.address) + const thirdStake = await manager.getUserStake(thirdUser.address) + const fourthStake = await manager.getUserStake(fourthUser.address) + console.log(stake.toString(), firstStake.toString(), secondStake.toString(), thirdStake.toString(), fourthStake.toString()) + }) + it('Check more rewards and dust', async function () { const { manager, firstUser, secondUser, thirdUser, fourthUser } = await loadFixture(simulationFixture) - const stake = await manager.getStake() + const stake = await manager.getTotalStake() const firstStake = await manager.getUserStake(firstUser.address) const secondStake = await manager.getUserStake(secondUser.address) const thirdStake = await manager.getUserStake(thirdUser.address) @@ -164,7 +175,7 @@ describe('Casimir manager', async function () { console.log('👤 Second user stake', ethers.utils.formatEther(secondStake)) console.log('👤 Third user stake', ethers.utils.formatEther(thirdStake)) console.log('👤 Fourth user stake', ethers.utils.formatEther(fourthStake)) - const openDeposits = await manager.getOpenDeposits() + const openDeposits = await manager.getPrepoolBalance() console.log('📦 Open deposits', ethers.utils.formatEther(openDeposits)) const dust = stake.sub(firstStake.add(secondStake).add(thirdStake).add(fourthStake)) if (dust !== ethers.utils.parseEther('0.0')) { diff --git a/contracts/ethereum/test/packing.ts b/contracts/ethereum/test/packing.ts new file mode 100644 index 000000000..1cd5c5701 --- /dev/null +++ b/contracts/ethereum/test/packing.ts @@ -0,0 +1,17 @@ +// import { packResponse, unpackResponse } from '../helpers/upkeep' +// import { expect } from 'chai' + +// describe('Pack/unpack', function() { +// it('Should correctly pack and unpack the summary response', function() { +// const packed = packResponse({ +// values: ['32105000000', '1', '0', '0', '0'], +// bits: [128, 32, 32, 32, 32] +// }) +// const unpacked = unpackResponse({ packed: packed.toString(), bits: [128, 32, 32, 32, 32] }) +// expect(unpacked[0]).to.equal('32105000000') +// expect(unpacked[1]).to.equal('1') +// expect(unpacked[2]).to.equal('0') +// expect(unpacked[3]).to.equal('0') +// expect(unpacked[4]).to.equal('0') +// }) +// }) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 3c02abffd..908fc8d86 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2072,10 +2072,6 @@ "resolved": "common/data", "link": true }, - "node_modules/@casimir/validators": { - "resolved": "services/dkg", - "link": true - }, "node_modules/@casimir/ethereum": { "resolved": "contracts/ethereum", "link": true @@ -2088,6 +2084,10 @@ "resolved": "apps/landing", "link": true }, + "node_modules/@casimir/oracle": { + "resolved": "services/oracle", + "link": true + }, "node_modules/@casimir/speculos": { "resolved": "common/speculos", "link": true @@ -7181,6 +7181,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -7189,6 +7190,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -7363,6 +7365,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, "engines": { "node": ">=8" } @@ -8994,6 +8997,7 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", + "dev": true, "engines": { "node": ">= 0.8.0" } @@ -9433,6 +9437,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -9443,7 +9448,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==", + "dev": true }, "node_modules/colorette": { "version": "2.0.20", @@ -13187,6 +13193,7 @@ "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, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -14924,6 +14931,7 @@ "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, "engines": { "node": ">= 4" } @@ -17587,7 +17595,9 @@ "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "peer": true }, "node_modules/lodash.uniqby": { "version": "4.7.0", @@ -21389,6 +21399,7 @@ "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, "engines": { "node": ">=0.10.0" } @@ -22847,6 +22858,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -23252,6 +23264,8 @@ "version": "6.8.1", "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "peer": true, "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -23300,6 +23314,8 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -23314,12 +23330,16 @@ "node_modules/table/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==", + "dev": true, + "peer": true }, "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, + "peer": true, "engines": { "node": ">=8" } @@ -23327,12 +23347,16 @@ "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", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "peer": true }, "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, + "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -23349,6 +23373,8 @@ "version": "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, + "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -27216,6 +27242,7 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "dev": true, "engines": { "node": ">= 14" } @@ -27501,7 +27528,24 @@ } }, "services/dkg": { - "name": "@casimir/validators", + "name": "@casimir/oracle", + "version": "0.0.1", + "extraneous": true, + "dependencies": { + "ethers": "^5.7.2" + }, + "devDependencies": { + "@types/cors": "^2.8.12", + "@types/jest": "^29.4.0", + "@types/node": "^17.0.38", + "dotenv": "^16.0.3", + "esbuild": "^0.15.9", + "esno": "^0.16.3", + "zx": "^7.1.1" + } + }, + "services/oracle": { + "name": "@casimir/oracle", "version": "0.0.1", "dependencies": { "ethers": "^5.7.2" @@ -27516,7 +27560,7 @@ "zx": "^7.1.1" } }, - "services/dkg/node_modules/esbuild": { + "services/oracle/node_modules/esbuild": { "version": "0.15.18", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", diff --git a/scripts/ethereum/dev.ts b/scripts/ethereum/dev.ts index 0c32ebcf2..5a599c637 100644 --- a/scripts/ethereum/dev.ts +++ b/scripts/ethereum/dev.ts @@ -82,10 +82,10 @@ void async function () { /** Start local oracle */ process.env.ETHEREUM_RPC_URL = 'http://localhost:8545' - $`npm run dev --workspace @casimir/validators` + $`npm run dev --workspace @casimir/oracle` process.on('SIGINT', () => { - const messes = ['validators'] + const messes = ['oracle'] if (clean) { const cleaners = messes.map(mess => `npm run clean --workspace @casimir/${mess}`).join(' & ') console.log(`\n🧹 Cleaning up: ${messes.map(mess => `@casimir/${mess}`).join(', ')}`) diff --git a/scripts/local/dev.ts b/scripts/local/dev.ts index 1efaf501b..f7c09eed8 100644 --- a/scripts/local/dev.ts +++ b/scripts/local/dev.ts @@ -147,7 +147,7 @@ void async function () { $`npm run dev --workspace @casimir/${app}` process.on('SIGINT', () => { - const messes = ['data', 'validators'] + const messes = ['data', 'oracle'] if (clean) { const cleaners = messes.map(mess => `npm run clean --workspace @casimir/${mess}`).join(' & ') console.log(`\n🧹 Cleaning up: ${messes.map(mess => `@casimir/${mess}`).join(', ')}`) diff --git a/services/validators/.gitignore b/services/oracle/.gitignore similarity index 100% rename from services/validators/.gitignore rename to services/oracle/.gitignore diff --git a/services/validators/README.md b/services/oracle/README.md similarity index 92% rename from services/validators/README.md rename to services/oracle/README.md index 5b15ce079..8756e44b6 100644 --- a/services/validators/README.md +++ b/services/oracle/README.md @@ -1,4 +1,4 @@ -# @casimir/validators +# @casimir/oracle Casimir validators oracle service @@ -8,7 +8,7 @@ The validator oracle service initiates and reports on validator operations: dist DKG operations and reports will theoretically have [verifiable](https://docs.obol.tech/docs/next/charon/dkg#dkg-verification) aspects that prove fair DKG ceremonies. -> 🚩 The deployment strategy, including the API security, of this service is a WIP, and will be done in a way that allows for easy upgrades and/or replacement with a contract-native DKG trigger mechanism. Casimir is researching the best approach to trustless operations in collaboration with Chainlink, SSV, and RockX, and the @casimir/validators service will prioritize a combination of security and decentralization as much as possible. +> 🚩 The deployment strategy, including the API security, of this service is a WIP, and will be done in a way that allows for easy upgrades and/or replacement with a contract-native DKG trigger mechanism. Casimir is researching the best approach to trustless operations in collaboration with Chainlink, SSV, and RockX, and the @casimir/oracle service will prioritize a combination of security and decentralization as much as possible. ### Future diff --git a/services/validators/package.json b/services/oracle/package.json similarity index 87% rename from services/validators/package.json rename to services/oracle/package.json index 1415fd45f..c911d3c95 100644 --- a/services/validators/package.json +++ b/services/oracle/package.json @@ -1,7 +1,7 @@ { - "name": "@casimir/validators", + "name": "@casimir/oracle", "version": "0.0.1", - "description": "Casimir validators oracle service", + "description": "Casimir oracle service", "main": "dist/index.js", "scripts": { "build": "tsc", diff --git a/services/validators/scripts/clean.ts b/services/oracle/scripts/clean.ts similarity index 100% rename from services/validators/scripts/clean.ts rename to services/oracle/scripts/clean.ts diff --git a/services/validators/scripts/dev.ts b/services/oracle/scripts/dev.ts similarity index 100% rename from services/validators/scripts/dev.ts rename to services/oracle/scripts/dev.ts diff --git a/services/validators/scripts/resources/rockx-dkg-cli b/services/oracle/scripts/resources/rockx-dkg-cli similarity index 100% rename from services/validators/scripts/resources/rockx-dkg-cli rename to services/oracle/scripts/resources/rockx-dkg-cli diff --git a/services/validators/src/index.ts b/services/oracle/src/index.ts similarity index 97% rename from services/validators/src/index.ts rename to services/oracle/src/index.ts index 7aa9c6b0b..311b4769d 100644 --- a/services/validators/src/index.ts +++ b/services/oracle/src/index.ts @@ -19,7 +19,7 @@ const { provider, signer, manager, cliPath, messengerUrl } = config() const handler = handlers[details.event as keyof typeof handlers] if (!handler) throw new Error(`No handler found for event ${details.event}`) - await handler({ provider, signer, manager, cliPath, messengerUrl, id: id }) + await handler({ provider, signer, manager, cliPath, messengerUrl, id }) } })() diff --git a/services/validators/src/interfaces/CreateValidatorInput.ts b/services/oracle/src/interfaces/CreateValidatorInput.ts similarity index 100% rename from services/validators/src/interfaces/CreateValidatorInput.ts rename to services/oracle/src/interfaces/CreateValidatorInput.ts diff --git a/services/validators/src/interfaces/DKGOptions.ts b/services/oracle/src/interfaces/DKGOptions.ts similarity index 100% rename from services/validators/src/interfaces/DKGOptions.ts rename to services/oracle/src/interfaces/DKGOptions.ts diff --git a/services/validators/src/interfaces/DepositData.ts b/services/oracle/src/interfaces/DepositData.ts similarity index 100% rename from services/validators/src/interfaces/DepositData.ts rename to services/oracle/src/interfaces/DepositData.ts diff --git a/services/validators/src/interfaces/DepositDataInput.ts b/services/oracle/src/interfaces/DepositDataInput.ts similarity index 100% rename from services/validators/src/interfaces/DepositDataInput.ts rename to services/oracle/src/interfaces/DepositDataInput.ts diff --git a/services/validators/src/interfaces/HandlerInput.ts b/services/oracle/src/interfaces/HandlerInput.ts similarity index 100% rename from services/validators/src/interfaces/HandlerInput.ts rename to services/oracle/src/interfaces/HandlerInput.ts diff --git a/services/validators/src/interfaces/KeygenInput.ts b/services/oracle/src/interfaces/KeygenInput.ts similarity index 100% rename from services/validators/src/interfaces/KeygenInput.ts rename to services/oracle/src/interfaces/KeygenInput.ts diff --git a/services/validators/src/interfaces/ReshareInput.ts b/services/oracle/src/interfaces/ReshareInput.ts similarity index 100% rename from services/validators/src/interfaces/ReshareInput.ts rename to services/oracle/src/interfaces/ReshareInput.ts diff --git a/services/validators/src/interfaces/ReshareValidatorInput.ts b/services/oracle/src/interfaces/ReshareValidatorInput.ts similarity index 100% rename from services/validators/src/interfaces/ReshareValidatorInput.ts rename to services/oracle/src/interfaces/ReshareValidatorInput.ts diff --git a/services/validators/src/providers/config.ts b/services/oracle/src/providers/config.ts similarity index 100% rename from services/validators/src/providers/config.ts rename to services/oracle/src/providers/config.ts diff --git a/services/validators/src/providers/dkg.ts b/services/oracle/src/providers/dkg.ts similarity index 100% rename from services/validators/src/providers/dkg.ts rename to services/oracle/src/providers/dkg.ts diff --git a/services/validators/src/providers/events.ts b/services/oracle/src/providers/events.ts similarity index 100% rename from services/validators/src/providers/events.ts rename to services/oracle/src/providers/events.ts diff --git a/services/validators/src/providers/handlers.ts b/services/oracle/src/providers/handlers.ts similarity index 98% rename from services/validators/src/providers/handlers.ts rename to services/oracle/src/providers/handlers.ts index b53142f71..b3b691b10 100644 --- a/services/validators/src/providers/handlers.ts +++ b/services/oracle/src/providers/handlers.ts @@ -24,21 +24,21 @@ export async function initiatePoolDepositHandler(input: HandlerInput) { const { depositDataRoot, publicKey, + signature, + withdrawalCredentials, operatorIds, shares, - cluster, - signature, - withdrawalCredentials + cluster } = validator const initiatePoolDeposit = await (manager.connect(signer) as CasimirManager & ethers.Contract).initiatePoolDeposit( depositDataRoot, publicKey, + signature, + withdrawalCredentials, operatorIds, shares, cluster, - signature, - withdrawalCredentials, ethers.utils.parseEther('0.1') // Mock fee amount estimate ~ 10 SSV ) await initiatePoolDeposit.wait() diff --git a/services/validators/src/providers/iterables.ts b/services/oracle/src/providers/iterables.ts similarity index 100% rename from services/validators/src/providers/iterables.ts rename to services/oracle/src/providers/iterables.ts diff --git a/services/validators/tsconfig.json b/services/oracle/tsconfig.json similarity index 100% rename from services/validators/tsconfig.json rename to services/oracle/tsconfig.json From 7bceb2f803f546e4ef4286cb15d9af7541595dae Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Mon, 29 May 2023 17:45:50 -0400 Subject: [PATCH 39/78] Fix exit test --- contracts/ethereum/docs/index.md | 1378 ++++++++--------- contracts/ethereum/helpers/oracle.ts | 27 +- contracts/ethereum/scripts/dev.ts | 24 +- contracts/ethereum/src/CasimirManager.sol | 60 +- contracts/ethereum/src/CasimirUpkeep.sol | 106 +- .../src/interfaces/ICasimirManager.sol | 6 + contracts/ethereum/test/fixtures/shared.ts | 19 +- contracts/ethereum/test/integration.ts | 8 +- services/oracle/README.md | 2 +- services/oracle/src/index.ts | 2 +- .../oracle/src/interfaces/HandlerInput.ts | 4 +- services/oracle/src/providers/handlers.ts | 15 +- 12 files changed, 826 insertions(+), 825 deletions(-) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index ae55d6a13..8c703ed82 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -12,399 +12,442 @@ enum Token { } ``` -### latestActiveBalance +### finalizableExitedPoolCount ```solidity -uint256 latestActiveBalance +uint256 finalizableExitedPoolCount ``` -Latest active (consensus) balance +Exited pool count -### latestActiveStake +### constructor ```solidity -uint256 latestActiveStake +constructor(address _oracleAddress, address beaconDepositAddress, address functionsAddress, uint32 functionsSubscriptionId, address linkTokenAddress, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public ``` -Latest active (consensus) stake after fees +Constructor + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| _oracleAddress | address | The manager oracle address | +| beaconDepositAddress | address | The Beacon deposit address | +| functionsAddress | address | The Chainlink functions oracle address | +| functionsSubscriptionId | uint32 | The Chainlink functions subscription ID | +| linkTokenAddress | address | The Chainlink token address | +| ssvNetworkAddress | address | The SSV network address | +| ssvTokenAddress | address | The SSV token address | +| swapFactoryAddress | address | The Uniswap factory address | +| swapRouterAddress | address | The Uniswap router address | +| wethTokenAddress | address | The WETH contract address | -### lastPoolId +### receive ```solidity -uint32 lastPoolId +receive() external payable ``` -Last pool ID created +Redirect users to the deposit function -### stakeRatioSum +### depositStake ```solidity -uint256 stakeRatioSum +function depositStake() external payable ``` -Sum of scaled rewards to stake ratios (intial value required) +Deposit user stake -### ethFeePercent +### rebalanceStake ```solidity -uint32 ethFeePercent +function rebalanceStake(uint256 activeBalance, uint256 newSweptRewards, uint256 newDeposits, uint256 newExits) external ``` -ETH fee percentage +Rebalance the rewards to stake ratio and redistribute swept rewards + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| activeBalance | uint256 | The active consensus balance | +| newSweptRewards | uint256 | The swept consensus rewards | +| newDeposits | uint256 | The count of new deposits | +| newExits | uint256 | The count of new exits | -### linkFeePercent +### requestWithdrawal ```solidity -uint32 linkFeePercent +function requestWithdrawal(uint256 amount) external ``` -LINK fee percentage +Request to withdraw user stake + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| amount | uint256 | The amount of stake to withdraw | -### ssvFeePercent +### completePendingWithdrawals ```solidity -uint32 ssvFeePercent +function completePendingWithdrawals(uint256 count) external ``` -SSV fee percentage +Complete a given count of pending withdrawals + +#### Parameters -### constructor +| Name | Type | Description | +| ---- | ---- | ----------- | +| count | uint256 | The number of withdrawals to complete | + +### depositPool ```solidity -constructor(address beaconDepositAddress, address _dkgOracleAddress, address functionsOracleAddress, uint32 functionsSubscriptionId, address linkTokenAddress, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public +function depositPool(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount) external ``` -Constructor +Initiate the next ready pool #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| beaconDepositAddress | address | The Beacon deposit address | -| _dkgOracleAddress | address | The DKG oracle address | -| functionsOracleAddress | address | The Chainlink functions oracle address | -| functionsSubscriptionId | uint32 | The Chainlink functions subscription ID | -| linkTokenAddress | address | The Chainlink token address | -| ssvNetworkAddress | address | The SSV network address | -| ssvTokenAddress | address | The SSV token address | -| swapFactoryAddress | address | The Uniswap factory address | -| swapRouterAddress | address | The Uniswap router address | -| wethTokenAddress | address | The WETH contract address | +| depositDataRoot | bytes32 | The deposit data root | +| publicKey | bytes | The validator public key | +| signature | bytes | The signature | +| withdrawalCredentials | bytes | The withdrawal credentials | +| operatorIds | uint64[] | The operator IDs | +| shares | bytes | The operator shares | +| cluster | struct ISSVNetworkCore.Cluster | | +| feeAmount | uint256 | The fee amount | -### depositStake +### completePoolDeposits ```solidity -function depositStake() external payable +function completePoolDeposits(uint256 count) external ``` -Deposit user stake +Complete a given count of the next pending pools -### rebalanceStake +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| count | uint256 | The number of pools to complete | + +### reportPoolSlash ```solidity -function rebalanceStake(uint256 activeBalance, uint256 sweptRewards, uint256 sweptExits, uint32 depositCount, uint32 exitCount) external +function reportPoolSlash(uint32 poolId) external ``` -Rebalance the rewards to stake ratio and redistribute swept rewards +Report a pool slash #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| activeBalance | uint256 | The active consensus balance | -| sweptRewards | uint256 | The swept consensus rewards | -| sweptExits | uint256 | The swept consensus exits | -| depositCount | uint32 | | -| exitCount | uint32 | | +| poolId | uint32 | The pool ID | -### requestWithdrawal +### completePoolExit ```solidity -function requestWithdrawal(uint256 amount) external +function completePoolExit(uint256 poolIndex, uint256 finalEffectiveBalance, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external ``` -Request to withdraw user stake +Complete a pool exit #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| amount | uint256 | The amount of stake to withdraw | +| poolIndex | uint256 | The staked pool index | +| finalEffectiveBalance | uint256 | The final effective balance | +| blamePercents | uint32[] | The operator blame percents (0 if balance is 32 ether) | +| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | -### initiateRequestedWithdrawals +### setFeePercents ```solidity -function initiateRequestedWithdrawals(uint256 count) external +function setFeePercents(uint32 _ethFeePercent, uint32 _linkFeePercent, uint32 _ssvFeePercent) external ``` -Initiate a given count of requested withdrawals +_Update fee percentages_ #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| count | uint256 | The number of withdrawals to initiate | +| _ethFeePercent | uint32 | The new ETH fee percentage | +| _linkFeePercent | uint32 | The new LINK fee percentage | +| _ssvFeePercent | uint32 | The new SSV fee percentage | -### completePendingWithdrawals +### setFunctionsAddress ```solidity -function completePendingWithdrawals(uint256 count) external +function setFunctionsAddress(address functionsAddress) external ``` -Complete a given count of pending withdrawals +Update the functions oracle address #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| count | uint256 | The number of withdrawals to complete | +| functionsAddress | address | New functions oracle address | -### initiatePoolDeposit +### getUserStake ```solidity -function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, bytes signature, bytes withdrawalCredentials, uint256 feeAmount) external +function getUserStake(address userAddress) public view returns (uint256 userStake) ``` -Initiate the next ready pool +Get the total user stake for a given user address #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| depositDataRoot | bytes32 | The deposit data root | -| publicKey | bytes | The validator public key | -| operatorIds | uint64[] | The operator IDs | -| shares | bytes | The operator shares | -| cluster | struct ISSVNetworkCore.Cluster | | -| signature | bytes | The signature | -| withdrawalCredentials | bytes | The withdrawal credentials | -| feeAmount | uint256 | The fee amount | +| userAddress | address | The user address | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| userStake | uint256 | The total user stake | -### requestPoolExits +### getTotalStake ```solidity -function requestPoolExits(uint256 count) external +function getTotalStake() public view returns (uint256 totalStake) ``` -Request a given count of staked pool exits +Get the total stake -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| count | uint256 | The number of exits to request | +| totalStake | uint256 | The total stake | -### completePoolExit +### getBufferedBalance ```solidity -function completePoolExit(uint256 poolIndex, uint256 validatorIndex) external +function getBufferedBalance() public view returns (uint256 bufferedBalance) ``` -Complete a pool exit +Get the buffered balance -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| poolIndex | uint256 | The staked pool index | -| validatorIndex | uint256 | The staked validator (internal) index | +| bufferedBalance | uint256 | The buffered balance | -### registerOperator +### getReadyBalance ```solidity -function registerOperator(uint32 operatorId) external payable +function getReadyBalance() public view returns (uint256 readyBalance) ``` -Register an operator with the pool manager +Get the ready balance -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint32 | The operator ID | +| readyBalance | uint256 | The ready balance | -### resharePool +### getPendingBalance ```solidity -function resharePool(uint32 poolId, uint64[] operatorIds, bytes shares) external +function getPendingBalance() public view returns (uint256 pendingBalance) ``` -Reshare a given pool's validator +Get the pending balance -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | -| operatorIds | uint64[] | The operator IDs | -| shares | bytes | The operator shares | +| pendingBalance | uint256 | The pending balance | -### setFeePercents +### getWithdrawableBalance ```solidity -function setFeePercents(uint32 _ethFeePercent, uint32 _linkFeePercent, uint32 _ssvFeePercent) external +function getWithdrawableBalance() public view returns (uint256) ``` -_Update fee percentages_ +Get the withdrawable balanace -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| _ethFeePercent | uint32 | The new ETH fee percentage | -| _linkFeePercent | uint32 | The new LINK fee percentage | -| _ssvFeePercent | uint32 | The new SSV fee percentage | +| [0] | uint256 | withdrawableBalance The withdrawable balanace | -### setOracleAddress +### getReservedFees ```solidity -function setOracleAddress(address oracle) external +function getReservedFees() public view returns (uint256) ``` -Update the functions oracle address +Get the reserved fees -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| oracle | address | New oracle address | +| [0] | uint256 | reservedFees The reserved fees | -### getStake +### getSweptBalance ```solidity -function getTotalStake() public view returns (uint256 stake) +function getSweptBalance() public view returns (uint256 balance) ``` -Get the manager stake +Get the swept balance #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| stake | uint256 | The manager stake | +| balance | uint256 | The swept balance | -### getBufferedStake +### getExpectedEffectiveBalance ```solidity -function getBufferedStake() public view returns (uint256 stake) +function getExpectedEffectiveBalance() public view returns (uint256 expectedEffectiveBalance) ``` -Get the manager buffered (execution) stake +Get the expected effective balance #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| stake | uint256 | The manager buffered (execution) stake | +| expectedEffectiveBalance | uint256 | The expected effective balance | -### getPendingStake +### getReportPeriod ```solidity -function getPendingStake() public view returns (uint256 stake) +function getReportPeriod() public view returns (uint32) ``` -Get the manager pending (consensus) stake +Get the report period #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| stake | uint256 | The manager pending (consensus) stake | +| [0] | uint32 | reportPeriod The report period | -### getActiveStake +### getLatestActiveBalance ```solidity -function getActiveStake() public view returns (uint256 stake) +function getLatestActiveBalance() public view returns (uint256) ``` -Get the manager active (consensus) stake +Get the latest active balance #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| stake | uint256 | The manager active (consensus) stake | +| [0] | uint256 | activeBalance The latest active balance | -### getUserStake +### getLatestActiveBalanceAfterFees ```solidity -function getUserStake(address userAddress) public view returns (uint256 userStake) +function getLatestActiveBalanceAfterFees() public view returns (uint256) ``` -Get the total user stake for a given user address +Get the latest active balance after fees -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| userAddress | address | The user address | +| [0] | uint256 | activeBalanceAfterFees The latest active balance after fees | + +### getLatestActiveRewards + +```solidity +function getLatestActiveRewards() public view returns (int256) +``` + +Get the latest active rewards #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| userStake | uint256 | The total user stake | +| [0] | int256 | activeRewards The latest active rewards | -### getReservedFees +### getFinalizableExitedBalance ```solidity -function getReservedFees() public view returns (uint256) +function getFinalizableExitedBalance() public view returns (uint256) ``` -Get the manager reserved fees +Get the finalizable exited balance #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | reservedFees The manager reserved fees | +| [0] | uint256 | finalizableExitedBalance The finalizable exited balance | -### getSweptBalance +### getFinalizableExitedPoolCount ```solidity -function getSweptBalance() public view returns (uint256 balance) +function getFinalizableExitedPoolCount() public view returns (uint256) ``` -Get the manager swept balance +Get the finalizable exited pool count #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| balance | uint256 | The manager swept balance | +| [0] | uint256 | finalizableExitedPoolCount The finalizable exited pool count | -### getFeePercent +### getPendingWithdrawalQueue ```solidity -function getFeePercent() public view returns (uint32 feePercent) +function getPendingWithdrawalQueue() public view returns (struct ICasimirManager.Withdrawal[]) ``` -Get the total fee percentage +Get the pending withdrawal queue #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| feePercent | uint32 | The total fee percentage | +| [0] | struct ICasimirManager.Withdrawal[] | pendingWithdrawalQueue The pending withdrawal queue | -### getRequestedWithdrawals +### getPendingWithdrawalEligibility ```solidity -function getRequestedWithdrawals() external view returns (uint256) +function getPendingWithdrawalEligibility(uint256 index, uint256 period) public view returns (bool) ``` -Get the total requested withdrawals +Get the eligibility of a pending withdrawal #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | requestedWithdrawals The total requested withdrawals | +| [0] | bool | pendingWithdrawalEligibility The eligibility of a pending withdrawal | ### getPendingWithdrawals ```solidity -function getPendingWithdrawals() external view returns (uint256) +function getPendingWithdrawals() public view returns (uint256) ``` Get the total pending withdrawals @@ -415,47 +458,47 @@ Get the total pending withdrawals | ---- | ---- | ----------- | | [0] | uint256 | pendingWithdrawals The total pending withdrawals | -### getRequestedWithdrawalQueue +### getPendingWithdrawalCount ```solidity -function getRequestedWithdrawalQueue() external view returns (struct ICasimirManager.Withdrawal[]) +function getPendingWithdrawalCount() public view returns (uint256) ``` -Get the requested withdrawal queue +Get the total pending withdrawal count #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | struct ICasimirManager.Withdrawal[] | requestedWithdrawalQueue The requested withdrawal queue | +| [0] | uint256 | pendingWithdrawalCount The total pending withdrawal count | -### getPendingWithdrawalQueue +### getFeePercent ```solidity -function getPendingWithdrawalQueue() external view returns (struct ICasimirManager.Withdrawal[]) +function getFeePercent() public view returns (uint32) ``` -Get the pending withdrawal queue +Get the total fee percentage #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | struct ICasimirManager.Withdrawal[] | pendingWithdrawalQueue The pending withdrawal queue | +| [0] | uint32 | feePercent The total fee percentage | ### getDepositedPoolCount ```solidity -function getDepositedPoolCount() external view returns (bytes[]) +function getDepositedPoolCount() external view returns (uint256) ``` -Get validator public keys +Get the count of active pools #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes[] | A list of pending and active validator public keys | +| [0] | uint256 | depositedPoolCount The count of active pools | ### getExitingPoolCount @@ -463,13 +506,13 @@ Get validator public keys function getExitingPoolCount() external view returns (uint256) ``` -Get the count of exiting validators +Get the count of exiting pools #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | The count of exiting validators | +| [0] | uint256 | exitingPoolCount The count of exiting pools | ### getReadyPoolIds @@ -477,13 +520,13 @@ Get the count of exiting validators function getReadyPoolIds() external view returns (uint32[]) ``` -Get a list of all ready pool IDs +Get the ready pool IDs #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32[] | A list of all ready pool IDs | +| [0] | uint32[] | readyPoolIds The ready pool IDs | ### getPendingPoolIds @@ -491,13 +534,13 @@ Get a list of all ready pool IDs function getPendingPoolIds() external view returns (uint32[]) ``` -Get a list of all pending pool IDs +Get the pending pool IDs #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32[] | A list of all pending pool IDs | +| [0] | uint32[] | pendingPoolIds The pending pool IDs | ### getStakedPoolIds @@ -505,27 +548,27 @@ Get a list of all pending pool IDs function getStakedPoolIds() external view returns (uint32[]) ``` -Get a list of all staked pool IDs +Get the staked pool IDs #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32[] | A list of all staked pool IDs | +| [0] | uint32[] | stakedPoolIds The staked pool IDs | -### getOpenDeposits +### getPrepoolBalance ```solidity -function getOpenDeposits() external view returns (uint256) +function getPrepoolBalance() external view returns (uint256) ``` -Get the total manager open deposits +Get the pre-pool balance #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | The total manager open deposits | +| [0] | uint256 | prepoolBalance The pre-pool balance | ### getPool @@ -559,7 +602,7 @@ Get the ETH fee percentage to charge on each deposit | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32 | The ETH fee percentage to charge on each deposit | +| [0] | uint32 | ethFeePercent The ETH fee percentage to charge on each deposit | ### getLINKFeePercent @@ -573,7 +616,7 @@ Get the LINK fee percentage to charge on each deposit | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32 | The LINK fee percentage to charge on each deposit | +| [0] | uint32 | linkFeePercent The LINK fee percentage to charge on each deposit | ### getSSVFeePercent @@ -587,7 +630,7 @@ Get the SSV fee percentage to charge on each deposit | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32 | The SSV fee percentage to charge on each deposit | +| [0] | uint32 | ssvFeePercent The SSV fee percentage to charge on each deposit | ### getSSVNetworkAddress @@ -617,161 +660,295 @@ Get the upkeep address | ---- | ---- | ----------- | | upkeepAddress | address | The upkeep address | +## CasimirRecipient + ### receive ```solidity receive() external payable ``` -_Will be removed in production -Used for mocking sweeps from Beacon to the manager_ - -## CasimirUpkeep +## CasimirRegistry -### reportHeartbeat +### requiredCollateral ```solidity -uint256 reportHeartbeat +uint256 requiredCollateral ``` -Oracle heartbeat - -### poolCapacity +### minimumCollateralDeposit ```solidity -uint256 poolCapacity +uint256 minimumCollateralDeposit ``` -Pool capacity - -### requestCBOR +### constructor ```solidity -bytes requestCBOR +constructor(address managerAddress, address ssvNetworkViewsAddress) public ``` -Binary request source code - -### latestRequestId +### registerOperator ```solidity -bytes32 latestRequestId +function registerOperator(uint64 operatorId) external payable ``` -Latest request ID +Register an operator with the set -### latestFulfilledRequestId - -```solidity -bytes32 latestFulfilledRequestId -``` +#### Parameters -Latest fulfilled request ID +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | -### fulfillGasLimit +### requestOperatorDeregistration ```solidity -uint32 fulfillGasLimit +function requestOperatorDeregistration(uint64 operatorId) external ``` -Fulfillment gas limit +Request to deregister an operator from the set -### constructor +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +### completeOperatorDeregistration ```solidity -constructor(address managerAddress, address functionsOracleAddress, uint64 _functionsSubscriptionId) public +function completeOperatorDeregistration(uint64 operatorId) external ``` -Constructor +Deregister an operator from the set #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| managerAddress | address | The manager contract address | -| functionsOracleAddress | address | The functions oracle contract address | -| _functionsSubscriptionId | uint64 | The functions subscription ID | +| operatorId | uint64 | The operator ID | -### generateRequest +### depositCollateral ```solidity -function generateRequest(string source, bytes secrets, string[] args) public pure returns (bytes) +function depositCollateral(uint64 operatorId) external payable ``` -Generate a new Functions.Request(off-chain, saving gas) +Deposit collateral for an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| source | string | JavaScript source code | -| secrets | bytes | Encrypted secrets payload | -| args | string[] | List of arguments accessible from within the source code | +| operatorId | uint64 | The operator ID | -### setRequest +### setOperatorCollateral ```solidity -function setRequest(uint32 _fulfillGasLimit, uint64 _functionsSubscriptionId, bytes _requestCBOR) external +function setOperatorCollateral(uint64 operatorId, int256 collateral) external ``` -Set the bytes representing the CBOR-encoded Functions.Request +Set the collateral for an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | -| _functionsSubscriptionId | uint64 | The functions billing subscription ID used to pay for Functions requests | -| _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | +| operatorId | uint64 | The operator ID | +| collateral | int256 | The collateral | -### checkUpkeep +### getOperatorCollateral ```solidity -function checkUpkeep(bytes) public view returns (bool upkeepNeeded, bytes performData) +function getOperatorCollateral(uint64 operatorId) external view returns (int256) ``` -Check if the upkeep is needed +Get the collateral for an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| upkeepNeeded | bool | True if the upkeep is needed | -| performData | bytes | | +| [0] | int256 | The collateral | -### performUpkeep +## CasimirUpkeep + +### reportHeartbeat ```solidity -function performUpkeep(bytes) external +uint256 reportHeartbeat ``` -Perform the upkeep +Oracle heartbeat -### fulfillRequest +### poolCapacity ```solidity -function fulfillRequest(bytes32 requestId, bytes response, bytes err) internal +uint256 poolCapacity ``` -Callback that is invoked once the DON has resolved the request or hit an error +Pool capacity -#### Parameters +### remainingRequests -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The request ID, returned by sendRequest() | -| response | bytes | Aggregated response from the user code | -| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | +```solidity +uint256 remainingRequests +``` -### setOracleAddress +Current report remaining requests + +### currentPeriod ```solidity -function setOracleAddress(address newOracleAddress) external +uint256 currentPeriod ``` -Update the functions oracle address +Current report period -#### Parameters +### currentPendingPoolCount + +```solidity +uint256 currentPendingPoolCount +``` + +Current report pending pool count + +### currentExitingPoolCount + +```solidity +uint256 currentExitingPoolCount +``` + +Current report exiting pool count + +### currentRequestBlock + +```solidity +uint256 currentRequestBlock +``` + +Current report block + +### requestCBOR + +```solidity +bytes requestCBOR +``` + +Binary request source code + +### fulfillGasLimit + +```solidity +uint32 fulfillGasLimit +``` + +Fulfillment gas limit + +### constructor + +```solidity +constructor(address managerAddress, address functionsOracleAddress, uint64 _functionsSubscriptionId) public +``` + +Constructor + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| managerAddress | address | The manager contract address | +| functionsOracleAddress | address | The functions oracle contract address | +| _functionsSubscriptionId | uint64 | The functions subscription ID | + +### generateRequest + +```solidity +function generateRequest(string source, bytes secrets, string[] args) public pure returns (bytes) +``` + +Generate a new Functions.Request(off-chain, saving gas) + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| source | string | JavaScript source code | +| secrets | bytes | Encrypted secrets payload | +| args | string[] | List of arguments accessible from within the source code | + +### setRequest + +```solidity +function setRequest(uint32 _fulfillGasLimit, uint64 _functionsSubscriptionId, bytes _requestCBOR) external +``` + +Set the bytes representing the CBOR-encoded Functions.Request + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | +| _functionsSubscriptionId | uint64 | The functions billing subscription ID used to pay for Functions requests | +| _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | + +### checkUpkeep + +```solidity +function checkUpkeep(bytes) public view returns (bool upkeepNeeded, bytes) +``` + +Check if the upkeep is needed + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| upkeepNeeded | bool | True if the upkeep is needed | +| [1] | bytes | | + +### performUpkeep + +```solidity +function performUpkeep(bytes) external +``` + +Perform the upkeep + +### fulfillRequest + +```solidity +function fulfillRequest(bytes32 requestId, bytes response, bytes _error) internal +``` + +Callback that is invoked once the DON has resolved the request or hit an error + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| _error | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | + +### setOracleAddress + +```solidity +function setOracleAddress(address newOracleAddress) external +``` + +Update the functions oracle address + +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | @@ -811,13 +988,13 @@ struct ProcessedDeposit { struct Pool { uint256 deposits; bool exiting; - uint256 reshareCount; + bool slashed; bytes32 depositDataRoot; bytes publicKey; - uint64[] operatorIds; - bytes shares; bytes signature; bytes withdrawalCredentials; + uint64[] operatorIds; + bytes shares; } ``` @@ -836,6 +1013,7 @@ struct User { struct Withdrawal { address user; uint256 amount; + uint256 period; } ``` @@ -926,7 +1104,7 @@ function depositStake() external payable ### rebalanceStake ```solidity -function rebalanceStake(uint256 activeStake, uint256 sweptRewards, uint256 sweptExits, uint32 depositCount, uint32 exitCount) external +function rebalanceStake(uint256 activeBalance, uint256 newSweptRewards, uint256 newDeposits, uint256 newExits) external ``` ### requestWithdrawal @@ -935,34 +1113,28 @@ function rebalanceStake(uint256 activeStake, uint256 sweptRewards, uint256 swept function requestWithdrawal(uint256 amount) external ``` -### initiateRequestedWithdrawals - -```solidity -function initiateRequestedWithdrawals(uint256 count) external -``` - ### completePendingWithdrawals ```solidity function completePendingWithdrawals(uint256 count) external ``` -### initiatePoolDeposit +### depositPool ```solidity -function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, bytes signature, bytes withdrawalCredentials, uint256 feeAmount) external +function depositPool(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount) external ``` -### requestPoolExits +### completePoolDeposits ```solidity -function requestPoolExits(uint256 count) external +function completePoolDeposits(uint256 count) external ``` ### completePoolExit ```solidity -function completePoolExit(uint256 poolIndex, uint256 validatorIndex) external +function completePoolExit(uint256 poolIndex, uint256 finalEffectiveBalance, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external ``` ### setFeePercents @@ -971,10 +1143,10 @@ function completePoolExit(uint256 poolIndex, uint256 validatorIndex) external function setFeePercents(uint32 ethFeePercent, uint32 linkFeePercent, uint32 ssvFeePercent) external ``` -### setOracleAddress +### setFunctionsAddress ```solidity -function setOracleAddress(address oracleAddress) external +function setFunctionsAddress(address functionsAddress) external ``` ### getFeePercent @@ -1004,7 +1176,7 @@ function getSSVFeePercent() external view returns (uint32) ### getDepositedPoolCount ```solidity -function getDepositedPoolCount() external view returns (bytes[]) +function getDepositedPoolCount() external view returns (uint256) ``` ### getExitingPoolCount @@ -1031,28 +1203,76 @@ function getPendingPoolIds() external view returns (uint32[]) function getStakedPoolIds() external view returns (uint32[]) ``` -### getStake +### getTotalStake ```solidity function getTotalStake() external view returns (uint256) ``` -### getBufferedStake +### getBufferedBalance + +```solidity +function getBufferedBalance() external view returns (uint256) +``` + +### getExpectedEffectiveBalance ```solidity -function getBufferedStake() external view returns (uint256) +function getExpectedEffectiveBalance() external view returns (uint256) ``` -### getActiveStake +### getReportPeriod ```solidity -function getActiveStake() external view returns (uint256) +function getReportPeriod() external view returns (uint32) ``` -### getOpenDeposits +### getFinalizableExitedPoolCount ```solidity -function getOpenDeposits() external view returns (uint256) +function getFinalizableExitedPoolCount() external view returns (uint256) +``` + +### getFinalizableExitedBalance + +```solidity +function getFinalizableExitedBalance() external view returns (uint256) +``` + +### getLatestActiveBalance + +```solidity +function getLatestActiveBalance() external view returns (uint256) +``` + +### getLatestActiveBalanceAfterFees + +```solidity +function getLatestActiveBalanceAfterFees() external view returns (uint256) +``` + +### getPendingWithdrawalEligibility + +```solidity +function getPendingWithdrawalEligibility(uint256 index, uint256 period) external view returns (bool) +``` + +### getWithdrawableBalance + +```solidity +function getWithdrawableBalance() external view returns (uint256) +``` + +### getPrepoolBalance + +```solidity +function getPrepoolBalance() external view returns (uint256) +``` + +### getSweptBalance + +```solidity +function getSweptBalance() external view returns (uint256) ``` ### getUserStake @@ -1061,10 +1281,10 @@ function getOpenDeposits() external view returns (uint256) function getUserStake(address userAddress) external view returns (uint256) ``` -### getRequestedWithdrawals +### getPendingWithdrawalQueue ```solidity -function getRequestedWithdrawals() external view returns (uint256) +function getPendingWithdrawalQueue() external view returns (struct ICasimirManager.Withdrawal[]) ``` ### getPendingWithdrawals @@ -1073,27 +1293,102 @@ function getRequestedWithdrawals() external view returns (uint256) function getPendingWithdrawals() external view returns (uint256) ``` -### getRequestedWithdrawalQueue +### getPendingWithdrawalCount ```solidity -function getRequestedWithdrawalQueue() external view returns (struct ICasimirManager.Withdrawal[]) +function getPendingWithdrawalCount() external view returns (uint256) ``` -### getPendingWithdrawalQueue +## ICasimirRecipient + +## ICasimirRegistry + +### OperatorRegistered ```solidity -function getPendingWithdrawalQueue() external view returns (struct ICasimirManager.Withdrawal[]) +event OperatorRegistered(uint64 operatorId) +``` + +### OperatorDeregistrationRequested + +```solidity +event OperatorDeregistrationRequested(uint64 operatorId) +``` + +### OperatorDeregistrationCompleted + +```solidity +event OperatorDeregistrationCompleted(uint64 operatorId) +``` + +### Operator + +```solidity +struct Operator { + uint64 id; + int256 collateral; + uint256 poolCount; + bool deregistering; +} +``` + +### registerOperator + +```solidity +function registerOperator(uint64 operatorId) external payable +``` + +### requestOperatorDeregistration + +```solidity +function requestOperatorDeregistration(uint64 operatorId) external +``` + +### completeOperatorDeregistration + +```solidity +function completeOperatorDeregistration(uint64 operatorId) external +``` + +### depositCollateral + +```solidity +function depositCollateral(uint64 operatorId) external payable +``` + +### setOperatorCollateral + +```solidity +function setOperatorCollateral(uint64 operatorId, int256 collateral) external +``` + +### getOperatorCollateral + +```solidity +function getOperatorCollateral(uint64 operatorId) external view returns (int256) ``` ## ICasimirUpkeep -### OracleReport +### Status + +```solidity +enum Status { + FINALIZED, + REQUESTING, + PROCESSING +} +``` + +### RequestType ```solidity -struct OracleReport { - uint256 activeStake; - uint256 sweptRewards; - uint256 sweptExits; +enum RequestType { + NONE, + BALANCE, + DEPOSITS, + EXITS, + SLASHES } ``` @@ -1106,7 +1401,7 @@ event OCRResponse(bytes32 requestId, bytes result, bytes err) ### UpkeepPerformed ```solidity -event UpkeepPerformed(bytes performData) +event UpkeepPerformed(enum ICasimirUpkeep.Status status) ``` ### checkUpkeep @@ -1295,622 +1590,283 @@ Query the current deposit count. | ---- | ---- | ----------- | | [0] | bytes | The deposit count encoded as a little endian 64-bit number. | -## ISSVNetwork - -### OperatorAdded - -```solidity -event OperatorAdded(uint64 operatorId, address owner, bytes publicKey, uint256 fee) -``` - -_Emitted when a new operator has been added._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | operator's ID. | -| owner | address | Operator's ethereum address that can collect fees. | -| publicKey | bytes | Operator's public key. Will be used to encrypt secret shares of validators keys. | -| fee | uint256 | Operator's fee. | - -### OperatorRemoved - -```solidity -event OperatorRemoved(uint64 operatorId) -``` - -_Emitted when operator has been removed._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | operator's ID. | - -### OperatorWhitelistUpdated - -```solidity -event OperatorWhitelistUpdated(uint64 operatorId, address whitelisted) -``` - -_Emitted when the whitelist of an operator is updated._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | operator's ID. | -| whitelisted | address | operator's new whitelisted address. | +## IWETH9 -### ValidatorAdded +### deposit ```solidity -event ValidatorAdded(address owner, uint64[] operatorIds, bytes publicKey, bytes shares, struct ISSVNetworkCore.Cluster cluster) +function deposit() external payable ``` -_Emitted when the validator has been added._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| owner | address | | -| operatorIds | uint64[] | The operator ids list. | -| publicKey | bytes | The public key of a validator. | -| shares | bytes | snappy compressed shares(a set of encrypted and public shares). | -| cluster | struct ISSVNetworkCore.Cluster | All the cluster data. | +Deposit ether to get wrapped ether -### ValidatorRemoved +### withdraw ```solidity -event ValidatorRemoved(address owner, uint64[] operatorIds, bytes publicKey, struct ISSVNetworkCore.Cluster cluster) +function withdraw(uint256) external ``` -_Emitted when the validator is removed._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| owner | address | | -| operatorIds | uint64[] | The operator ids list. | -| publicKey | bytes | The public key of a validator. | -| cluster | struct ISSVNetworkCore.Cluster | All the cluster data. | - -### OperatorFeeDeclared +Withdraw wrapped ether to get ether -```solidity -event OperatorFeeDeclared(address owner, uint64 operatorId, uint256 blockNumber, uint256 fee) -``` +## MockFunctionsOracle -### OperatorFeeCancellationDeclared +### constructor ```solidity -event OperatorFeeCancellationDeclared(address owner, uint64 operatorId) +constructor() public ``` -### OperatorFeeExecuted +### getRegistry ```solidity -event OperatorFeeExecuted(address owner, uint64 operatorId, uint256 blockNumber, uint256 fee) +function getRegistry() external view returns (address) ``` -_Emitted when an operator's fee is updated._ +Returns the address of the registry contract -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| owner | address | Operator's owner. | -| operatorId | uint64 | | -| blockNumber | uint256 | from which block number. | -| fee | uint256 | updated fee value. | - -### ClusterLiquidated - -```solidity -event ClusterLiquidated(address owner, uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster) -``` - -### ClusterReactivated - -```solidity -event ClusterReactivated(address owner, uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster) -``` - -### OperatorFeeIncreaseLimitUpdated - -```solidity -event OperatorFeeIncreaseLimitUpdated(uint64 value) -``` - -### DeclareOperatorFeePeriodUpdated - -```solidity -event DeclareOperatorFeePeriodUpdated(uint64 value) -``` - -### ExecuteOperatorFeePeriodUpdated - -```solidity -event ExecuteOperatorFeePeriodUpdated(uint64 value) -``` +| [0] | address | address The address of the registry contract | -### LiquidationThresholdPeriodUpdated +### sendRequest ```solidity -event LiquidationThresholdPeriodUpdated(uint64 value) +function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) ``` -### MinimumLiquidationCollateralUpdated - -```solidity -event MinimumLiquidationCollateralUpdated(uint256 value) -``` - -### NetworkFeeUpdated - -```solidity -event NetworkFeeUpdated(uint256 oldFee, uint256 newFee) -``` - -_Emitted when the network fee is updated._ +Sends a request (encoded as data) using the provided subscriptionId #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| oldFee | uint256 | The old fee | -| newFee | uint256 | The new fee | - -### NetworkEarningsWithdrawn +| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | +| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| _gasLimit | uint32 | Gas limit for the fulfillment callback | -```solidity -event NetworkEarningsWithdrawn(uint256 value, address recipient) -``` - -_Emitted when transfer fees are withdrawn._ - -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| value | uint256 | The amount of tokens withdrawn. | -| recipient | address | The recipient address. | - -### ClusterWithdrawn +| requestId | bytes32 | A unique request identifier (unique per DON) | -```solidity -event ClusterWithdrawn(address owner, uint64[] operatorIds, uint256 value, struct ISSVNetworkCore.Cluster cluster) -``` +## CasimirOracle -### OperatorWithdrawn +### sayHello ```solidity -event OperatorWithdrawn(address owner, uint64 operatorId, uint256 value) +function sayHello() external pure returns (string) ``` -### ClusterDeposited +## ICasimirOracle -```solidity -event ClusterDeposited(address owner, uint64[] operatorIds, uint256 value, struct ISSVNetworkCore.Cluster cluster) -``` - -### FeeRecipientAddressUpdated +### sayHello ```solidity -event FeeRecipientAddressUpdated(address owner, address recipientAddress) +function sayHello() external view returns (string) ``` -### initialize - -```solidity -function initialize(string initialVersion_, contract IERC20 token_, uint64 operatorMaxFeeIncrease_, uint64 declareOperatorFeePeriod_, uint64 executeOperatorFeePeriod_, uint64 minimumBlocksBeforeLiquidation_, uint256 minimumLiquidationCollateral_) external -``` - -_Initializes the contract._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| initialVersion_ | string | | -| token_ | contract IERC20 | The network token. | -| operatorMaxFeeIncrease_ | uint64 | The step limit to increase the operator fee | -| declareOperatorFeePeriod_ | uint64 | The period an operator needs to wait before they can approve their fee. | -| executeOperatorFeePeriod_ | uint64 | The length of the period in which an operator can approve their fee. | -| minimumBlocksBeforeLiquidation_ | uint64 | | -| minimumLiquidationCollateral_ | uint256 | | - -### registerOperator - -```solidity -function registerOperator(bytes publicKey, uint256 fee) external returns (uint64) -``` - -_Registers a new operator._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| publicKey | bytes | Operator's public key. Used to encrypt secret shares of validators keys. | -| fee | uint256 | operator's fee. When fee is set to zero (mostly for private operators), it can not be increased. | - -### removeOperator - -```solidity -function removeOperator(uint64 operatorId) external -``` - -_Removes an operator._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | Operator's id. | +## CasimirDAO -### setOperatorWhitelist +### owners ```solidity -function setOperatorWhitelist(uint64 operatorId, address whitelisted) external +address[] owners ``` -### declareOperatorFee +### isOwner ```solidity -function declareOperatorFee(uint64 operatorId, uint256 fee) external +mapping(address => bool) isOwner ``` -### executeOperatorFee +### numConfirmationsRequired ```solidity -function executeOperatorFee(uint64 operatorId) external +uint256 numConfirmationsRequired ``` -### cancelDeclaredOperatorFee +### isConfirmed ```solidity -function cancelDeclaredOperatorFee(uint64 operatorId) external +mapping(uint256 => mapping(address => bool)) isConfirmed ``` -### reduceOperatorFee +### transactions ```solidity -function reduceOperatorFee(uint64 operatorId, uint256 fee) external +struct ICasimirDAO.Transaction[] transactions ``` -### setFeeRecipientAddress +### onlyOwner ```solidity -function setFeeRecipientAddress(address feeRecipientAddress) external +modifier onlyOwner() ``` -### registerValidator +### txExists ```solidity -function registerValidator(bytes publicKey, uint64[] operatorIds, bytes sharesEncrypted, uint256 amount, struct ISSVNetworkCore.Cluster cluster) external +modifier txExists(uint256 _txIndex) ``` -### removeValidator +### notExecuted ```solidity -function removeValidator(bytes publicKey, uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster) external +modifier notExecuted(uint256 _txIndex) ``` -### liquidate +### notConfirmed ```solidity -function liquidate(address owner, uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster) external +modifier notConfirmed(uint256 _txIndex) ``` -### reactivate - -```solidity -function reactivate(uint64[] operatorIds, uint256 amount, struct ISSVNetworkCore.Cluster cluster) external -``` - -### deposit - -```solidity -function deposit(address owner, uint64[] operatorIds, uint256 amount, struct ISSVNetworkCore.Cluster cluster) external -``` - -### withdrawOperatorEarnings - -```solidity -function withdrawOperatorEarnings(uint64 operatorId, uint256 tokenAmount) external -``` - -### withdrawOperatorEarnings +### constructor ```solidity -function withdrawOperatorEarnings(uint64 operatorId) external +constructor(address[] _owners, uint256 _numConfirmationsRequired) public ``` -### withdraw +### receive ```solidity -function withdraw(uint64[] operatorIds, uint256 tokenAmount, struct ISSVNetworkCore.Cluster cluster) external +receive() external payable ``` -### updateNetworkFee +### submitTransaction ```solidity -function updateNetworkFee(uint256 fee) external +function submitTransaction(address _to, uint256 _value, bytes _data) public ``` -### withdrawNetworkEarnings +### confirmTransaction ```solidity -function withdrawNetworkEarnings(uint256 amount) external +function confirmTransaction(uint256 _txIndex) public ``` -### updateOperatorFeeIncreaseLimit +### executeTransaction ```solidity -function updateOperatorFeeIncreaseLimit(uint64 newOperatorMaxFeeIncrease) external +function executeTransaction(uint256 _txIndex) public ``` -### updateDeclareOperatorFeePeriod +### revokeConfirmation ```solidity -function updateDeclareOperatorFeePeriod(uint64 newDeclareOperatorFeePeriod) external +function revokeConfirmation(uint256 _txIndex) public ``` -### updateExecuteOperatorFeePeriod +### getOwners ```solidity -function updateExecuteOperatorFeePeriod(uint64 newExecuteOperatorFeePeriod) external +function getOwners() public view returns (address[]) ``` -### updateLiquidationThresholdPeriod +### getTransactionCount ```solidity -function updateLiquidationThresholdPeriod(uint64 blocks) external +function getTransactionCount() public view returns (uint256) ``` -### updateMinimumLiquidationCollateral +### getTransaction ```solidity -function updateMinimumLiquidationCollateral(uint256 amount) external +function getTransaction(uint256 _txIndex) public view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) ``` -## ISSVNetworkCore - -### Validator - -```solidity -struct Validator { - address owner; - bool active; -} -``` +## ICasimirDAO -### Snapshot +### Deposit ```solidity -struct Snapshot { - uint64 block; - uint64 index; - uint64 balance; -} +event Deposit(address sender, uint256 amount, uint256 balance) ``` -### Operator +### SubmitTransaction ```solidity -struct Operator { - address owner; - uint64 fee; - uint32 validatorCount; - struct ISSVNetworkCore.Snapshot snapshot; -} +event SubmitTransaction(address owner, uint256 txIndex, address to, uint256 value, bytes data) ``` -### OperatorFeeChangeRequest +### ConfirmTransaction ```solidity -struct OperatorFeeChangeRequest { - uint64 fee; - uint64 approvalBeginTime; - uint64 approvalEndTime; -} +event ConfirmTransaction(address owner, uint256 txIndex) ``` -### Cluster +### RevokeConfirmation ```solidity -struct Cluster { - uint32 validatorCount; - uint64 networkFeeIndex; - uint64 index; - uint256 balance; - bool active; -} +event RevokeConfirmation(address owner, uint256 txIndex) ``` -### DAO +### ExecuteTransaction ```solidity -struct DAO { - uint32 validatorCount; - uint64 balance; - uint64 block; -} +event ExecuteTransaction(address owner, uint256 txIndex) ``` -### Network +### Transaction ```solidity -struct Network { - uint64 networkFee; - uint64 networkFeeIndex; - uint64 networkFeeIndexBlockNumber; +struct Transaction { + address to; + uint256 value; + bytes data; + bool executed; + uint256 numConfirmations; } ``` -### CallerNotOwner - -```solidity -error CallerNotOwner() -``` - -### CallerNotWhitelisted - -```solidity -error CallerNotWhitelisted() -``` - -### FeeTooLow - -```solidity -error FeeTooLow() -``` - -### FeeExceedsIncreaseLimit - -```solidity -error FeeExceedsIncreaseLimit() -``` - -### NoFeeDelcared - -```solidity -error NoFeeDelcared() -``` - -### ApprovalNotWithinTimeframe - -```solidity -error ApprovalNotWithinTimeframe() -``` - -### OperatorDoesNotExist - -```solidity -error OperatorDoesNotExist() -``` - -### InsufficientBalance - -```solidity -error InsufficientBalance() -``` - -### ValidatorAlreadyExists - -```solidity -error ValidatorAlreadyExists() -``` - -### ValidatorDoesNotExist - -```solidity -error ValidatorDoesNotExist() -``` - -### ClusterNotLiquidatable - -```solidity -error ClusterNotLiquidatable() -``` - -### InvalidPublicKeyLength - -```solidity -error InvalidPublicKeyLength() -``` - -### InvalidOperatorIdsLength - -```solidity -error InvalidOperatorIdsLength() -``` - -### ValidatorOwnedByOtherAddress - -```solidity -error ValidatorOwnedByOtherAddress() -``` - -### ClusterAlreadyEnabled - -```solidity -error ClusterAlreadyEnabled() -``` - -### ClusterIsLiquidated - -```solidity -error ClusterIsLiquidated() -``` - -### ClusterDoesNotExists - -```solidity -error ClusterDoesNotExists() -``` - -### IncorrectClusterState - -```solidity -error IncorrectClusterState() -``` - -### UnsortedOperatorsList +### receive ```solidity -error UnsortedOperatorsList() +receive() external payable ``` -### NewBlockPeriodIsBelowMinimum +### submitTransaction ```solidity -error NewBlockPeriodIsBelowMinimum() +function submitTransaction(address _to, uint256 _value, bytes _data) external ``` -### ExceedValidatorLimit +### confirmTransaction ```solidity -error ExceedValidatorLimit() +function confirmTransaction(uint256 _txIndex) external ``` -### TokenTransferFailed +### executeTransaction ```solidity -error TokenTransferFailed() +function executeTransaction(uint256 _txIndex) external ``` -### SameFeeChangeNotAllowed +### revokeConfirmation ```solidity -error SameFeeChangeNotAllowed() +function revokeConfirmation(uint256 _txIndex) external ``` -### FeeIncreaseNotAllowed +### getOwners ```solidity -error FeeIncreaseNotAllowed() +function getOwners() external view returns (address[]) ``` -## IWETH9 - -### deposit +### getTransactionCount ```solidity -function deposit() external payable +function getTransactionCount() external view returns (uint256) ``` -Deposit ether to get wrapped ether - -### withdraw +### getTransaction ```solidity -function withdraw(uint256) external +function getTransaction(uint256 _txIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) ``` -Withdraw wrapped ether to get ether - diff --git a/contracts/ethereum/helpers/oracle.ts b/contracts/ethereum/helpers/oracle.ts index bd3f5c7ff..8cb474f2e 100644 --- a/contracts/ethereum/helpers/oracle.ts +++ b/contracts/ethereum/helpers/oracle.ts @@ -9,7 +9,9 @@ const mockValidators: Validator[] = Object.values(validatorStore) const mockFee = 0.1 -export async function initiatePoolDepositHandler({ manager, signer, id }: { manager: CasimirManager, signer: SignerWithAddress, id: number }) { +export async function initiatePoolDepositHandler({ manager, signer, args }: { manager: CasimirManager, signer: SignerWithAddress, args: Record }) { + const { poolId } = args + const { depositDataRoot, publicKey, @@ -18,11 +20,11 @@ export async function initiatePoolDepositHandler({ manager, signer, id }: { mana operatorIds, shares, cluster: _cluster - } = mockValidators[id] + } = mockValidators[poolId - 1] let cluster - if (id === 1) { + if (poolId === 1) { cluster = _cluster } else { const networkAddress = await manager.getSSVNetworkAddress() @@ -30,7 +32,7 @@ export async function initiatePoolDepositHandler({ manager, signer, id }: { mana cluster = await getCluster({ provider: ethers.provider, networkAddress, operatorIds, withdrawalAddress }) } - const initiatePool = await manager.connect(signer).initiatePoolDeposit( + const initiatePoolDeposit = await manager.connect(signer).initiatePoolDeposit( depositDataRoot, publicKey, signature, @@ -40,16 +42,15 @@ export async function initiatePoolDepositHandler({ manager, signer, id }: { mana cluster, ethers.utils.parseEther(mockFee.toString()) // Mock fee amount estimate ~ 10 SSV ) - await initiatePool.wait() + await initiatePoolDeposit.wait() } -export async function completePoolExitHandler({ manager, signer, id }: { manager: CasimirManager, signer: SignerWithAddress, id: number }) { +export async function completePoolExitHandler({ manager, signer }: { manager: CasimirManager, signer: SignerWithAddress }) { const stakedPoolIds = await manager.getStakedPoolIds() - const poolIndex = stakedPoolIds.findIndex((poolId: number) => poolId === id) - const pool = await manager.getPool(id) - const operatorIds = pool.operatorIds.map((operatorId) => operatorId.toNumber()) - - // Todo unhardcode + const exitedPoolId = stakedPoolIds[0] + const exitedPool = await manager.getPool(exitedPoolId) + const poolIndex = stakedPoolIds.findIndex((poolId: number) => poolId === exitedPoolId) + const operatorIds = exitedPool.operatorIds.map((operatorId) => operatorId.toNumber()) const finalEffectiveBalance = ethers.utils.parseEther('32') const blamePercents = [0, 0, 0, 0] @@ -57,11 +58,11 @@ export async function completePoolExitHandler({ manager, signer, id }: { manager const withdrawalAddress = manager.address const cluster = await getCluster({ provider: ethers.provider, networkAddress, operatorIds, withdrawalAddress }) - const initiatePool = await manager.connect(signer).completePoolExit( + const completePoolExit = await manager.connect(signer).completePoolExit( poolIndex, finalEffectiveBalance, blamePercents, cluster ) - await initiatePool.wait() + await completePoolExit.wait() } \ No newline at end of file diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index b34d8847d..8a2664a55 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -86,19 +86,19 @@ void async function () { console.log(`Rewarding ${depositedPoolCount} validators ${rewardPerValidator} each`) await time.increase(time.duration.days(1)) const rewardAmount = rewardPerValidator * depositedPoolCount.toNumber() - let nextActiveBalanceAmount = round( + let nextActiveBalance = round( parseFloat( ethers.utils.formatEther( (await manager.getLatestActiveBalance()).add((await manager.getPendingPoolIds()).length * 32) ) ) + rewardAmount ) - let nextCompletedDeposits = (await manager.getPendingPoolIds()).length + let nextDeposits = (await manager.getPendingPoolIds()).length let nextValues = [ - nextActiveBalanceAmount, // activeBalanceAmount - nextCompletedDeposits, // completedDeposits - 0, // completedExits - 0, // slashedExits + nextActiveBalance, // activeBalance + nextDeposits, // deposits + 0, // exits + 0, // slashes ] requestId = await performReport({ manager, @@ -114,19 +114,19 @@ void async function () { await setBalance(manager.address, nextBalance) await time.increase(time.duration.days(1)) - nextActiveBalanceAmount = round( + nextActiveBalance = round( parseFloat( ethers.utils.formatEther( (await manager.getLatestActiveBalance()).add((await manager.getPendingPoolIds()).length * 32) ) ) - rewardAmount ) - nextCompletedDeposits = (await manager.getPendingPoolIds()).length + nextDeposits = (await manager.getPendingPoolIds()).length nextValues = [ - nextActiveBalanceAmount, // activeBalanceAmount - nextCompletedDeposits, // completedDeposits - 0, // completedExits - 0, // slashedExits + nextActiveBalance, // activeBalance + nextDeposits, // deposits + 0, // exits + 0, // slashes ] requestId = await performReport({ manager, diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index d8c86d146..86e23aa62 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -340,7 +340,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function requestWithdrawal(uint256 amount) external nonReentrant { users[msg.sender].stake0 = getUserStake(msg.sender); require( - users[msg.sender].stake0 > amount, + users[msg.sender].stake0 >= amount, "Withdrawing more than user stake" ); @@ -360,11 +360,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { pendingWithdrawals += amount; pendingWithdrawalCount++; - uint256 coveredExitBalance = exitingPoolCount * poolCapacity; - if ( - pendingWithdrawals > coveredExitBalance - ) { - uint256 exitsRequired = (pendingWithdrawals - coveredExitBalance) / poolCapacity; + uint256 coveredExitBalance = (exitingPoolCount - slashedPoolCount) * + poolCapacity; + if (pendingWithdrawals > coveredExitBalance) { + uint256 exitsRequired = (pendingWithdrawals - + coveredExitBalance) / poolCapacity; if (exitsRequired == 0) { exitsRequired = 1; } @@ -535,6 +535,32 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } } + /** + * @notice Request a given count of pool exit completions + * @param count The number of pool exits to complete + */ + function requestPoolExitCompletions(uint256 count) external { + require( + msg.sender == address(upkeep), + "Only upkeep can request pool exit completions" + ); + + emit PoolExitCompletionsRequested(count); + } + + /** + * @notice Request a given count of pool slash reports + * @param count The number of pool slash reports + */ + function requestPoolSlashReports(uint256 count) external { + require( + msg.sender == address(upkeep), + "Only upkeep can request pool slash reports" + ); + + emit PoolSlashReportsRequested(count); + } + /** * @notice Report a pool slash * @param poolId The pool ID @@ -545,14 +571,14 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { "Only manager oracle can initiate pools" ); Pool storage pool = pools[poolId]; + require(!pool.slashed, "Pool is already slashed"); + + pool.slashed = true; + slashedPoolCount++; if (!pool.exiting) { pool.exiting = true; exitingPoolCount++; } - if (!pool.slashed) { - pool.slashed = true; - slashedPoolCount++; - } } /** @@ -568,6 +594,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint32[] memory blamePercents, ISSVNetworkCore.Cluster memory cluster ) external { + // Todo start debugging here + require( msg.sender == oracleAddress, "Only manager oracle can complete pool exits" @@ -577,15 +605,19 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint32 poolId = stakedPoolIds[poolIndex]; Pool storage pool = pools[poolId]; - require(pool.exiting, "Pool is not exiting"); - uint64[] memory operatorIds = pool.operatorIds; bytes memory publicKey = pool.publicKey; // Todo recover lost funds from collateral using blame percents depositedPoolCount--; - exitingPoolCount--; + if (pool.exiting) { + exitingPoolCount--; + } + if (pool.slashed) { + slashedPoolCount--; + } + finalizableExitedPoolCount++; finalizableExitedBalance += finalEffectiveBalance; @@ -724,7 +756,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function getUserStake( address userAddress ) public view returns (uint256 userStake) { - require(users[userAddress].stake0 > 0, "User does not have a stake"); userStake = Math.mulDiv( users[userAddress].stake0, stakeRatioSum, @@ -739,7 +770,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function getTotalStake() public view returns (uint256 totalStake) { totalStake = getBufferedBalance() + - getPendingBalance() + latestActiveBalanceAfterFees - pendingWithdrawals; } diff --git a/contracts/ethereum/src/CasimirUpkeep.sol b/contracts/ethereum/src/CasimirUpkeep.sol index 4be88ab88..6aa1d340f 100644 --- a/contracts/ethereum/src/CasimirUpkeep.sol +++ b/contracts/ethereum/src/CasimirUpkeep.sol @@ -40,33 +40,33 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /********************/ /** Current report status */ - Status private status; - /** Current report remaining requests */ - uint256 remainingRequests; + Status private reportStatus; /** Current report period */ - uint256 currentPeriod; + uint256 reportPeriod; /** Current report pending pool count */ - uint256 currentPendingPoolCount; + uint256 reportPendingPoolCount; /** Current report exiting pool count */ - uint256 currentExitingPoolCount; + uint256 reportExitingPoolCount; /** Current report block */ - uint256 currentRequestBlock; + uint256 reportRequestBlock; + /** Current report request timestamp */ + uint256 private reportTimestamp; /** Current report swept balance */ - uint256 private currentSweptBalance; + uint256 private reportSweptBalance; /** Current report active balance */ - uint256 private reportedActiveBalance; + uint256 private reportActiveBalance; /** Current report completed deposits */ - uint256 private reportedDeposits; + uint256 private reportDeposits; /** Current report completed exits */ - uint256 private reportedExits; + uint256 private reportExits; /** Current report completed slashes */ - uint256 private reportedSlashes; + uint256 private reportSlashes; /** Finalizable completed deposits */ uint256 private finalizableDeposits; /** Current report requests */ - mapping(bytes32 => RequestType) private requests; - /** Latest report request timestamp */ - uint256 private latestReportTimestamp; + mapping(bytes32 => RequestType) private reportRequests; + /** Current report remaining requests */ + uint256 reportRemainingRequests; /** Latest error */ bytes private latestError; /** Binary request source code */ @@ -149,12 +149,12 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { override returns (bool upkeepNeeded, bytes memory) { - if (status == Status.FINALIZED) { + if (reportStatus == Status.FINALIZED) { bool checkActive = manager.getDepositedPoolCount() > 0; - bool heartbeatLapsed = (block.timestamp - latestReportTimestamp) >= reportHeartbeat; + bool heartbeatLapsed = (block.timestamp - reportTimestamp) >= reportHeartbeat; upkeepNeeded = checkActive && heartbeatLapsed; - } else if (status == Status.PROCESSING) { - bool exitsFinalizable = reportedExits == manager.getFinalizableExitedPoolCount(); + } else if (reportStatus == Status.PROCESSING) { + bool exitsFinalizable = reportExits == manager.getFinalizableExitedPoolCount(); upkeepNeeded = exitsFinalizable; } } @@ -166,61 +166,61 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { (bool upkeepNeeded, ) = checkUpkeep(""); require(upkeepNeeded, "Upkeep not needed"); - if (status == Status.FINALIZED) { - status = Status.REQUESTING; + if (reportStatus == Status.FINALIZED) { + reportStatus = Status.REQUESTING; - latestReportTimestamp = block.timestamp; - currentPeriod = manager.getReportPeriod(); - currentPendingPoolCount = manager.getPendingPoolIds().length; - currentExitingPoolCount = manager.getExitingPoolCount(); - currentSweptBalance = manager.getSweptBalance(); + reportTimestamp = block.timestamp; + reportPeriod = manager.getReportPeriod(); + reportPendingPoolCount = manager.getPendingPoolIds().length; + reportExitingPoolCount = manager.getExitingPoolCount(); + reportSweptBalance = manager.getSweptBalance(); Functions.Request memory req; for (uint256 i = 1; i < 5; i++) { RequestType requestType = RequestType(i); bool checkBalance = requestType == RequestType.BALANCE; - bool checkDeposits = requestType == RequestType.DEPOSITS && currentPendingPoolCount > 0; - bool checkExits = requestType == RequestType.EXITS && currentExitingPoolCount > 0; + bool checkDeposits = requestType == RequestType.DEPOSITS && reportPendingPoolCount > 0; + bool checkExits = requestType == RequestType.EXITS && reportExitingPoolCount > 0; bool checkSlashes = requestType == RequestType.SLASHES; if (checkBalance || checkDeposits || checkExits || checkSlashes) { bytes32 requestId = sendRequest(req, functionsSubscriptionId, fulfillGasLimit); - requests[requestId] = RequestType(i); - remainingRequests++; + reportRequests[requestId] = RequestType(i); + reportRemainingRequests++; } } } else { if ( manager.getPendingWithdrawals() > 0 && - manager.getPendingWithdrawalEligibility(0, currentPeriod) && + manager.getPendingWithdrawalEligibility(0, reportPeriod) && manager.getPendingWithdrawals() <= manager.getWithdrawableBalance() ) { manager.completePendingWithdrawals(5); } - + if (finalizableDeposits > 0) { uint256 maxCompletions = finalizableDeposits > 5 ? 5 : finalizableDeposits; finalizableDeposits -= maxCompletions; manager.completePoolDeposits(maxCompletions); } - if (!manager.getPendingWithdrawalEligibility(0, currentPeriod) && finalizableDeposits == 0) { - status = Status.FINALIZED; + if (!manager.getPendingWithdrawalEligibility(0, reportPeriod) && finalizableDeposits == 0) { + reportStatus = Status.FINALIZED; manager.rebalanceStake({ - activeBalance: reportedActiveBalance, - newSweptRewards: currentSweptBalance - manager.getFinalizableExitedBalance(), - newDeposits: reportedDeposits, - newExits: reportedExits + activeBalance: reportActiveBalance, + newSweptRewards: reportSweptBalance - manager.getFinalizableExitedBalance(), + newDeposits: reportDeposits, + newExits: reportExits }); - reportedActiveBalance = 0; - reportedDeposits = 0; - reportedExits = 0; - reportedSlashes = 0; + reportActiveBalance = 0; + reportDeposits = 0; + reportExits = 0; + reportSlashes = 0; } } - emit UpkeepPerformed(status); + emit UpkeepPerformed(reportStatus); } /** @@ -240,25 +240,27 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { if (_error.length == 0) { uint256 value = abi.decode(response, (uint256)); - RequestType requestType = requests[requestId]; + RequestType requestType = reportRequests[requestId]; if (requestType != RequestType.NONE) { - delete requests[requestId]; - remainingRequests--; + delete reportRequests[requestId]; + reportRemainingRequests--; if (requestType == RequestType.BALANCE) { - reportedActiveBalance = value; + reportActiveBalance = value; } else if (requestType == RequestType.DEPOSITS) { - reportedDeposits = value; + reportDeposits = value; finalizableDeposits = value; } else if (requestType == RequestType.EXITS) { - reportedExits = value; + reportExits = value; + manager.requestPoolExitCompletions(value); } else { - reportedSlashes = value; + reportSlashes = value; + manager.requestPoolSlashReports(value); } - if (remainingRequests == 0) { - status = Status.PROCESSING; + if (reportRemainingRequests == 0) { + reportStatus = Status.PROCESSING; } } } diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index bd7f61999..0e23970d3 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -47,6 +47,8 @@ interface ICasimirManager { event PoolReshareRequested(uint32 poolId); event PoolReshared(uint32 poolId); event PoolExitRequested(uint32 poolId); + event PoolSlashReportsRequested(uint256 count); + event PoolExitCompletionsRequested(uint256 count); event PoolExited(uint32 poolId); event StakeDeposited(address sender, uint256 amount); event StakeRebalanced(uint256 amount); @@ -85,6 +87,10 @@ interface ICasimirManager { function completePoolDeposits(uint256 count) external; + function requestPoolExitCompletions(uint256 count) external; + + function requestPoolSlashReports(uint256 count) external; + function completePoolExit( uint256 poolIndex, uint256 finalEffectiveBalance, diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 5e9356359..2bd328095 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -91,8 +91,7 @@ export async function secondUserDepositFixture() { await deposit.wait() const nextPoolId = 1 - await initiatePoolDepositHandler({ manager, signer: oracle, id: nextPoolId }) - + await initiatePoolDepositHandler({ manager, signer: oracle, args: { poolId: nextPoolId } }) await time.increase(time.duration.days(1)) let requestId = 0 @@ -177,7 +176,7 @@ export async function thirdUserDepositFixture() { const readyPools = await manager.getReadyPoolIds() const nextPoolId = readyPools[readyPools.length - 1] - await initiatePoolDepositHandler({ manager, signer: oracle, id: nextPoolId }) + await initiatePoolDepositHandler({ manager, signer: oracle, args: { poolId: nextPoolId } }) await time.increase(time.duration.days(1)) let requestId = latestRequestId @@ -288,7 +287,7 @@ export async function fourthUserDepositFixture() { const readyPools = await manager.getReadyPoolIds() for (let i = 0; i < 2; i++) { const nextPoolId = readyPools[i] - await initiatePoolDepositHandler({ manager, signer: oracle, id: nextPoolId }) + await initiatePoolDepositHandler({ manager, signer: oracle, args: { poolId: nextPoolId } }) } await time.increase(time.duration.days(1)) @@ -364,16 +363,18 @@ export async function activeBalanceRecoveryFixture() { /** Fixture to full withdraw ~24.07 */ export async function thirdUserFullWithdrawalFixture() { - const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(fourthUserDepositFixture) + const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(activeBalanceRecoveryFixture) const thirdStake = await manager.getUserStake(thirdUser.address) const withdraw = await manager.connect(thirdUser).requestWithdrawal(thirdStake) await withdraw.wait() - const exitRequests = await manager.queryFilter(manager.filters.PoolExitRequested(), -1, 'latest') - const exitRequest = exitRequests[0] - const { poolId } = exitRequest.args - await completePoolExitHandler({ manager, signer: oracle, id: poolId }) + const sweptExitBalance = 32 + const currentBalance = await ethers.provider.getBalance(manager.address) + const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptExitBalance.toString())) + await setBalance(manager.address, nextBalance) + + await completePoolExitHandler({ manager, signer: oracle }) await time.increase(time.duration.days(1)) let requestId = latestRequestId diff --git a/contracts/ethereum/test/integration.ts b/contracts/ethereum/test/integration.ts index 69ea6dafd..049e25d8a 100644 --- a/contracts/ethereum/test/integration.ts +++ b/contracts/ethereum/test/integration.ts @@ -151,13 +151,17 @@ describe('Casimir manager', async function () { it('Third user full withdrawal is completed on exit report', async function () { const { manager, firstUser, secondUser, thirdUser, fourthUser } = await loadFixture(thirdUserFullWithdrawalFixture) - console.log('Third user full withdrawal is completed on exit report') const stake = await manager.getTotalStake() const firstStake = await manager.getUserStake(firstUser.address) const secondStake = await manager.getUserStake(secondUser.address) const thirdStake = await manager.getUserStake(thirdUser.address) const fourthStake = await manager.getUserStake(fourthUser.address) - console.log(stake.toString(), firstStake.toString(), secondStake.toString(), thirdStake.toString(), fourthStake.toString()) + + expect(ethers.utils.formatEther(stake)).equal('111.925117004680187208') + expect(ethers.utils.formatEther(firstStake)).equal('15.790046801872074882') + expect(ethers.utils.formatEther(secondStake)).equal('24.135070202808112324') + expect(ethers.utils.formatEther(thirdStake)).equal('0.0') + expect(ethers.utils.formatEther(fourthStake)).equal('72.0') }) it('Check more rewards and dust', async function () { diff --git a/services/oracle/README.md b/services/oracle/README.md index 8756e44b6..518fc024b 100644 --- a/services/oracle/README.md +++ b/services/oracle/README.md @@ -4,7 +4,7 @@ Casimir validators oracle service ## About -The validator oracle service initiates and reports on validator operations: distributed key generation (DKG) ceremonies, DKG reshares, and DKG or presigned exit requests. It contains a [NodeJS](https://nodejs.org) application that listens for `PoolDepositRequested`, `PoolReshareRequested`, and `PoolExitRequested` events, which then internally uses the [RockX DKG CLI and messenger server](https://github.com/rockx/rockx-dkg-cli) to initiate and retrieve operator group DKG results. The `PoolDepositRequested` event starts a new DKG keygen and retrieves the results to submit a new validator via `initiatePoolDeposit`. The `PoolReshareRequested` event starts a new DKG reshare and retrieves the results to update an existing validator via `resharePool`. The `PoolExitRequested` event starts a new DKG exit and retrieves the results to submit a signed exit message directly to the Beacon chain. +The validator oracle service initiates and reports on validator operations: distributed key generation (DKG) ceremonies, DKG reshares, and DKG or presigned exit requests. It contains a [NodeJS](https://nodejs.org) application that listens for `PoolDepositRequested`, `PoolReshareRequested`, and `PoolExitRequested` events, which then internally uses the [RockX DKG CLI and messenger server](https://github.com/rockx/rockx-dkg-cli) to initiate and retrieve operator group DKG results. The `PoolDepositRequested` event starts a new DKG keygen and retrieves the results to submit a new validator via `depositPool`. The `PoolReshareRequested` event starts a new DKG reshare and retrieves the results to update an existing validator via `resharePool`. The `PoolExitRequested` event starts a new DKG exit and retrieves the results to submit a signed exit message directly to the Beacon chain. DKG operations and reports will theoretically have [verifiable](https://docs.obol.tech/docs/next/charon/dkg#dkg-verification) aspects that prove fair DKG ceremonies. diff --git a/services/oracle/src/index.ts b/services/oracle/src/index.ts index 311b4769d..eac17fc64 100644 --- a/services/oracle/src/index.ts +++ b/services/oracle/src/index.ts @@ -19,7 +19,7 @@ const { provider, signer, manager, cliPath, messengerUrl } = config() const handler = handlers[details.event as keyof typeof handlers] if (!handler) throw new Error(`No handler found for event ${details.event}`) - await handler({ provider, signer, manager, cliPath, messengerUrl, id }) + await handler({ provider, signer, manager, cliPath, messengerUrl, args: { poolId: id } }) } })() diff --git a/services/oracle/src/interfaces/HandlerInput.ts b/services/oracle/src/interfaces/HandlerInput.ts index e2a4a8a91..39b42a440 100644 --- a/services/oracle/src/interfaces/HandlerInput.ts +++ b/services/oracle/src/interfaces/HandlerInput.ts @@ -12,6 +12,6 @@ export interface HandlerInput { cliPath: string /** DKG messenger service URL */ messengerUrl: string - /** Pool ID */ - id: number + /** Handler args */ + args: Record } \ No newline at end of file diff --git a/services/oracle/src/providers/handlers.ts b/services/oracle/src/providers/handlers.ts index b3b691b10..8165c4a85 100644 --- a/services/oracle/src/providers/handlers.ts +++ b/services/oracle/src/providers/handlers.ts @@ -1,7 +1,7 @@ +import fs from 'fs' import { ethers } from 'ethers' import { DKG } from './dkg' import { HandlerInput } from '../interfaces/HandlerInput' -import fs from 'fs' import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' export async function initiatePoolDepositHandler(input: HandlerInput) { @@ -45,12 +45,12 @@ export async function initiatePoolDepositHandler(input: HandlerInput) { } export async function initiatePoolReshareHandler(input: HandlerInput) { - const { manager, signer, cliPath, messengerUrl, id } = input - + const { manager, signer, cliPath, messengerUrl, args } = input + const { poolId } = args // Todo reshare event will include the operator to boot // Get pool to reshare - const pool = await manager.getPool(id) + const pool = await manager.getPool(poolId) const { publicKey, operatorIds } = pool // Todo old operators and new operators only different by 1 operator @@ -73,10 +73,11 @@ export async function initiatePoolReshareHandler(input: HandlerInput) { } export async function initiatePoolExitHandler(input: HandlerInput) { - const { manager, signer, cliPath, messengerUrl, id } = input - + const { manager, signer, cliPath, messengerUrl, args } = input + const { poolId } = args + // Get pool to exit - const pool = await manager.getPool(id) + const pool = await manager.getPool(poolId) const { publicKey, operatorIds } = pool // Get operators to sign exit From 642cd2344039e9d934cd19d02875240933b60d09 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Wed, 31 May 2023 15:40:28 -0400 Subject: [PATCH 40/78] Fix rebalance --- contracts/ethereum/docs/index.md | 510 ++++++++++-------- contracts/ethereum/helpers/upkeep.ts | 100 ++-- contracts/ethereum/scripts/dev.ts | 52 +- contracts/ethereum/src/CasimirManager.sol | 178 +++--- contracts/ethereum/src/CasimirRegistry.sol | 2 + contracts/ethereum/src/CasimirUpkeep.sol | 146 ++--- .../src/interfaces/ICasimirManager.sol | 21 +- .../src/interfaces/ICasimirUpkeep.sol | 9 - .../ethereum/src/mock/MockFunctionsOracle.sol | 6 +- contracts/ethereum/test/fixtures/shared.ts | 305 +++++++---- contracts/ethereum/test/integration.ts | 8 +- contracts/ethereum/test/packing.ts | 17 - 12 files changed, 742 insertions(+), 612 deletions(-) delete mode 100644 contracts/ethereum/test/packing.ts diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 8c703ed82..55c6aa307 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -62,7 +62,7 @@ Deposit user stake ### rebalanceStake ```solidity -function rebalanceStake(uint256 activeBalance, uint256 newSweptRewards, uint256 newDeposits, uint256 newExits) external +function rebalanceStake(uint256 activeBalance, uint256 sweptRewards, uint256 depositCount, uint256 exitCount) external ``` Rebalance the rewards to stake ratio and redistribute swept rewards @@ -72,9 +72,9 @@ Rebalance the rewards to stake ratio and redistribute swept rewards | Name | Type | Description | | ---- | ---- | ----------- | | activeBalance | uint256 | The active consensus balance | -| newSweptRewards | uint256 | The swept consensus rewards | -| newDeposits | uint256 | The count of new deposits | -| newExits | uint256 | The count of new exits | +| sweptRewards | uint256 | The swept consensus rewards | +| depositCount | uint256 | The count of new deposits | +| exitCount | uint256 | The count of new exits | ### requestWithdrawal @@ -104,10 +104,10 @@ Complete a given count of pending withdrawals | ---- | ---- | ----------- | | count | uint256 | The number of withdrawals to complete | -### depositPool +### initiatePoolDeposit ```solidity -function depositPool(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount) external +function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount) external ``` Initiate the next ready pool @@ -139,6 +139,34 @@ Complete a given count of the next pending pools | ---- | ---- | ----------- | | count | uint256 | The number of pools to complete | +### requestPoolWithdrawnExitReports + +```solidity +function requestPoolWithdrawnExitReports(uint256 count) external +``` + +Request a given count of pool exit completions + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| count | uint256 | The number of pool exits to complete | + +### requestPoolSlashedExitReports + +```solidity +function requestPoolSlashedExitReports(uint256 count) external +``` + +Request a given count of pool slash reports + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| count | uint256 | The number of pool slash reports | + ### reportPoolSlash ```solidity @@ -388,10 +416,10 @@ Get the latest active rewards | ---- | ---- | ----------- | | [0] | int256 | activeRewards The latest active rewards | -### getFinalizableExitedBalance +### getReportWithdrawnBalance ```solidity -function getFinalizableExitedBalance() public view returns (uint256) +function getReportWithdrawnBalance() public view returns (uint256) ``` Get the finalizable exited balance @@ -400,12 +428,12 @@ Get the finalizable exited balance | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | finalizableExitedBalance The finalizable exited balance | +| [0] | uint256 | reportFinalizableWithdrawnBalance The finalizable exited balance | -### getFinalizableExitedPoolCount +### getReportWithdrawnPoolCount ```solidity -function getFinalizableExitedPoolCount() public view returns (uint256) +function getReportWithdrawnPoolCount() public view returns (uint256) ``` Get the finalizable exited pool count @@ -660,125 +688,6 @@ Get the upkeep address | ---- | ---- | ----------- | | upkeepAddress | address | The upkeep address | -## CasimirRecipient - -### receive - -```solidity -receive() external payable -``` - -## CasimirRegistry - -### requiredCollateral - -```solidity -uint256 requiredCollateral -``` - -### minimumCollateralDeposit - -```solidity -uint256 minimumCollateralDeposit -``` - -### constructor - -```solidity -constructor(address managerAddress, address ssvNetworkViewsAddress) public -``` - -### registerOperator - -```solidity -function registerOperator(uint64 operatorId) external payable -``` - -Register an operator with the set - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | - -### requestOperatorDeregistration - -```solidity -function requestOperatorDeregistration(uint64 operatorId) external -``` - -Request to deregister an operator from the set - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | - -### completeOperatorDeregistration - -```solidity -function completeOperatorDeregistration(uint64 operatorId) external -``` - -Deregister an operator from the set - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | - -### depositCollateral - -```solidity -function depositCollateral(uint64 operatorId) external payable -``` - -Deposit collateral for an operator - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | - -### setOperatorCollateral - -```solidity -function setOperatorCollateral(uint64 operatorId, int256 collateral) external -``` - -Set the collateral for an operator - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | -| collateral | int256 | The collateral | - -### getOperatorCollateral - -```solidity -function getOperatorCollateral(uint64 operatorId) external view returns (int256) -``` - -Get the collateral for an operator - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | int256 | The collateral | - ## CasimirUpkeep ### reportHeartbeat @@ -797,45 +706,45 @@ uint256 poolCapacity Pool capacity -### remainingRequests +### reportPeriod ```solidity -uint256 remainingRequests +uint256 reportPeriod ``` -Current report remaining requests +Current report period -### currentPeriod +### reportPendingPoolCount ```solidity -uint256 currentPeriod +uint256 reportPendingPoolCount ``` -Current report period +Current report pending pool count -### currentPendingPoolCount +### reportExitingPoolCount ```solidity -uint256 currentPendingPoolCount +uint256 reportExitingPoolCount ``` -Current report pending pool count +Current report exiting pool count -### currentExitingPoolCount +### reportRequestBlock ```solidity -uint256 currentExitingPoolCount +uint256 reportRequestBlock ``` -Current report exiting pool count +Current report block -### currentRequestBlock +### reportRemainingRequests ```solidity -uint256 currentRequestBlock +uint256 reportRemainingRequests ``` -Current report block +Current report remaining requests ### requestCBOR @@ -1053,6 +962,18 @@ event PoolReshared(uint32 poolId) event PoolExitRequested(uint32 poolId) ``` +### PoolSlashedExitReportsRequested + +```solidity +event PoolSlashedExitReportsRequested(uint256 count) +``` + +### PoolWithdrawnExitReportsRequested + +```solidity +event PoolWithdrawnExitReportsRequested(uint256 count) +``` + ### PoolExited ```solidity @@ -1104,7 +1025,7 @@ function depositStake() external payable ### rebalanceStake ```solidity -function rebalanceStake(uint256 activeBalance, uint256 newSweptRewards, uint256 newDeposits, uint256 newExits) external +function rebalanceStake(uint256 activeBalance, uint256 sweptRewards, uint256 depositCount, uint256 exitCount) external ``` ### requestWithdrawal @@ -1119,10 +1040,10 @@ function requestWithdrawal(uint256 amount) external function completePendingWithdrawals(uint256 count) external ``` -### depositPool +### initiatePoolDeposit ```solidity -function depositPool(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount) external +function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount) external ``` ### completePoolDeposits @@ -1131,6 +1052,18 @@ function depositPool(bytes32 depositDataRoot, bytes publicKey, bytes signature, function completePoolDeposits(uint256 count) external ``` +### requestPoolWithdrawnExitReports + +```solidity +function requestPoolWithdrawnExitReports(uint256 count) external +``` + +### requestPoolSlashedExitReports + +```solidity +function requestPoolSlashedExitReports(uint256 count) external +``` + ### completePoolExit ```solidity @@ -1227,16 +1160,16 @@ function getExpectedEffectiveBalance() external view returns (uint256) function getReportPeriod() external view returns (uint32) ``` -### getFinalizableExitedPoolCount +### getReportWithdrawnPoolCount ```solidity -function getFinalizableExitedPoolCount() external view returns (uint256) +function getReportWithdrawnPoolCount() external view returns (uint256) ``` -### getFinalizableExitedBalance +### getReportWithdrawnBalance ```solidity -function getFinalizableExitedBalance() external view returns (uint256) +function getReportWithdrawnBalance() external view returns (uint256) ``` ### getLatestActiveBalance @@ -1299,75 +1232,6 @@ function getPendingWithdrawals() external view returns (uint256) function getPendingWithdrawalCount() external view returns (uint256) ``` -## ICasimirRecipient - -## ICasimirRegistry - -### OperatorRegistered - -```solidity -event OperatorRegistered(uint64 operatorId) -``` - -### OperatorDeregistrationRequested - -```solidity -event OperatorDeregistrationRequested(uint64 operatorId) -``` - -### OperatorDeregistrationCompleted - -```solidity -event OperatorDeregistrationCompleted(uint64 operatorId) -``` - -### Operator - -```solidity -struct Operator { - uint64 id; - int256 collateral; - uint256 poolCount; - bool deregistering; -} -``` - -### registerOperator - -```solidity -function registerOperator(uint64 operatorId) external payable -``` - -### requestOperatorDeregistration - -```solidity -function requestOperatorDeregistration(uint64 operatorId) external -``` - -### completeOperatorDeregistration - -```solidity -function completeOperatorDeregistration(uint64 operatorId) external -``` - -### depositCollateral - -```solidity -function depositCollateral(uint64 operatorId) external payable -``` - -### setOperatorCollateral - -```solidity -function setOperatorCollateral(uint64 operatorId, int256 collateral) external -``` - -### getOperatorCollateral - -```solidity -function getOperatorCollateral(uint64 operatorId) external view returns (int256) -``` - ## ICasimirUpkeep ### Status @@ -1608,6 +1472,194 @@ function withdraw(uint256) external Withdraw wrapped ether to get ether +## CasimirRegistry + +### requiredCollateral + +```solidity +uint256 requiredCollateral +``` + +### minimumCollateralDeposit + +```solidity +uint256 minimumCollateralDeposit +``` + +### constructor + +```solidity +constructor(address managerAddress, address ssvNetworkViewsAddress) public +``` + +### registerOperator + +```solidity +function registerOperator(uint64 operatorId) external payable +``` + +Register an operator with the set + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +### requestOperatorDeregistration + +```solidity +function requestOperatorDeregistration(uint64 operatorId) external +``` + +Request to deregister an operator from the set + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +### completeOperatorDeregistration + +```solidity +function completeOperatorDeregistration(uint64 operatorId) external +``` + +Deregister an operator from the set + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +### depositCollateral + +```solidity +function depositCollateral(uint64 operatorId) external payable +``` + +Deposit collateral for an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +### setOperatorCollateral + +```solidity +function setOperatorCollateral(uint64 operatorId, int256 collateral) external +``` + +Set the collateral for an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | +| collateral | int256 | The collateral | + +### getOperatorCollateral + +```solidity +function getOperatorCollateral(uint64 operatorId) external view returns (int256) +``` + +Get the collateral for an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | int256 | The collateral | + +## ICasimirRegistry + +### OperatorRegistered + +```solidity +event OperatorRegistered(uint64 operatorId) +``` + +### OperatorDeregistrationRequested + +```solidity +event OperatorDeregistrationRequested(uint64 operatorId) +``` + +### OperatorDeregistrationCompleted + +```solidity +event OperatorDeregistrationCompleted(uint64 operatorId) +``` + +### Operator + +```solidity +struct Operator { + uint64 id; + int256 collateral; + uint256 poolCount; + bool deregistering; +} +``` + +### registerOperator + +```solidity +function registerOperator(uint64 operatorId) external payable +``` + +### requestOperatorDeregistration + +```solidity +function requestOperatorDeregistration(uint64 operatorId) external +``` + +### completeOperatorDeregistration + +```solidity +function completeOperatorDeregistration(uint64 operatorId) external +``` + +### depositCollateral + +```solidity +function depositCollateral(uint64 operatorId) external payable +``` + +### setOperatorCollateral + +```solidity +function setOperatorCollateral(uint64 operatorId, int256 collateral) external +``` + +### getOperatorCollateral + +```solidity +function getOperatorCollateral(uint64 operatorId) external view returns (int256) +``` + +## CasimirRecipient + +### receive + +```solidity +receive() external payable +``` + +## ICasimirRecipient + ## MockFunctionsOracle ### constructor @@ -1652,22 +1704,6 @@ Sends a request (encoded as data) using the provided subscriptionId | ---- | ---- | ----------- | | requestId | bytes32 | A unique request identifier (unique per DON) | -## CasimirOracle - -### sayHello - -```solidity -function sayHello() external pure returns (string) -``` - -## ICasimirOracle - -### sayHello - -```solidity -function sayHello() external view returns (string) -``` - ## CasimirDAO ### owners diff --git a/contracts/ethereum/helpers/upkeep.ts b/contracts/ethereum/helpers/upkeep.ts index 20ca1d90d..e565b50b9 100644 --- a/contracts/ethereum/helpers/upkeep.ts +++ b/contracts/ethereum/helpers/upkeep.ts @@ -1,48 +1,40 @@ import { ethers } from 'hardhat' import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import { CasimirManager, CasimirUpkeep } from '../build/artifacts/types' +import { CasimirUpkeep } from '../build/artifacts/types' -export enum RequestType { - BALANCE = 0, - DEPOSITS = 1, - EXITS = 2, - SLASHES = 3 +export interface ReportValues { + activeBalance: number + activatedDeposits: number + unexpectedExits: number + slashedExits: number + withdrawnExits: number } -export async function performReport({ - manager, +export async function fulfillReportRequest({ upkeep, keeper, - values, - requestId + requestId, + values }: { - manager: CasimirManager, upkeep: CasimirUpkeep, keeper: SignerWithAddress, - values: number[], - requestId: number -}) { - await runUpkeep({ upkeep, keeper }) - - for (let i = 0; i < values.length; i++) { - const value = values[i] - const checkBalance = i == RequestType.BALANCE - const checkDeposits = i == RequestType.DEPOSITS && (await manager.getPendingPoolIds()).length > 0 - const checkExits = i == RequestType.EXITS && (await manager.getExitingPoolCount()).toNumber() > 0 - const checkSlashes = i == RequestType.SLASHES - if (checkBalance || checkDeposits || checkExits || checkSlashes) { - requestId++ - await fulfillFunctionsRequest({ - upkeep, - keeper, - value: checkBalance ? ethers.utils.parseEther(value.toString()).toString() : value.toString(), - requestId - }) - } - } - - await runUpkeep({ upkeep, keeper }) - + requestId: number, + values: ReportValues +}) { + requestId++ + const requestIdHash = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [requestId])) + const { activeBalance, activatedDeposits, unexpectedExits, slashedExits, withdrawnExits } = values + const activeBalanceGwei = ethers.utils.parseUnits(activeBalance.toString(), 'gwei') + const responseBytes = ethers.utils.defaultAbiCoder.encode( + ['uint128', 'uint32', 'uint32', 'uint32', 'uint32'], + [activeBalanceGwei, activatedDeposits, unexpectedExits, slashedExits, withdrawnExits] + ) + await fulfillFunctionsRequest({ + upkeep, + keeper, + requestIdHash, + responseBytes + }) return requestId } @@ -67,42 +59,14 @@ export async function runUpkeep({ export async function fulfillFunctionsRequest({ upkeep, keeper, - value, - requestId + requestIdHash, + responseBytes }: { upkeep: CasimirUpkeep, keeper: SignerWithAddress, - value: string, - requestId: number + requestIdHash: string, + responseBytes: string }) { - const requestIdHash = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [requestId])) - const response = ethers.BigNumber.from(value) - const responseBytes = ethers.utils.defaultAbiCoder.encode(['uint256'], [response.toString()]) - const errorBytes = ethers.utils.toUtf8Bytes('') - const mockFulfillRequest = await upkeep.connect(keeper).mockFulfillRequest(requestIdHash, responseBytes, errorBytes) + const mockFulfillRequest = await upkeep.connect(keeper).mockFulfillRequest(requestIdHash, responseBytes, []) await mockFulfillRequest.wait() } - -export function packResponse({ values, bits }: { values: string[], bits: number[] }) { - let packed = ethers.BigNumber.from('0') - values.forEach((value, i) => { - if (i === 0) { - console.log('active value', value) - packed = ethers.BigNumber.from(value) - } else { - const shift = bits.slice(0, i).reduce((a, b) => a + b, 0) - packed = packed.or(ethers.BigNumber.from(value).shl(shift)) - } - }) - return packed -} - -export function unpackResponse({ packed, bits }: { packed: string, bits: number[] }) { - return bits.map((_, i) => { - if (i === 0) { - return ethers.BigNumber.from(packed).and(ethers.BigNumber.from('0xFFFFFFFFFFFFFFFF')).toString() - } - const shift = bits.slice(0, i).reduce((a, b) => a + b, 0) - return ethers.BigNumber.from(packed).shr(shift).and(ethers.BigNumber.from('0xFFFFFFFFFFFFFFFF')).toString() - }) -} diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 8a2664a55..30bc59f2b 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -2,7 +2,7 @@ import { deployContract } from '@casimir/ethereum/helpers/deploy' import { ContractConfig, DeploymentConfig } from '@casimir/types' import { CasimirUpkeep, CasimirManager } from '@casimir/ethereum/build/artifacts/types' import { ethers } from 'hardhat' -import { performReport } from '@casimir/ethereum/helpers/upkeep' +import { fulfillReportRequest, runUpkeep } from '@casimir/ethereum/helpers/upkeep' import { round } from '@casimir/ethereum/helpers/math' import EventEmitter, { on } from 'events' import { time, setBalance } from '@nomicfoundation/hardhat-network-helpers' @@ -85,6 +85,9 @@ void async function () { if (depositedPoolCount) { console.log(`Rewarding ${depositedPoolCount} validators ${rewardPerValidator} each`) await time.increase(time.duration.days(1)) + + await runUpkeep({ upkeep, keeper }) + const rewardAmount = rewardPerValidator * depositedPoolCount.toNumber() let nextActiveBalance = round( parseFloat( @@ -93,27 +96,33 @@ void async function () { ) ) + rewardAmount ) - let nextDeposits = (await manager.getPendingPoolIds()).length - let nextValues = [ - nextActiveBalance, // activeBalance - nextDeposits, // deposits - 0, // exits - 0, // slashes - ] - requestId = await performReport({ - manager, + + let nextActivatedDeposits = (await manager.getPendingPoolIds()).length + let nextValues = { + activeBalance: nextActiveBalance, + activatedDeposits: nextActivatedDeposits, + unexpectedExits: 0, + slashedExits: 0, + withdrawnExits: 0 + } + + requestId = await fulfillReportRequest({ upkeep, keeper, values: nextValues, requestId }) - /** Sweep rewards before next upkeep (balance will increment silently) */ + await runUpkeep({ upkeep, keeper }) + const currentBalance = await ethers.provider.getBalance(manager.address) const nextBalance = currentBalance.add(ethers.utils.parseEther(rewardAmount.toString())) await setBalance(manager.address, nextBalance) await time.increase(time.duration.days(1)) + + await runUpkeep({ upkeep, keeper }) + nextActiveBalance = round( parseFloat( ethers.utils.formatEther( @@ -121,20 +130,23 @@ void async function () { ) ) - rewardAmount ) - nextDeposits = (await manager.getPendingPoolIds()).length - nextValues = [ - nextActiveBalance, // activeBalance - nextDeposits, // deposits - 0, // exits - 0, // slashes - ] - requestId = await performReport({ - manager, + nextActivatedDeposits = (await manager.getPendingPoolIds()).length + nextValues = { + activeBalance: nextActiveBalance, + activatedDeposits: nextActivatedDeposits, + unexpectedExits: 0, + slashedExits: 0, + withdrawnExits: 0 + } + + requestId = await fulfillReportRequest({ upkeep, keeper, values: nextValues, requestId }) + + await runUpkeep({ upkeep, keeper }) } } } diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index 86e23aa62..cda565bf6 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -88,15 +88,23 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /********************/ /** Latest active rewards */ - int256 private latestActiveRewards; + int256 private latestRewards; /** Latest active balance */ uint256 private latestActiveBalance; /** Latest active balance after fees */ uint256 private latestActiveBalanceAfterFees; + /** Latest expected effective balance */ + uint256 private latestExpectedEffectiveBalance; + /** Requested pool exit reports */ + uint256 private requestedPoolWithdrawnExitReports; + /** Requested pool slash reports */ + uint256 private requestedPoolSlashedExitReports; + /** Requested pool unexpected exit reports */ + uint256 private requestedPoolUnexpectedExitReports; /** Exited balance */ - uint256 private finalizableExitedBalance; + uint256 private reportFinalizableWithdrawnBalance; /** Exited pool count */ - uint256 finalizableExitedPoolCount; + uint256 finalizableWithdrawnPoolCount; /** Current report period */ uint32 private reportPeriod; /** Last pool ID created */ @@ -228,40 +236,31 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Rebalance the rewards to stake ratio and redistribute swept rewards - * @param activeBalance The active consensus balance - * @param newSweptRewards The swept consensus rewards - * @param newDeposits The count of new deposits - * @param newExits The count of new exits + * @param activeBalance The active balance + * @param sweptBalance The swept balance + * @param activatedDeposits The count of activated deposits + * @param withdrawnExits The count of withdrawn exits */ function rebalanceStake( uint256 activeBalance, - uint256 newSweptRewards, - uint256 newDeposits, - uint256 newExits + uint256 sweptBalance, + uint256 activatedDeposits, + uint256 withdrawnExits ) external { require( msg.sender == address(upkeep), "Only upkeep can rebalance stake" ); - int256 previousExpectedEffective = int256( - getExpectedEffectiveBalance() - ); - uint256 expectedDeposits = newDeposits * poolCapacity; - uint256 expectedExits = newExits * poolCapacity; - int256 expectedEffective = previousExpectedEffective + - int256(expectedDeposits + expectedExits); - int256 previousActiveRewards = int256(latestActiveBalance) - - previousExpectedEffective; - int256 actualActiveBalance = int256( - activeBalance + newSweptRewards + finalizableExitedBalance - ); - int256 actualActiveRewards = actualActiveBalance - expectedEffective; - int256 change = actualActiveRewards - previousActiveRewards; + uint256 activatedBalance = activatedDeposits * poolCapacity; + uint256 withdrawnBalance = withdrawnExits * poolCapacity; + int256 surplus = int256(activeBalance + sweptBalance) - (int256(getExpectedEffectiveBalance() + withdrawnBalance)); + int256 rewards = surplus - int256(reportFinalizableWithdrawnBalance); + int256 change = rewards - latestRewards; if (change > 0) { uint256 gain = SafeCast.toUint256(change); - if (actualActiveRewards > 0) { + if (rewards > 0) { uint256 gainAfterFees = subtractFees(gain); stakeRatioSum += Math.mulDiv( stakeRatioSum, @@ -289,18 +288,20 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { emit StakeRebalanced(loss); } - latestActiveBalance = activeBalance; - latestActiveBalanceAfterFees += expectedDeposits; - latestActiveBalanceAfterFees -= finalizableExitedBalance; - - if (newSweptRewards > 0) { - latestActiveBalanceAfterFees -= subtractFees(newSweptRewards); - depositRewards(newSweptRewards); + uint256 sweptRewards = sweptBalance - reportFinalizableWithdrawnBalance; + latestRewards = rewards - int256(sweptRewards); + if (sweptRewards > 0) { + latestActiveBalanceAfterFees -= subtractFees(sweptRewards); + depositRewards(sweptRewards); } + latestActiveBalance = activeBalance; + latestActiveBalanceAfterFees += activatedBalance; + latestActiveBalanceAfterFees -= reportFinalizableWithdrawnBalance; + reportPeriod++; - finalizableExitedBalance = 0; - finalizableExitedPoolCount = 0; + reportFinalizableWithdrawnBalance = 0; + finalizableWithdrawnPoolCount = 0; } /** @@ -388,6 +389,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { while (count > 0) { count--; + if (pendingWithdrawalQueue.length == 0) { + break; + } + Withdrawal memory withdrawal = pendingWithdrawalQueue[0]; if (withdrawal.period > reportPeriod) { @@ -535,30 +540,70 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } } + /** + * @notice Request a given count of pool unexpected exit reports + * @param count The number of pool unexpected exit reports + */ + function requestPoolUnexpectedExitReports(uint256 count) external { + require( + msg.sender == address(upkeep), + "Only upkeep can request pool unexpected exit reports" + ); + + requestedPoolUnexpectedExitReports = count; + + emit PoolUnexpectedExitReportsRequested(count); + } + + /** + * @notice Request a given count of pool slashed exit reports + * @param count The number of pool slashed exit reports + */ + function requestPoolSlashedExitReports(uint256 count) external { + require( + msg.sender == address(upkeep), + "Only upkeep can request pool slash reports" + ); + + requestedPoolSlashedExitReports = count; + + emit PoolSlashedExitReportsRequested(count); + } + /** * @notice Request a given count of pool exit completions * @param count The number of pool exits to complete */ - function requestPoolExitCompletions(uint256 count) external { + function requestPoolWithdrawnExitReports(uint256 count) external { require( msg.sender == address(upkeep), "Only upkeep can request pool exit completions" ); - emit PoolExitCompletionsRequested(count); + requestedPoolWithdrawnExitReports = count; + + emit PoolWithdrawnExitReportsRequested(count); } /** - * @notice Request a given count of pool slash reports - * @param count The number of pool slash reports + * @notice Report a pool unexpected exit + * @param poolId The pool ID */ - function requestPoolSlashReports(uint256 count) external { + function reportPoolUnexpectedExit(uint32 poolId) external { require( - msg.sender == address(upkeep), - "Only upkeep can request pool slash reports" + msg.sender == oracleAddress, + "Only manager oracle can report pool unexpected exits" ); + require( + requestedPoolUnexpectedExitReports > 0, + "No requested pool unexpected exit reports" + ); + Pool storage pool = pools[poolId]; + require(!pool.exiting, "Pool is already exiting"); - emit PoolSlashReportsRequested(count); + requestedPoolUnexpectedExitReports -= 1; + pool.exiting = true; + exitingPoolCount++; } /** @@ -568,11 +613,16 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function reportPoolSlash(uint32 poolId) external { require( msg.sender == oracleAddress, - "Only manager oracle can initiate pools" + "Only manager oracle can report pool slashedExits" + ); + require( + requestedPoolSlashedExitReports > 0, + "No requested pool slash reports" ); Pool storage pool = pools[poolId]; require(!pool.slashed, "Pool is already slashed"); + requestedPoolSlashedExitReports -= 1; pool.slashed = true; slashedPoolCount++; if (!pool.exiting) { @@ -594,32 +644,32 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint32[] memory blamePercents, ISSVNetworkCore.Cluster memory cluster ) external { - // Todo start debugging here - require( msg.sender == oracleAddress, "Only manager oracle can complete pool exits" ); - require(exitingPoolCount > 0, "No exiting validators"); + require( + requestedPoolWithdrawnExitReports > 0, + "No requested pool withdrawn exit reports" + ); + requestedPoolWithdrawnExitReports -= 1; uint32 poolId = stakedPoolIds[poolIndex]; Pool storage pool = pools[poolId]; - uint64[] memory operatorIds = pool.operatorIds; bytes memory publicKey = pool.publicKey; // Todo recover lost funds from collateral using blame percents depositedPoolCount--; - if (pool.exiting) { - exitingPoolCount--; - } + exitingPoolCount--; if (pool.slashed) { slashedPoolCount--; } - finalizableExitedPoolCount++; - finalizableExitedBalance += finalEffectiveBalance; + exitedBalance += finalEffectiveBalance; + reportFinalizableWithdrawnBalance += finalEffectiveBalance; + finalizableWithdrawnPoolCount++; stakedPoolIds.remove(poolIndex); delete pools[poolId]; @@ -851,7 +901,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Get the latest active balance - * @return activeBalance The latest active balance + * @return latestActiveBalance The latest active balance */ function getLatestActiveBalance() public view returns (uint256) { return latestActiveBalance; @@ -859,7 +909,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Get the latest active balance after fees - * @return activeBalanceAfterFees The latest active balance after fees + * @return latestActiveBalanceAfterFees The latest active balance after fees */ function getLatestActiveBalanceAfterFees() public view returns (uint256) { return latestActiveBalanceAfterFees; @@ -867,26 +917,26 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Get the latest active rewards - * @return activeRewards The latest active rewards + * @return latestRewards The latest active rewards */ function getLatestActiveRewards() public view returns (int256) { - return latestActiveRewards; + return latestRewards; } /** - * @notice Get the finalizable exited balance - * @return finalizableExitedBalance The finalizable exited balance + * @notice Get the finalizable withdrawn balance of the current reporting period + * @return reportFinalizableWithdrawnBalance The finalizable withdrawn balance of the current reporting period */ - function getFinalizableExitedBalance() public view returns (uint256) { - return finalizableExitedBalance; + function getReportFinalizableWithdrawnBalance() public view returns (uint256) { + return reportFinalizableWithdrawnBalance; } /** - * @notice Get the finalizable exited pool count - * @return finalizableExitedPoolCount The finalizable exited pool count + * @notice Get the finalizable withdrawn pool count of the current reporting period + * @return finalizableWithdrawnPoolCount The finalizable withdrawn pool count of the current reporting period */ - function getFinalizableExitedPoolCount() public view returns (uint256) { - return finalizableExitedPoolCount; + function getFinalizableWithdrawnPoolCount() public view returns (uint256) { + return finalizableWithdrawnPoolCount; } /** diff --git a/contracts/ethereum/src/CasimirRegistry.sol b/contracts/ethereum/src/CasimirRegistry.sol index a45d4124c..80e4ed2e6 100644 --- a/contracts/ethereum/src/CasimirRegistry.sol +++ b/contracts/ethereum/src/CasimirRegistry.sol @@ -15,6 +15,7 @@ contract CasimirRegistry is ICasimirRegistry { ISSVNetworkViews private ssvNetworkViews; uint256 requiredCollateral = 4 ether; uint256 minimumCollateralDeposit = 100000000000000000; + uint256 totalCollateral; mapping(uint64 => Operator) private operators; constructor(address managerAddress, address ssvNetworkViewsAddress) { @@ -31,6 +32,7 @@ contract CasimirRegistry is ICasimirRegistry { (address operatorOwner, , , ,) = ssvNetworkViews.getOperatorById(operatorId); require(msg.sender == operatorOwner, "Only operator owner can register"); + totalCollateral += msg.value; operators[operatorId] = Operator({ id: operatorId, collateral: int256(msg.value), diff --git a/contracts/ethereum/src/CasimirUpkeep.sol b/contracts/ethereum/src/CasimirUpkeep.sol index 6aa1d340f..aeb55d281 100644 --- a/contracts/ethereum/src/CasimirUpkeep.sol +++ b/contracts/ethereum/src/CasimirUpkeep.sol @@ -55,20 +55,20 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { uint256 private reportSweptBalance; /** Current report active balance */ uint256 private reportActiveBalance; - /** Current report completed deposits */ - uint256 private reportDeposits; - /** Current report completed exits */ - uint256 private reportExits; - /** Current report completed slashes */ - uint256 private reportSlashes; + /** Current report deposit activations */ + uint256 private reportActivatedDeposits; + /** Current report unexpected exits */ + uint256 private reportUnexpectedExits; + /** Current report withdrawn exits */ + uint256 private reportWithdrawnExits; + /** Current report slashedExits */ + uint256 private reportSlashedExits; /** Finalizable completed deposits */ - uint256 private finalizableDeposits; - /** Current report requests */ - mapping(bytes32 => RequestType) private reportRequests; - /** Current report remaining requests */ - uint256 reportRemainingRequests; - /** Latest error */ - bytes private latestError; + uint256 private reportFinalizableActivatedDeposits; + /** Current report request */ + bytes32 private reportRequestId; + /** Current report response error */ + bytes private reportResponseError; /** Binary request source code */ bytes public requestCBOR; /** Fulfillment gas limit */ @@ -154,8 +154,8 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { bool heartbeatLapsed = (block.timestamp - reportTimestamp) >= reportHeartbeat; upkeepNeeded = checkActive && heartbeatLapsed; } else if (reportStatus == Status.PROCESSING) { - bool exitsFinalizable = reportExits == manager.getFinalizableExitedPoolCount(); - upkeepNeeded = exitsFinalizable; + bool finalizeReport = reportWithdrawnExits == manager.getFinalizableWithdrawnPoolCount(); + upkeepNeeded = finalizeReport; } } @@ -169,6 +169,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { if (reportStatus == Status.FINALIZED) { reportStatus = Status.REQUESTING; + reportRequestBlock = block.number; reportTimestamp = block.timestamp; reportPeriod = manager.getReportPeriod(); reportPendingPoolCount = manager.getPendingPoolIds().length; @@ -176,18 +177,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { reportSweptBalance = manager.getSweptBalance(); Functions.Request memory req; - for (uint256 i = 1; i < 5; i++) { - RequestType requestType = RequestType(i); - bool checkBalance = requestType == RequestType.BALANCE; - bool checkDeposits = requestType == RequestType.DEPOSITS && reportPendingPoolCount > 0; - bool checkExits = requestType == RequestType.EXITS && reportExitingPoolCount > 0; - bool checkSlashes = requestType == RequestType.SLASHES; - if (checkBalance || checkDeposits || checkExits || checkSlashes) { - bytes32 requestId = sendRequest(req, functionsSubscriptionId, fulfillGasLimit); - reportRequests[requestId] = RequestType(i); - reportRemainingRequests++; - } - } + reportRequestId = sendRequest(req, functionsSubscriptionId, fulfillGasLimit); } else { if ( manager.getPendingWithdrawals() > 0 && @@ -197,26 +187,27 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { manager.completePendingWithdrawals(5); } - if (finalizableDeposits > 0) { - uint256 maxCompletions = finalizableDeposits > 5 ? 5 : finalizableDeposits; - finalizableDeposits -= maxCompletions; - manager.completePoolDeposits(maxCompletions); + if (reportFinalizableActivatedDeposits > 0) { + uint256 maxActivatedDeposits = reportFinalizableActivatedDeposits > 5 ? 5 : reportFinalizableActivatedDeposits; + reportFinalizableActivatedDeposits -= maxActivatedDeposits; + manager.completePoolDeposits(maxActivatedDeposits); } - if (!manager.getPendingWithdrawalEligibility(0, reportPeriod) && finalizableDeposits == 0) { + if (!manager.getPendingWithdrawalEligibility(0, reportPeriod) && reportFinalizableActivatedDeposits == 0) { reportStatus = Status.FINALIZED; - + manager.rebalanceStake({ activeBalance: reportActiveBalance, - newSweptRewards: reportSweptBalance - manager.getFinalizableExitedBalance(), - newDeposits: reportDeposits, - newExits: reportExits + sweptBalance: reportSweptBalance, + activatedDeposits: reportActivatedDeposits, + withdrawnExits: reportWithdrawnExits }); reportActiveBalance = 0; - reportDeposits = 0; - reportExits = 0; - reportSlashes = 0; + reportActivatedDeposits = 0; + reportUnexpectedExits = 0; + reportSlashedExits = 0; + reportWithdrawnExits = 0; } } @@ -235,33 +226,39 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { bytes memory response, bytes memory _error ) internal override { - // Todo handle errors - latestError = _error; + require(requestId == reportRequestId, "Invalid request ID"); + reportResponseError = _error; if (_error.length == 0) { - uint256 value = abi.decode(response, (uint256)); - RequestType requestType = reportRequests[requestId]; - - if (requestType != RequestType.NONE) { - delete reportRequests[requestId]; - reportRemainingRequests--; - - if (requestType == RequestType.BALANCE) { - reportActiveBalance = value; - } else if (requestType == RequestType.DEPOSITS) { - reportDeposits = value; - finalizableDeposits = value; - } else if (requestType == RequestType.EXITS) { - reportExits = value; - manager.requestPoolExitCompletions(value); - } else { - reportSlashes = value; - manager.requestPoolSlashReports(value); - } - - if (reportRemainingRequests == 0) { - reportStatus = Status.PROCESSING; - } + reportStatus = Status.PROCESSING; + reportRequestId = bytes32(0); + + ( + uint128 activeBalance, + uint32 activatedDeposits, + uint32 unexpectedExits, + uint32 slashedExits, + uint32 withdrawnExits + ) = abi.decode(response, (uint128, uint32, uint32, uint32, uint32)); + + reportActiveBalance = uint256(activeBalance) * 1 gwei; + reportActivatedDeposits = activatedDeposits; + reportUnexpectedExits = unexpectedExits; + reportSlashedExits = slashedExits; + reportWithdrawnExits = withdrawnExits; + + reportFinalizableActivatedDeposits = activatedDeposits; + + if (reportUnexpectedExits > 0) { + manager.requestPoolUnexpectedExitReports(reportUnexpectedExits); + } + + if (reportSlashedExits > 0) { + manager.requestPoolSlashedExitReports(reportSlashedExits); + } + + if (reportWithdrawnExits > 0) { + manager.requestPoolWithdrawnExitReports(reportWithdrawnExits); } } @@ -278,6 +275,27 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { // Dev-only functions + /** + * @notice Encode the response for testing + * @param activeBalance Active balance + * @param activatedDeposits Count of new deposits + * @param withdrawnExits Count of new exits + * @param slashedExits Count of new slashedExits + */ + function encodeResponse( + uint128 activeBalance, + uint32 activatedDeposits, + uint32 withdrawnExits, + uint32 slashedExits + ) external pure returns (bytes memory) { + return abi.encode( + activeBalance, + activatedDeposits, + withdrawnExits, + slashedExits + ); + } + /** * @notice Fulfill the request for testing * @param requestId The request ID, returned by sendRequest() diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index 0e23970d3..e1811cb03 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -47,8 +47,9 @@ interface ICasimirManager { event PoolReshareRequested(uint32 poolId); event PoolReshared(uint32 poolId); event PoolExitRequested(uint32 poolId); - event PoolSlashReportsRequested(uint256 count); - event PoolExitCompletionsRequested(uint256 count); + event PoolUnexpectedExitReportsRequested(uint256 count); + event PoolSlashedExitReportsRequested(uint256 count); + event PoolWithdrawnExitReportsRequested(uint256 count); event PoolExited(uint32 poolId); event StakeDeposited(address sender, uint256 amount); event StakeRebalanced(uint256 amount); @@ -65,9 +66,9 @@ interface ICasimirManager { function rebalanceStake( uint256 activeBalance, - uint256 newSweptRewards, - uint256 newDeposits, - uint256 newExits + uint256 sweptBalance, + uint256 activatedDeposits, + uint256 withdrawnExits ) external; function requestWithdrawal(uint256 amount) external; @@ -87,9 +88,11 @@ interface ICasimirManager { function completePoolDeposits(uint256 count) external; - function requestPoolExitCompletions(uint256 count) external; + function requestPoolUnexpectedExitReports(uint256 count) external; - function requestPoolSlashReports(uint256 count) external; + function requestPoolSlashedExitReports(uint256 count) external; + + function requestPoolWithdrawnExitReports(uint256 count) external; function completePoolExit( uint256 poolIndex, @@ -134,9 +137,9 @@ interface ICasimirManager { function getReportPeriod() external view returns (uint32); - function getFinalizableExitedPoolCount() external view returns (uint256); + function getFinalizableWithdrawnPoolCount() external view returns (uint256); - function getFinalizableExitedBalance() external view returns (uint256); + function getReportFinalizableWithdrawnBalance() external view returns (uint256); function getLatestActiveBalance() external view returns (uint256); diff --git a/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol b/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol index 5cf10f69b..08ad49b68 100644 --- a/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol +++ b/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol @@ -15,15 +15,6 @@ interface ICasimirUpkeep is AutomationCompatibleInterface { PROCESSING } - /** Request types */ - enum RequestType { - NONE, - BALANCE, - DEPOSITS, - EXITS, - SLASHES - } - /**********/ /* Events */ /**********/ diff --git a/contracts/ethereum/src/mock/MockFunctionsOracle.sol b/contracts/ethereum/src/mock/MockFunctionsOracle.sol index cf7542aea..2193af30b 100644 --- a/contracts/ethereum/src/mock/MockFunctionsOracle.sol +++ b/contracts/ethereum/src/mock/MockFunctionsOracle.sol @@ -10,7 +10,7 @@ import "hardhat/console.sol"; */ contract MockFunctionsOracle { - uint256 private latestRequestIdNumber; + uint256 private lastRequestNumber; uint64 private subscriptionId; bytes private data; uint32 private gasLimit; @@ -41,7 +41,7 @@ contract MockFunctionsOracle { subscriptionId = _subscriptionId; data = _data; gasLimit = _gasLimit; - latestRequestIdNumber++; - requestId = keccak256(abi.encode(latestRequestIdNumber)); + lastRequestNumber++; + requestId = keccak256(abi.encode(lastRequestNumber)); } } diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 2bd328095..e5664ea8d 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -2,8 +2,8 @@ import { ethers } from 'hardhat' import { loadFixture, time, setBalance } from '@nomicfoundation/hardhat-network-helpers' import { deployContract } from '@casimir/ethereum/helpers/deploy' import { CasimirManager, CasimirUpkeep } from '@casimir/ethereum/build/artifacts/types' -import { performReport } from '@casimir/ethereum/helpers/upkeep' -import { completePoolExitHandler, initiatePoolDepositHandler } from '@casimir/ethereum/helpers/oracle' +import { fulfillReportRequest, runUpkeep } from '@casimir/ethereum/helpers/upkeep' +import { initiatePoolDepositHandler, completePoolExitHandler } from '@casimir/ethereum/helpers/oracle' import { round } from '@casimir/ethereum/helpers/math' import { ContractConfig, DeploymentConfig } from '@casimir/types' @@ -93,23 +93,27 @@ export async function secondUserDepositFixture() { const nextPoolId = 1 await initiatePoolDepositHandler({ manager, signer: oracle, args: { poolId: nextPoolId } }) - await time.increase(time.duration.days(1)) + await time.increase(time.duration.days(1)) + + await runUpkeep({ upkeep, keeper }) + let requestId = 0 - const nextValues = [ - 32, // activeBalance - 1, // deposits - 0, // exits - 0, // slashes - ] - - requestId = await performReport({ - manager, + const nextValues = { + activeBalance: 32, + activatedDeposits: 1, + unexpectedExits: 0, + slashedExits: 0, + withdrawnExits: 0 + } + requestId = await fulfillReportRequest({ upkeep, keeper, values: nextValues, requestId }) + await runUpkeep({ upkeep, keeper }) + return { manager, upkeep, owner, firstUser, secondUser, keeper, oracle, requestId } } @@ -118,22 +122,26 @@ export async function rewardsPostSecondUserDepositFixture() { const { manager, upkeep, owner, firstUser, secondUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(secondUserDepositFixture) await time.increase(time.duration.days(1)) + + await runUpkeep({ upkeep, keeper }) + let requestId = latestRequestId - const nextValues = [ - 32.105, // activeBalance - 0, // deposits - 0, // exits - 0, // slashes - ] - - requestId = await performReport({ - manager, + const nextValues = { + activeBalance: 32.105, + activatedDeposits: 0, + unexpectedExits: 0, + slashedExits: 0, + withdrawnExits: 0 + } + requestId = await fulfillReportRequest({ upkeep, keeper, values: nextValues, requestId }) + await runUpkeep({ upkeep, keeper }) + return { manager, upkeep, owner, firstUser, secondUser, keeper, oracle, requestId } } @@ -147,21 +155,26 @@ export async function sweepPostSecondUserDepositFixture() { await setBalance(manager.address, nextBalance) await time.increase(time.duration.days(1)) + + await runUpkeep({ upkeep, keeper }) + let requestId = latestRequestId - const nextValues = [ - 32, // activeBalance - 0, // deposits - 0, // exits - 0, // slashes - ] - requestId = await performReport({ - manager, + const nextValues = { + activeBalance: 32, + activatedDeposits: 0, + unexpectedExits: 0, + slashedExits: 0, + withdrawnExits: 0 + } + requestId = await fulfillReportRequest({ upkeep, keeper, values: nextValues, requestId }) + await runUpkeep({ upkeep, keeper }) + return { manager, upkeep, owner, firstUser, secondUser, keeper, oracle, requestId } } @@ -179,21 +192,26 @@ export async function thirdUserDepositFixture() { await initiatePoolDepositHandler({ manager, signer: oracle, args: { poolId: nextPoolId } }) await time.increase(time.duration.days(1)) + + await runUpkeep({ upkeep, keeper }) + let requestId = latestRequestId - const nextValues = [ - 64, // activeBalance - 1, // deposits - 0, // exits - 0, // slashes - ] - requestId = await performReport({ - manager, + const nextValues = { + activeBalance: 64, + activatedDeposits: 1, + unexpectedExits: 0, + slashedExits: 0, + withdrawnExits: 0 + } + requestId = await fulfillReportRequest({ upkeep, keeper, values: nextValues, requestId }) + await runUpkeep({ upkeep, keeper }) + return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId } } @@ -202,21 +220,26 @@ export async function rewardsPostThirdUserDepositFixture() { const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(thirdUserDepositFixture) await time.increase(time.duration.days(1)) + + await runUpkeep({ upkeep, keeper }) + let requestId = latestRequestId - const nextValues = [ - 64.21, // activeBalance - 0, // deposits - 0, // exits - 0, // slashes - ] - requestId = await performReport({ - manager, + const nextValues = { + activeBalance: 64.21, + activatedDeposits: 0, + unexpectedExits: 0, + slashedExits: 0, + withdrawnExits: 0 + } + requestId = await fulfillReportRequest({ upkeep, keeper, values: nextValues, requestId }) + await runUpkeep({ upkeep, keeper }) + return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId } } @@ -230,21 +253,26 @@ export async function sweepPostThirdUserDepositFixture() { await setBalance(manager.address, nextBalance) await time.increase(time.duration.days(1)) + + await runUpkeep({ upkeep, keeper }) + let requestId = latestRequestId - const nextValues = [ - 64, // activeBalance - 0, // deposits - 0, // exits - 0, // slashes - ] - requestId = await performReport({ - manager, + const nextValues = { + activeBalance: 64, + activatedDeposits: 0, + unexpectedExits: 0, + slashedExits: 0, + withdrawnExits: 0 + } + requestId = await fulfillReportRequest({ upkeep, keeper, values: nextValues, requestId }) + await runUpkeep({ upkeep, keeper }) + return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId } } @@ -256,21 +284,26 @@ export async function firstUserPartialWithdrawalFixture() { await withdraw.wait() await time.increase(time.duration.days(1)) + + await runUpkeep({ upkeep, keeper }) + let requestId = latestRequestId - const nextValues = [ - 64, // activeBalance - 0, // deposits - 0, // exits - 0, // slashes - ] - requestId = await performReport({ - manager, + const nextValues = { + activeBalance: 64, + activatedDeposits: 0, + unexpectedExits: 0, + slashedExits: 0, + withdrawnExits: 0 + } + requestId = await fulfillReportRequest({ upkeep, keeper, values: nextValues, requestId }) + await runUpkeep({ upkeep, keeper }) + return { manager, upkeep, firstUser, secondUser, thirdUser, keeper, oracle, requestId } } @@ -291,21 +324,26 @@ export async function fourthUserDepositFixture() { } await time.increase(time.duration.days(1)) + + await runUpkeep({ upkeep, keeper }) + let requestId = latestRequestId - const nextValues = [ - 128, // activeBalance - 2, // deposits - 0, // exits - 0, // slashes - ] - requestId = await performReport({ - manager, + const nextValues = { + activeBalance: 128, + activatedDeposits: 2, + unexpectedExits: 0, + slashedExits: 0, + withdrawnExits: 0 + } + requestId = await fulfillReportRequest({ upkeep, keeper, values: nextValues, requestId }) + await runUpkeep({ upkeep, keeper }) + return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } } @@ -314,21 +352,28 @@ export async function activeBalanceLossFixture() { const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(fourthUserDepositFixture) await time.increase(time.duration.days(1)) + + await runUpkeep({ upkeep, keeper }) + let requestId = latestRequestId - const nextValues = [ - 126, // activeBalance - 0, // deposits - 0, // exits - 0, // slashes - ] - requestId = await performReport({ - manager, + + const nextValues = { + activeBalance: 126, + activatedDeposits: 0, + unexpectedExits: 0, + slashedExits: 0, + withdrawnExits: 0 + } + + requestId = await fulfillReportRequest({ upkeep, keeper, values: nextValues, requestId }) + await runUpkeep({ upkeep, keeper }) + return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } } @@ -336,26 +381,32 @@ export async function activeBalanceLossFixture() { export async function activeBalanceRecoveryFixture() { const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(activeBalanceLossFixture) - /** Simulate two distinct reported gains */ - let nextActiveBalanceAmount = 127 + let nextActiveBalance = 127 let requestId = latestRequestId + for (let i = 0; i < 2; i++) { await time.increase(time.duration.days(1)) - const nextValues = [ - nextActiveBalanceAmount, // activeBalance - 0, // deposits - 0, // exits - 0, // slashes - ] - requestId = await performReport({ - manager, + + await runUpkeep({ upkeep, keeper }) + + const nextValues = { + activeBalance: nextActiveBalance, + activatedDeposits: 0, + unexpectedExits: 0, + slashedExits: 0, + withdrawnExits: 0 + } + + requestId = await fulfillReportRequest({ upkeep, keeper, values: nextValues, requestId }) - nextActiveBalanceAmount += 1 + await runUpkeep({ upkeep, keeper }) + + nextActiveBalance += 1 } return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } @@ -374,24 +425,31 @@ export async function thirdUserFullWithdrawalFixture() { const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptExitBalance.toString())) await setBalance(manager.address, nextBalance) - await completePoolExitHandler({ manager, signer: oracle }) - await time.increase(time.duration.days(1)) + + await runUpkeep({ upkeep, keeper }) + let requestId = latestRequestId - const nextValues = [ - 128, // activeBalance - 0, // deposits - 1, // exits - 0, // slashes - ] - requestId = await performReport({ - manager, + + const nextValues = { + activeBalance: 128, + activatedDeposits: 0, + unexpectedExits: 0, + slashedExits: 0, + withdrawnExits: 1 + } + + requestId = await fulfillReportRequest({ upkeep, keeper, values: nextValues, requestId }) + await completePoolExitHandler({ manager, signer: oracle }) + + await runUpkeep({ upkeep, keeper }) + return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } } @@ -400,29 +458,37 @@ export async function simulationFixture() { const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(thirdUserFullWithdrawalFixture) const rewardsPerValidator = 0.105 - let nextActiveBalanceAmount = 96 + let nextActiveBalance = 96 let totalRewards = 0 let requestId = latestRequestId + for (let i = 0; i < 5; i++) { const depositedPoolCount = await manager.getDepositedPoolCount() if (depositedPoolCount) { await time.increase(time.duration.days(1)) + + await runUpkeep({ upkeep, keeper }) + const rewardsAmount = rewardsPerValidator * depositedPoolCount.toNumber() totalRewards += round(rewardsAmount, 10) - nextActiveBalanceAmount = round(nextActiveBalanceAmount + rewardsAmount, 10) - const nextValues = [ - nextActiveBalanceAmount, // activeBalance - 0, // deposits - 0, // exits - 0, // slashes - ] - requestId = await performReport({ - manager, + nextActiveBalance = round(nextActiveBalance + rewardsAmount, 10) + + const nextValues = { + activeBalance: nextActiveBalance, + activatedDeposits: 0, + unexpectedExits: 0, + slashedExits: 0, + withdrawnExits: 0 + } + + requestId = await fulfillReportRequest({ upkeep, keeper, values: nextValues, requestId }) + + await runUpkeep({ upkeep, keeper }) } } @@ -431,21 +497,26 @@ export async function simulationFixture() { const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptRewards.toString())) await setBalance(manager.address, nextBalance) - await time.increase(time.duration.days(1)) - const nextValues = [ - 96, // activeBalance - 0, // deposits - 0, // exits - 0, // slashes - ] - requestId = await performReport({ - manager, + + await runUpkeep({ upkeep, keeper }) + + const nextValues = { + activeBalance: 96, + activatedDeposits: 0, + unexpectedExits: 0, + slashedExits: 0, + withdrawnExits: 0 + } + + requestId = await fulfillReportRequest({ upkeep, keeper, values: nextValues, requestId }) + await runUpkeep({ upkeep, keeper }) + return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } } \ No newline at end of file diff --git a/contracts/ethereum/test/integration.ts b/contracts/ethereum/test/integration.ts index 049e25d8a..e50d04a39 100644 --- a/contracts/ethereum/test/integration.ts +++ b/contracts/ethereum/test/integration.ts @@ -139,14 +139,14 @@ describe('Casimir manager', async function () { it('A loss is reported and brings the active stake below expected', async function () { const { manager } = await loadFixture(activeBalanceLossFixture) - const activeStake = await manager.getLatestActiveBalance() - expect(ethers.utils.formatEther(activeStake)).equal('126.0') + const activeBalance = await manager.getLatestActiveBalance() + expect(ethers.utils.formatEther(activeBalance)).equal('126.0') }) it('Gains are reported and bring the active stake back to expected', async function () { const { manager } = await loadFixture(activeBalanceRecoveryFixture) - const activeStake = await manager.getLatestActiveBalance() - expect(ethers.utils.formatEther(activeStake)).equal('128.0') + const activeBalance = await manager.getLatestActiveBalance() + expect(ethers.utils.formatEther(activeBalance)).equal('128.0') }) it('Third user full withdrawal is completed on exit report', async function () { diff --git a/contracts/ethereum/test/packing.ts b/contracts/ethereum/test/packing.ts deleted file mode 100644 index 1cd5c5701..000000000 --- a/contracts/ethereum/test/packing.ts +++ /dev/null @@ -1,17 +0,0 @@ -// import { packResponse, unpackResponse } from '../helpers/upkeep' -// import { expect } from 'chai' - -// describe('Pack/unpack', function() { -// it('Should correctly pack and unpack the summary response', function() { -// const packed = packResponse({ -// values: ['32105000000', '1', '0', '0', '0'], -// bits: [128, 32, 32, 32, 32] -// }) -// const unpacked = unpackResponse({ packed: packed.toString(), bits: [128, 32, 32, 32, 32] }) -// expect(unpacked[0]).to.equal('32105000000') -// expect(unpacked[1]).to.equal('1') -// expect(unpacked[2]).to.equal('0') -// expect(unpacked[3]).to.equal('0') -// expect(unpacked[4]).to.equal('0') -// }) -// }) \ No newline at end of file From 85d8dde598037b04bbee125d80a7b70ba4d67ae4 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Wed, 31 May 2023 16:18:29 -0400 Subject: [PATCH 41/78] Add modifiers --- contracts/ethereum/docs/index.md | 583 ++++++++++++---------- contracts/ethereum/src/CasimirManager.sol | 175 ++++--- contracts/ethereum/src/CasimirUpkeep.sol | 17 +- 3 files changed, 413 insertions(+), 362 deletions(-) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 55c6aa307..ab28a7786 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -12,10 +12,10 @@ enum Token { } ``` -### finalizableExitedPoolCount +### finalizableWithdrawnPoolCount ```solidity -uint256 finalizableExitedPoolCount +uint256 finalizableWithdrawnPoolCount ``` Exited pool count @@ -62,7 +62,7 @@ Deposit user stake ### rebalanceStake ```solidity -function rebalanceStake(uint256 activeBalance, uint256 sweptRewards, uint256 depositCount, uint256 exitCount) external +function rebalanceStake(uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, uint256 withdrawnExits) external ``` Rebalance the rewards to stake ratio and redistribute swept rewards @@ -71,10 +71,10 @@ Rebalance the rewards to stake ratio and redistribute swept rewards | Name | Type | Description | | ---- | ---- | ----------- | -| activeBalance | uint256 | The active consensus balance | -| sweptRewards | uint256 | The swept consensus rewards | -| depositCount | uint256 | The count of new deposits | -| exitCount | uint256 | The count of new exits | +| activeBalance | uint256 | The active balance | +| sweptBalance | uint256 | The swept balance | +| activatedDeposits | uint256 | The count of activated deposits | +| withdrawnExits | uint256 | The count of withdrawn exits | ### requestWithdrawal @@ -139,6 +139,34 @@ Complete a given count of the next pending pools | ---- | ---- | ----------- | | count | uint256 | The number of pools to complete | +### requestPoolUnexpectedExitReports + +```solidity +function requestPoolUnexpectedExitReports(uint256 count) external +``` + +Request a given count of pool unexpected exit reports + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| count | uint256 | The number of pool unexpected exit reports | + +### requestPoolSlashedExitReports + +```solidity +function requestPoolSlashedExitReports(uint256 count) external +``` + +Request a given count of pool slashed exit reports + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| count | uint256 | The number of pool slashed exit reports | + ### requestPoolWithdrawnExitReports ```solidity @@ -153,19 +181,19 @@ Request a given count of pool exit completions | ---- | ---- | ----------- | | count | uint256 | The number of pool exits to complete | -### requestPoolSlashedExitReports +### reportPoolUnexpectedExit ```solidity -function requestPoolSlashedExitReports(uint256 count) external +function reportPoolUnexpectedExit(uint32 poolId) external ``` -Request a given count of pool slash reports +Report a pool unexpected exit #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| count | uint256 | The number of pool slash reports | +| poolId | uint32 | The pool ID | ### reportPoolSlash @@ -386,7 +414,7 @@ Get the latest active balance | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | activeBalance The latest active balance | +| [0] | uint256 | latestActiveBalance The latest active balance | ### getLatestActiveBalanceAfterFees @@ -400,7 +428,7 @@ Get the latest active balance after fees | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | activeBalanceAfterFees The latest active balance after fees | +| [0] | uint256 | latestActiveBalanceAfterFees The latest active balance after fees | ### getLatestActiveRewards @@ -414,35 +442,35 @@ Get the latest active rewards | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | int256 | activeRewards The latest active rewards | +| [0] | int256 | latestRewards The latest active rewards | -### getReportWithdrawnBalance +### getReportFinalizableWithdrawnBalance ```solidity -function getReportWithdrawnBalance() public view returns (uint256) +function getReportFinalizableWithdrawnBalance() public view returns (uint256) ``` -Get the finalizable exited balance +Get the finalizable withdrawn balance of the current reporting period #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | reportFinalizableWithdrawnBalance The finalizable exited balance | +| [0] | uint256 | reportFinalizableWithdrawnBalance The finalizable withdrawn balance of the current reporting period | -### getReportWithdrawnPoolCount +### getFinalizableWithdrawnPoolCount ```solidity -function getReportWithdrawnPoolCount() public view returns (uint256) +function getFinalizableWithdrawnPoolCount() public view returns (uint256) ``` -Get the finalizable exited pool count +Get the finalizable withdrawn pool count of the current reporting period #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | finalizableExitedPoolCount The finalizable exited pool count | +| [0] | uint256 | finalizableWithdrawnPoolCount The finalizable withdrawn pool count of the current reporting period | ### getPendingWithdrawalQueue @@ -688,6 +716,123 @@ Get the upkeep address | ---- | ---- | ----------- | | upkeepAddress | address | The upkeep address | +## CasimirRegistry + +### requiredCollateral + +```solidity +uint256 requiredCollateral +``` + +### minimumCollateralDeposit + +```solidity +uint256 minimumCollateralDeposit +``` + +### totalCollateral + +```solidity +uint256 totalCollateral +``` + +### constructor + +```solidity +constructor(address managerAddress, address ssvNetworkViewsAddress) public +``` + +### registerOperator + +```solidity +function registerOperator(uint64 operatorId) external payable +``` + +Register an operator with the set + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +### requestOperatorDeregistration + +```solidity +function requestOperatorDeregistration(uint64 operatorId) external +``` + +Request to deregister an operator from the set + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +### completeOperatorDeregistration + +```solidity +function completeOperatorDeregistration(uint64 operatorId) external +``` + +Deregister an operator from the set + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +### depositCollateral + +```solidity +function depositCollateral(uint64 operatorId) external payable +``` + +Deposit collateral for an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +### setOperatorCollateral + +```solidity +function setOperatorCollateral(uint64 operatorId, int256 collateral) external +``` + +Set the collateral for an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | +| collateral | int256 | The collateral | + +### getOperatorCollateral + +```solidity +function getOperatorCollateral(uint64 operatorId) external view returns (int256) +``` + +Get the collateral for an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | int256 | The collateral | + ## CasimirUpkeep ### reportHeartbeat @@ -738,14 +883,6 @@ uint256 reportRequestBlock Current report block -### reportRemainingRequests - -```solidity -uint256 reportRemainingRequests -``` - -Current report remaining requests - ### requestCBOR ```solidity @@ -863,6 +1000,23 @@ Update the functions oracle address | ---- | ---- | ----------- | | newOracleAddress | address | New oracle address | +### encodeResponse + +```solidity +function encodeResponse(uint128 activeBalance, uint32 activatedDeposits, uint32 withdrawnExits, uint32 slashedExits) external pure returns (bytes) +``` + +Encode the response for testing + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| activeBalance | uint128 | Active balance | +| activatedDeposits | uint32 | Count of new deposits | +| withdrawnExits | uint32 | Count of new exits | +| slashedExits | uint32 | Count of new slashedExits | + ### mockFulfillRequest ```solidity @@ -962,6 +1116,12 @@ event PoolReshared(uint32 poolId) event PoolExitRequested(uint32 poolId) ``` +### PoolUnexpectedExitReportsRequested + +```solidity +event PoolUnexpectedExitReportsRequested(uint256 count) +``` + ### PoolSlashedExitReportsRequested ```solidity @@ -1025,7 +1185,7 @@ function depositStake() external payable ### rebalanceStake ```solidity -function rebalanceStake(uint256 activeBalance, uint256 sweptRewards, uint256 depositCount, uint256 exitCount) external +function rebalanceStake(uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, uint256 withdrawnExits) external ``` ### requestWithdrawal @@ -1052,10 +1212,10 @@ function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, bytes sig function completePoolDeposits(uint256 count) external ``` -### requestPoolWithdrawnExitReports +### requestPoolUnexpectedExitReports ```solidity -function requestPoolWithdrawnExitReports(uint256 count) external +function requestPoolUnexpectedExitReports(uint256 count) external ``` ### requestPoolSlashedExitReports @@ -1064,6 +1224,12 @@ function requestPoolWithdrawnExitReports(uint256 count) external function requestPoolSlashedExitReports(uint256 count) external ``` +### requestPoolWithdrawnExitReports + +```solidity +function requestPoolWithdrawnExitReports(uint256 count) external +``` + ### completePoolExit ```solidity @@ -1160,16 +1326,16 @@ function getExpectedEffectiveBalance() external view returns (uint256) function getReportPeriod() external view returns (uint32) ``` -### getReportWithdrawnPoolCount +### getFinalizableWithdrawnPoolCount ```solidity -function getReportWithdrawnPoolCount() external view returns (uint256) +function getFinalizableWithdrawnPoolCount() external view returns (uint256) ``` -### getReportWithdrawnBalance +### getReportFinalizableWithdrawnBalance ```solidity -function getReportWithdrawnBalance() external view returns (uint256) +function getReportFinalizableWithdrawnBalance() external view returns (uint256) ``` ### getLatestActiveBalance @@ -1232,6 +1398,73 @@ function getPendingWithdrawals() external view returns (uint256) function getPendingWithdrawalCount() external view returns (uint256) ``` +## ICasimirRegistry + +### OperatorRegistered + +```solidity +event OperatorRegistered(uint64 operatorId) +``` + +### OperatorDeregistrationRequested + +```solidity +event OperatorDeregistrationRequested(uint64 operatorId) +``` + +### OperatorDeregistrationCompleted + +```solidity +event OperatorDeregistrationCompleted(uint64 operatorId) +``` + +### Operator + +```solidity +struct Operator { + uint64 id; + int256 collateral; + uint256 poolCount; + bool deregistering; +} +``` + +### registerOperator + +```solidity +function registerOperator(uint64 operatorId) external payable +``` + +### requestOperatorDeregistration + +```solidity +function requestOperatorDeregistration(uint64 operatorId) external +``` + +### completeOperatorDeregistration + +```solidity +function completeOperatorDeregistration(uint64 operatorId) external +``` + +### depositCollateral + +```solidity +function depositCollateral(uint64 operatorId) external payable +``` + +### setOperatorCollateral + +```solidity +function setOperatorCollateral(uint64 operatorId, int256 collateral) external +``` + +### getOperatorCollateral + +```solidity +function getOperatorCollateral(uint64 operatorId) external view returns (int256) +``` + ## ICasimirUpkeep ### Status @@ -1244,18 +1477,6 @@ enum Status { } ``` -### RequestType - -```solidity -enum RequestType { - NONE, - BALANCE, - DEPOSITS, - EXITS, - SLASHES -} -``` - ### OCRResponse ```solidity @@ -1399,256 +1620,122 @@ _Send ETH to a user_ | user | address | The user address | | amount | uint256 | The amount of stake to send | -## IDepositContract - -### DepositEvent - -```solidity -event DepositEvent(bytes pubkey, bytes withdrawal_credentials, bytes amount, bytes signature, bytes index) -``` - -A processed deposit event. - -### deposit - -```solidity -function deposit(bytes pubkey, bytes withdrawal_credentials, bytes signature, bytes32 deposit_data_root) external payable -``` - -Submit a Phase 0 DepositData object. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| pubkey | bytes | A BLS12-381 public key. | -| withdrawal_credentials | bytes | Commitment to a public key for withdrawals. | -| signature | bytes | A BLS12-381 signature. | -| deposit_data_root | bytes32 | The SHA-256 hash of the SSZ-encoded DepositData object. Used as a protection against malformed input. | +## MockFunctionsOracle -### get_deposit_root +### constructor ```solidity -function get_deposit_root() external view returns (bytes32) +constructor() public ``` -Query the current deposit root hash. - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes32 | The deposit root hash. | - -### get_deposit_count +### getRegistry ```solidity -function get_deposit_count() external view returns (bytes) +function getRegistry() external view returns (address) ``` -Query the current deposit count. +Returns the address of the registry contract #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes | The deposit count encoded as a little endian 64-bit number. | - -## IWETH9 - -### deposit - -```solidity -function deposit() external payable -``` - -Deposit ether to get wrapped ether - -### withdraw - -```solidity -function withdraw(uint256) external -``` - -Withdraw wrapped ether to get ether - -## CasimirRegistry - -### requiredCollateral - -```solidity -uint256 requiredCollateral -``` - -### minimumCollateralDeposit - -```solidity -uint256 minimumCollateralDeposit -``` - -### constructor - -```solidity -constructor(address managerAddress, address ssvNetworkViewsAddress) public -``` +| [0] | address | address The address of the registry contract | -### registerOperator +### sendRequest ```solidity -function registerOperator(uint64 operatorId) external payable +function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) ``` -Register an operator with the set +Sends a request (encoded as data) using the provided subscriptionId #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | - -### requestOperatorDeregistration - -```solidity -function requestOperatorDeregistration(uint64 operatorId) external -``` - -Request to deregister an operator from the set +| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | +| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| _gasLimit | uint32 | Gas limit for the fulfillment callback | -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +| requestId | bytes32 | A unique request identifier (unique per DON) | -### completeOperatorDeregistration +## IDepositContract + +### DepositEvent ```solidity -function completeOperatorDeregistration(uint64 operatorId) external +event DepositEvent(bytes pubkey, bytes withdrawal_credentials, bytes amount, bytes signature, bytes index) ``` -Deregister an operator from the set - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +A processed deposit event. -### depositCollateral +### deposit ```solidity -function depositCollateral(uint64 operatorId) external payable +function deposit(bytes pubkey, bytes withdrawal_credentials, bytes signature, bytes32 deposit_data_root) external payable ``` -Deposit collateral for an operator +Submit a Phase 0 DepositData object. #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +| pubkey | bytes | A BLS12-381 public key. | +| withdrawal_credentials | bytes | Commitment to a public key for withdrawals. | +| signature | bytes | A BLS12-381 signature. | +| deposit_data_root | bytes32 | The SHA-256 hash of the SSZ-encoded DepositData object. Used as a protection against malformed input. | -### setOperatorCollateral +### get_deposit_root ```solidity -function setOperatorCollateral(uint64 operatorId, int256 collateral) external +function get_deposit_root() external view returns (bytes32) ``` -Set the collateral for an operator +Query the current deposit root hash. -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | -| collateral | int256 | The collateral | +| [0] | bytes32 | The deposit root hash. | -### getOperatorCollateral +### get_deposit_count ```solidity -function getOperatorCollateral(uint64 operatorId) external view returns (int256) +function get_deposit_count() external view returns (bytes) ``` -Get the collateral for an operator - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +Query the current deposit count. #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | int256 | The collateral | - -## ICasimirRegistry - -### OperatorRegistered - -```solidity -event OperatorRegistered(uint64 operatorId) -``` - -### OperatorDeregistrationRequested - -```solidity -event OperatorDeregistrationRequested(uint64 operatorId) -``` - -### OperatorDeregistrationCompleted - -```solidity -event OperatorDeregistrationCompleted(uint64 operatorId) -``` - -### Operator - -```solidity -struct Operator { - uint64 id; - int256 collateral; - uint256 poolCount; - bool deregistering; -} -``` - -### registerOperator - -```solidity -function registerOperator(uint64 operatorId) external payable -``` - -### requestOperatorDeregistration +| [0] | bytes | The deposit count encoded as a little endian 64-bit number. | -```solidity -function requestOperatorDeregistration(uint64 operatorId) external -``` +## IWETH9 -### completeOperatorDeregistration +### deposit ```solidity -function completeOperatorDeregistration(uint64 operatorId) external +function deposit() external payable ``` -### depositCollateral - -```solidity -function depositCollateral(uint64 operatorId) external payable -``` +Deposit ether to get wrapped ether -### setOperatorCollateral +### withdraw ```solidity -function setOperatorCollateral(uint64 operatorId, int256 collateral) external +function withdraw(uint256) external ``` -### getOperatorCollateral - -```solidity -function getOperatorCollateral(uint64 operatorId) external view returns (int256) -``` +Withdraw wrapped ether to get ether ## CasimirRecipient @@ -1660,50 +1747,6 @@ receive() external payable ## ICasimirRecipient -## MockFunctionsOracle - -### constructor - -```solidity -constructor() public -``` - -### getRegistry - -```solidity -function getRegistry() external view returns (address) -``` - -Returns the address of the registry contract - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | address | address The address of the registry contract | - -### sendRequest - -```solidity -function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) -``` - -Sends a request (encoded as data) using the provided subscriptionId - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| _gasLimit | uint32 | Gas limit for the fulfillment callback | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | A unique request identifier (unique per DON) | - ## CasimirDAO ### owners diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index cda565bf6..7f02ba33b 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -152,6 +152,55 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** SSV fee percentage */ uint32 private ssvFeePercent = 1; + /*************/ + /* Modifiers */ + /*************/ + + /** + * @dev Validate the caller is the manager oracle + */ + modifier onlyOracle() { + require( + msg.sender == oracleAddress, + "Only manager oracle can call this function" + ); + _; + } + + /** + * @dev Validate the caller is the upkeep contract + */ + modifier onlyUpkeep() { + require( + msg.sender == address(upkeep), + "Only upkeep can call this function" + ); + _; + } + + /** + * @dev Validate a deposit + */ + modifier validateDeposit() { + require( + msg.value > 0, + "Deposit must be greater than zero" + ); + _; + } + + /** + * @dev Validate a distribution + * @param amount The amount to validate + */ + modifier validDistribution(uint256 amount) { + require( + amount > 0, + "Distribution must be greater than zero" + ); + _; + } + /** * @notice Constructor * @param _oracleAddress The manager oracle address @@ -205,9 +254,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Deposit user stake */ - function depositStake() external payable nonReentrant { - require(msg.value > 0, "Deposit amount must be greater than 0"); - + function depositStake() external payable nonReentrant validateDeposit() { uint256 depositAfterFees = subtractFees(msg.value); reservedFees += msg.value - depositAfterFees; @@ -223,7 +270,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Deposit rewards + * @notice Deposit a given amount of rewards * @param rewards The amount of rewards to deposit */ function depositRewards(uint256 rewards) private { @@ -234,6 +281,31 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { emit RewardsDeposited(rewardsAfterFees); } + /** + * @dev Distribute a given amount of stake + * @param amount The amount of stake to distribute + */ + function distributeStake(uint256 amount) private validDistribution(amount) { + while (amount > 0) { + uint256 remainingCapacity = poolCapacity - prepoolBalance; + if (remainingCapacity > amount) { + prepoolBalance += amount; + amount = 0; + } else { + lastPoolId++; + uint32 poolId = lastPoolId; + Pool storage pool; + pool = pools[poolId]; + prepoolBalance = 0; + amount -= remainingCapacity; + pool.deposits = poolCapacity; + readyPoolIds.push(poolId); + + emit PoolDepositRequested(poolId); + } + } + } + /** * @notice Rebalance the rewards to stake ratio and redistribute swept rewards * @param activeBalance The active balance @@ -246,12 +318,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint256 sweptBalance, uint256 activatedDeposits, uint256 withdrawnExits - ) external { - require( - msg.sender == address(upkeep), - "Only upkeep can rebalance stake" - ); - + ) external onlyUpkeep() { uint256 activatedBalance = activatedDeposits * poolCapacity; uint256 withdrawnBalance = withdrawnExits * poolCapacity; int256 surplus = int256(activeBalance + sweptBalance) - (int256(getExpectedEffectiveBalance() + withdrawnBalance)); @@ -304,36 +371,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { finalizableWithdrawnPoolCount = 0; } - /** - * @dev Distribute stake to open pools - * @param amount The amount of stake to distribute - */ - function distributeStake(uint256 amount) private { - require( - amount >= distributionThreshold, - "Stake amount must be greater than or equal to 100 WEI" - ); - - while (amount > 0) { - uint256 remainingCapacity = poolCapacity - prepoolBalance; - if (remainingCapacity > amount) { - prepoolBalance += amount; - amount = 0; - } else { - lastPoolId++; - uint32 poolId = lastPoolId; - Pool storage pool; - pool = pools[poolId]; - prepoolBalance = 0; - amount -= remainingCapacity; - pool.deposits = poolCapacity; - readyPoolIds.push(poolId); - - emit PoolDepositRequested(poolId); - } - } - } - /** * @notice Request to withdraw user stake * @param amount The amount of stake to withdraw @@ -380,12 +417,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Complete a given count of pending withdrawals * @param count The number of withdrawals to complete */ - function completePendingWithdrawals(uint256 count) external { - require( - msg.sender == address(upkeep), - "Only upkeep can complete withdrawals" - ); - + function completePendingWithdrawals(uint256 count) external onlyUpkeep() { while (count > 0) { count--; @@ -447,11 +479,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { bytes calldata shares, ISSVNetworkCore.Cluster memory cluster, uint256 feeAmount - ) external { - require( - msg.sender == oracleAddress, - "Only manager oracle can initiate pools" - ); + ) external onlyOracle() { require(readyPoolIds.length > 0, "No ready pools"); require(reservedFees >= feeAmount, "Not enough reserved fees"); @@ -500,11 +528,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Complete a given count of the next pending pools * @param count The number of pools to complete */ - function completePoolDeposits(uint256 count) external { - require( - msg.sender == address(upkeep), - "Only upkeep can complete pool deposits" - ); + function completePoolDeposits(uint256 count) external onlyUpkeep() { require(pendingPoolIds.length >= count, "Not enough pending pools"); while (count > 0) { @@ -544,12 +568,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Request a given count of pool unexpected exit reports * @param count The number of pool unexpected exit reports */ - function requestPoolUnexpectedExitReports(uint256 count) external { - require( - msg.sender == address(upkeep), - "Only upkeep can request pool unexpected exit reports" - ); - + function requestPoolUnexpectedExitReports(uint256 count) external onlyUpkeep() { requestedPoolUnexpectedExitReports = count; emit PoolUnexpectedExitReportsRequested(count); @@ -559,12 +578,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Request a given count of pool slashed exit reports * @param count The number of pool slashed exit reports */ - function requestPoolSlashedExitReports(uint256 count) external { - require( - msg.sender == address(upkeep), - "Only upkeep can request pool slash reports" - ); - + function requestPoolSlashedExitReports(uint256 count) external onlyUpkeep() { requestedPoolSlashedExitReports = count; emit PoolSlashedExitReportsRequested(count); @@ -574,12 +588,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Request a given count of pool exit completions * @param count The number of pool exits to complete */ - function requestPoolWithdrawnExitReports(uint256 count) external { - require( - msg.sender == address(upkeep), - "Only upkeep can request pool exit completions" - ); - + function requestPoolWithdrawnExitReports(uint256 count) external onlyUpkeep() { requestedPoolWithdrawnExitReports = count; emit PoolWithdrawnExitReportsRequested(count); @@ -589,11 +598,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Report a pool unexpected exit * @param poolId The pool ID */ - function reportPoolUnexpectedExit(uint32 poolId) external { - require( - msg.sender == oracleAddress, - "Only manager oracle can report pool unexpected exits" - ); + function reportPoolUnexpectedExit(uint32 poolId) external onlyOracle() { require( requestedPoolUnexpectedExitReports > 0, "No requested pool unexpected exit reports" @@ -610,11 +615,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Report a pool slash * @param poolId The pool ID */ - function reportPoolSlash(uint32 poolId) external { - require( - msg.sender == oracleAddress, - "Only manager oracle can report pool slashedExits" - ); + function reportPoolSlash(uint32 poolId) external onlyOracle() { require( requestedPoolSlashedExitReports > 0, "No requested pool slash reports" @@ -643,11 +644,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint256 finalEffectiveBalance, uint32[] memory blamePercents, ISSVNetworkCore.Cluster memory cluster - ) external { - require( - msg.sender == oracleAddress, - "Only manager oracle can complete pool exits" - ); + ) external onlyOracle() { require( requestedPoolWithdrawnExitReports > 0, "No requested pool withdrawn exit reports" diff --git a/contracts/ethereum/src/CasimirUpkeep.sol b/contracts/ethereum/src/CasimirUpkeep.sol index aeb55d281..e260c5e95 100644 --- a/contracts/ethereum/src/CasimirUpkeep.sol +++ b/contracts/ethereum/src/CasimirUpkeep.sol @@ -76,6 +76,19 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /** Functions subscription ID */ uint64 private functionsSubscriptionId; + /*************/ + /* Modifiers */ + /*************/ + + /** + * @dev Verify a request ID + * @param requestId The request ID + */ + modifier validateRequestId(bytes32 requestId) { + require(requestId == reportRequestId, "Invalid request ID"); + _; + } + /***************/ /* Constructor */ /***************/ @@ -225,9 +238,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { bytes32 requestId, bytes memory response, bytes memory _error - ) internal override { - require(requestId == reportRequestId, "Invalid request ID"); - + ) internal override validateRequestId(requestId) { reportResponseError = _error; if (_error.length == 0) { reportStatus = Status.PROCESSING; From 8fe953ddb7f6f8fe5ff403ae31fa47bb9c72e6c7 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Wed, 31 May 2023 17:47:01 -0400 Subject: [PATCH 42/78] Move required fees to cluster details --- common/ssv/src/index.ts | 4 +- common/ssv/src/interfaces/ClusterDetails.ts | 7 + ...ClusterInput.ts => ClusterDetailsInput.ts} | 2 +- common/ssv/src/providers/clusters.ts | 12 +- common/types/src/interfaces/Validator.ts | 3 - contracts/ethereum/docs/index.md | 506 ++++++++++-------- contracts/ethereum/helpers/oracle.ts | 28 +- contracts/ethereum/src/CasimirUpkeep.sol | 2 - services/oracle/src/providers/dkg.ts | 19 +- services/oracle/src/providers/handlers.ts | 21 +- 10 files changed, 330 insertions(+), 274 deletions(-) create mode 100644 common/ssv/src/interfaces/ClusterDetails.ts rename common/ssv/src/interfaces/{ClusterInput.ts => ClusterDetailsInput.ts} (87%) diff --git a/common/ssv/src/index.ts b/common/ssv/src/index.ts index 8839c7234..1a7a6a1d0 100644 --- a/common/ssv/src/index.ts +++ b/common/ssv/src/index.ts @@ -1,3 +1,3 @@ -import { getCluster } from './providers/clusters' +import { getClusterDetails } from './providers/clusters' -export { getCluster } \ No newline at end of file +export { getClusterDetails } \ No newline at end of file diff --git a/common/ssv/src/interfaces/ClusterDetails.ts b/common/ssv/src/interfaces/ClusterDetails.ts new file mode 100644 index 000000000..d258f8867 --- /dev/null +++ b/common/ssv/src/interfaces/ClusterDetails.ts @@ -0,0 +1,7 @@ +import { Cluster } from '@casimir/types' +import { BigNumber } from 'ethers' + +export interface ClusterDetails { + cluster: Cluster, + requiredFees: BigNumber +} \ No newline at end of file diff --git a/common/ssv/src/interfaces/ClusterInput.ts b/common/ssv/src/interfaces/ClusterDetailsInput.ts similarity index 87% rename from common/ssv/src/interfaces/ClusterInput.ts rename to common/ssv/src/interfaces/ClusterDetailsInput.ts index 7f9cbb788..a0edf8c10 100644 --- a/common/ssv/src/interfaces/ClusterInput.ts +++ b/common/ssv/src/interfaces/ClusterDetailsInput.ts @@ -1,6 +1,6 @@ import { ethers } from 'ethers' -export interface ClusterInput { +export interface ClusterDetailsInput { /** SSV network address */ networkAddress: string /** Operator IDs */ diff --git a/common/ssv/src/providers/clusters.ts b/common/ssv/src/providers/clusters.ts index e4be8482d..fab7f63ab 100644 --- a/common/ssv/src/providers/clusters.ts +++ b/common/ssv/src/providers/clusters.ts @@ -1,7 +1,8 @@ import { ethers } from 'ethers' -import { Cluster } from '@casimir/types' import SSVNetworkJson from '@casimir/ethereum/build/artifacts/scripts/resources/ssv-network/contracts/SSVNetwork.sol/SSVNetwork.json' -import { ClusterInput } from '../interfaces/ClusterInput' +import { ClusterDetailsInput } from '../interfaces/ClusterDetailsInput' +import { ClusterDetails } from '../interfaces/ClusterDetails' +import { Cluster } from '@casimir/types' const DAY = 5400 const WEEK = DAY * 7 @@ -20,7 +21,7 @@ const eventList = [ * @param {ClusterInput} input - Operator IDs and withdrawal address * @returns {Promise} Cluster snapshot */ -export async function getCluster(input: ClusterInput): Promise { +export async function getClusterDetails(input: ClusterDetailsInput): Promise { const { provider, networkAddress, operatorIds, withdrawalAddress } = input const ssv = new ethers.Contract(networkAddress, SSVNetworkJson.abi, provider) @@ -78,11 +79,14 @@ export async function getCluster(input: ClusterInput): Promise { fromBlock = toBlock - step } - return cluster || { + cluster = cluster || { validatorCount: 0, networkFeeIndex: 0, index: 0, balance: 0, active: true } + const requiredFees = ethers.utils.parseEther('0.1') + + return { cluster, requiredFees } } \ No newline at end of file diff --git a/common/types/src/interfaces/Validator.ts b/common/types/src/interfaces/Validator.ts index b3977a684..6859c4df3 100644 --- a/common/types/src/interfaces/Validator.ts +++ b/common/types/src/interfaces/Validator.ts @@ -1,11 +1,8 @@ -import { Cluster } from './Cluster' - export interface Validator { depositDataRoot: string publicKey: string operatorIds: number[] shares: string - cluster: Cluster signature: string withdrawalCredentials: string } \ No newline at end of file diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index ab28a7786..ab92ed2e8 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -20,6 +20,44 @@ uint256 finalizableWithdrawnPoolCount Exited pool count +### onlyOracle + +```solidity +modifier onlyOracle() +``` + +_Validate the caller is the manager oracle_ + +### onlyUpkeep + +```solidity +modifier onlyUpkeep() +``` + +_Validate the caller is the upkeep contract_ + +### validateDeposit + +```solidity +modifier validateDeposit() +``` + +_Validate a deposit_ + +### validDistribution + +```solidity +modifier validDistribution(uint256 amount) +``` + +_Validate a distribution_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| amount | uint256 | The amount to validate | + ### constructor ```solidity @@ -716,123 +754,6 @@ Get the upkeep address | ---- | ---- | ----------- | | upkeepAddress | address | The upkeep address | -## CasimirRegistry - -### requiredCollateral - -```solidity -uint256 requiredCollateral -``` - -### minimumCollateralDeposit - -```solidity -uint256 minimumCollateralDeposit -``` - -### totalCollateral - -```solidity -uint256 totalCollateral -``` - -### constructor - -```solidity -constructor(address managerAddress, address ssvNetworkViewsAddress) public -``` - -### registerOperator - -```solidity -function registerOperator(uint64 operatorId) external payable -``` - -Register an operator with the set - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | - -### requestOperatorDeregistration - -```solidity -function requestOperatorDeregistration(uint64 operatorId) external -``` - -Request to deregister an operator from the set - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | - -### completeOperatorDeregistration - -```solidity -function completeOperatorDeregistration(uint64 operatorId) external -``` - -Deregister an operator from the set - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | - -### depositCollateral - -```solidity -function depositCollateral(uint64 operatorId) external payable -``` - -Deposit collateral for an operator - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | - -### setOperatorCollateral - -```solidity -function setOperatorCollateral(uint64 operatorId, int256 collateral) external -``` - -Set the collateral for an operator - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | -| collateral | int256 | The collateral | - -### getOperatorCollateral - -```solidity -function getOperatorCollateral(uint64 operatorId) external view returns (int256) -``` - -Get the collateral for an operator - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | int256 | The collateral | - ## CasimirUpkeep ### reportHeartbeat @@ -899,6 +820,20 @@ uint32 fulfillGasLimit Fulfillment gas limit +### validateRequestId + +```solidity +modifier validateRequestId(bytes32 requestId) +``` + +_Verify a request ID_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | The request ID | + ### constructor ```solidity @@ -1398,73 +1333,6 @@ function getPendingWithdrawals() external view returns (uint256) function getPendingWithdrawalCount() external view returns (uint256) ``` -## ICasimirRegistry - -### OperatorRegistered - -```solidity -event OperatorRegistered(uint64 operatorId) -``` - -### OperatorDeregistrationRequested - -```solidity -event OperatorDeregistrationRequested(uint64 operatorId) -``` - -### OperatorDeregistrationCompleted - -```solidity -event OperatorDeregistrationCompleted(uint64 operatorId) -``` - -### Operator - -```solidity -struct Operator { - uint64 id; - int256 collateral; - uint256 poolCount; - bool deregistering; -} -``` - -### registerOperator - -```solidity -function registerOperator(uint64 operatorId) external payable -``` - -### requestOperatorDeregistration - -```solidity -function requestOperatorDeregistration(uint64 operatorId) external -``` - -### completeOperatorDeregistration - -```solidity -function completeOperatorDeregistration(uint64 operatorId) external -``` - -### depositCollateral - -```solidity -function depositCollateral(uint64 operatorId) external payable -``` - -### setOperatorCollateral - -```solidity -function setOperatorCollateral(uint64 operatorId, int256 collateral) external -``` - -### getOperatorCollateral - -```solidity -function getOperatorCollateral(uint64 operatorId) external view returns (int256) -``` - ## ICasimirUpkeep ### Status @@ -1620,122 +1488,306 @@ _Send ETH to a user_ | user | address | The user address | | amount | uint256 | The amount of stake to send | -## MockFunctionsOracle +## IDepositContract -### constructor +### DepositEvent ```solidity -constructor() public +event DepositEvent(bytes pubkey, bytes withdrawal_credentials, bytes amount, bytes signature, bytes index) ``` -### getRegistry +A processed deposit event. + +### deposit ```solidity -function getRegistry() external view returns (address) +function deposit(bytes pubkey, bytes withdrawal_credentials, bytes signature, bytes32 deposit_data_root) external payable ``` -Returns the address of the registry contract +Submit a Phase 0 DepositData object. -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | address | address The address of the registry contract | +| pubkey | bytes | A BLS12-381 public key. | +| withdrawal_credentials | bytes | Commitment to a public key for withdrawals. | +| signature | bytes | A BLS12-381 signature. | +| deposit_data_root | bytes32 | The SHA-256 hash of the SSZ-encoded DepositData object. Used as a protection against malformed input. | -### sendRequest +### get_deposit_root ```solidity -function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) +function get_deposit_root() external view returns (bytes32) ``` -Sends a request (encoded as data) using the provided subscriptionId +Query the current deposit root hash. -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| _gasLimit | uint32 | Gas limit for the fulfillment callback | +| [0] | bytes32 | The deposit root hash. | + +### get_deposit_count + +```solidity +function get_deposit_count() external view returns (bytes) +``` + +Query the current deposit count. #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| requestId | bytes32 | A unique request identifier (unique per DON) | +| [0] | bytes | The deposit count encoded as a little endian 64-bit number. | -## IDepositContract +## IWETH9 -### DepositEvent +### deposit ```solidity -event DepositEvent(bytes pubkey, bytes withdrawal_credentials, bytes amount, bytes signature, bytes index) +function deposit() external payable ``` -A processed deposit event. +Deposit ether to get wrapped ether -### deposit +### withdraw ```solidity -function deposit(bytes pubkey, bytes withdrawal_credentials, bytes signature, bytes32 deposit_data_root) external payable +function withdraw(uint256) external ``` -Submit a Phase 0 DepositData object. +Withdraw wrapped ether to get ether + +## CasimirRegistry + +### requiredCollateral + +```solidity +uint256 requiredCollateral +``` + +### minimumCollateralDeposit + +```solidity +uint256 minimumCollateralDeposit +``` + +### totalCollateral + +```solidity +uint256 totalCollateral +``` + +### constructor + +```solidity +constructor(address managerAddress, address ssvNetworkViewsAddress) public +``` + +### registerOperator + +```solidity +function registerOperator(uint64 operatorId) external payable +``` + +Register an operator with the set #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| pubkey | bytes | A BLS12-381 public key. | -| withdrawal_credentials | bytes | Commitment to a public key for withdrawals. | -| signature | bytes | A BLS12-381 signature. | -| deposit_data_root | bytes32 | The SHA-256 hash of the SSZ-encoded DepositData object. Used as a protection against malformed input. | +| operatorId | uint64 | The operator ID | -### get_deposit_root +### requestOperatorDeregistration ```solidity -function get_deposit_root() external view returns (bytes32) +function requestOperatorDeregistration(uint64 operatorId) external ``` -Query the current deposit root hash. +Request to deregister an operator from the set -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes32 | The deposit root hash. | +| operatorId | uint64 | The operator ID | -### get_deposit_count +### completeOperatorDeregistration ```solidity -function get_deposit_count() external view returns (bytes) +function completeOperatorDeregistration(uint64 operatorId) external ``` -Query the current deposit count. +Deregister an operator from the set + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +### depositCollateral + +```solidity +function depositCollateral(uint64 operatorId) external payable +``` + +Deposit collateral for an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +### setOperatorCollateral + +```solidity +function setOperatorCollateral(uint64 operatorId, int256 collateral) external +``` + +Set the collateral for an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | +| collateral | int256 | The collateral | + +### getOperatorCollateral + +```solidity +function getOperatorCollateral(uint64 operatorId) external view returns (int256) +``` + +Get the collateral for an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bytes | The deposit count encoded as a little endian 64-bit number. | +| [0] | int256 | The collateral | -## IWETH9 +## ICasimirRegistry -### deposit +### OperatorRegistered ```solidity -function deposit() external payable +event OperatorRegistered(uint64 operatorId) ``` -Deposit ether to get wrapped ether +### OperatorDeregistrationRequested -### withdraw +```solidity +event OperatorDeregistrationRequested(uint64 operatorId) +``` + +### OperatorDeregistrationCompleted ```solidity -function withdraw(uint256) external +event OperatorDeregistrationCompleted(uint64 operatorId) ``` -Withdraw wrapped ether to get ether +### Operator + +```solidity +struct Operator { + uint64 id; + int256 collateral; + uint256 poolCount; + bool deregistering; +} +``` + +### registerOperator + +```solidity +function registerOperator(uint64 operatorId) external payable +``` + +### requestOperatorDeregistration + +```solidity +function requestOperatorDeregistration(uint64 operatorId) external +``` + +### completeOperatorDeregistration + +```solidity +function completeOperatorDeregistration(uint64 operatorId) external +``` + +### depositCollateral + +```solidity +function depositCollateral(uint64 operatorId) external payable +``` + +### setOperatorCollateral + +```solidity +function setOperatorCollateral(uint64 operatorId, int256 collateral) external +``` + +### getOperatorCollateral + +```solidity +function getOperatorCollateral(uint64 operatorId) external view returns (int256) +``` + +## MockFunctionsOracle + +### constructor + +```solidity +constructor() public +``` + +### getRegistry + +```solidity +function getRegistry() external view returns (address) +``` + +Returns the address of the registry contract + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | address | address The address of the registry contract | + +### sendRequest + +```solidity +function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) +``` + +Sends a request (encoded as data) using the provided subscriptionId + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | +| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| _gasLimit | uint32 | Gas limit for the fulfillment callback | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | A unique request identifier (unique per DON) | ## CasimirRecipient diff --git a/contracts/ethereum/helpers/oracle.ts b/contracts/ethereum/helpers/oracle.ts index 8cb474f2e..1a875b79c 100644 --- a/contracts/ethereum/helpers/oracle.ts +++ b/contracts/ethereum/helpers/oracle.ts @@ -3,7 +3,8 @@ import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' import { CasimirManager } from '../build/artifacts/types' import { validatorStore } from '@casimir/data' import { Validator } from '@casimir/types' -import { getCluster } from '@casimir/ssv' +import { getClusterDetails } from '@casimir/ssv' +import { ClusterDetails } from '@casimir/ssv/src/interfaces/ClusterDetails' const mockValidators: Validator[] = Object.values(validatorStore) @@ -19,19 +20,27 @@ export async function initiatePoolDepositHandler({ manager, signer, args }: { ma withdrawalCredentials, operatorIds, shares, - cluster: _cluster } = mockValidators[poolId - 1] - let cluster + let clusterDetails: ClusterDetails = { + cluster: { + validatorCount: 0, + networkFeeIndex: 0, + index: 0, + balance: 0, + active: true + }, + requiredFees: ethers.utils.parseEther(mockFee.toString()) + } - if (poolId === 1) { - cluster = _cluster - } else { + if (poolId !== 1) { const networkAddress = await manager.getSSVNetworkAddress() const withdrawalAddress = manager.address - cluster = await getCluster({ provider: ethers.provider, networkAddress, operatorIds, withdrawalAddress }) + clusterDetails = await getClusterDetails({ provider: ethers.provider, networkAddress, operatorIds, withdrawalAddress }) } + const { cluster, requiredFees } = clusterDetails + const initiatePoolDeposit = await manager.connect(signer).initiatePoolDeposit( depositDataRoot, publicKey, @@ -40,7 +49,7 @@ export async function initiatePoolDepositHandler({ manager, signer, args }: { ma operatorIds, shares, cluster, - ethers.utils.parseEther(mockFee.toString()) // Mock fee amount estimate ~ 10 SSV + requiredFees // Mock fee amount estimate ~ 10 SSV ) await initiatePoolDeposit.wait() } @@ -56,7 +65,8 @@ export async function completePoolExitHandler({ manager, signer }: { manager: Ca const networkAddress = await manager.getSSVNetworkAddress() const withdrawalAddress = manager.address - const cluster = await getCluster({ provider: ethers.provider, networkAddress, operatorIds, withdrawalAddress }) + const clusterDetails = await getClusterDetails({ provider: ethers.provider, networkAddress, operatorIds, withdrawalAddress }) + const { cluster } = clusterDetails const completePoolExit = await manager.connect(signer).completePoolExit( poolIndex, diff --git a/contracts/ethereum/src/CasimirUpkeep.sol b/contracts/ethereum/src/CasimirUpkeep.sol index e260c5e95..bb136c83a 100644 --- a/contracts/ethereum/src/CasimirUpkeep.sol +++ b/contracts/ethereum/src/CasimirUpkeep.sol @@ -243,7 +243,6 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { if (_error.length == 0) { reportStatus = Status.PROCESSING; reportRequestId = bytes32(0); - ( uint128 activeBalance, uint32 activatedDeposits, @@ -251,7 +250,6 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { uint32 slashedExits, uint32 withdrawnExits ) = abi.decode(response, (uint128, uint32, uint32, uint32, uint32)); - reportActiveBalance = uint256(activeBalance) * 1 gwei; reportActivatedDeposits = activatedDeposits; reportUnexpectedExits = unexpectedExits; diff --git a/services/oracle/src/providers/dkg.ts b/services/oracle/src/providers/dkg.ts index d6eade47c..bac0253f2 100644 --- a/services/oracle/src/providers/dkg.ts +++ b/services/oracle/src/providers/dkg.ts @@ -9,7 +9,6 @@ import { Validator } from '@casimir/types' import { ReshareValidatorInput } from '../interfaces/ReshareValidatorInput' import { operatorStore } from '@casimir/data' import { DepositDataInput } from '../interfaces/DepositDataInput' -import { getCluster } from '@casimir/ssv' export class DKG { /** DKG CLI path */ @@ -28,7 +27,7 @@ export class DKG { * @returns {Promise} Validator with operator key shares and deposit data */ async createValidator(input: CreateValidatorInput): Promise { - const { provider, manager, operatorIds, withdrawalAddress } = input + const { operatorIds, withdrawalAddress } = input const operators = this.getOperatorUrls(operatorIds) @@ -45,19 +44,12 @@ export class DKG { /** Get validator deposit data */ const { depositDataRoot, publicKey, signature, withdrawalCredentials } = await this.getDepositData({ ceremonyId, withdrawalAddress }) - /** Get SSV network address */ - const networkAddress = await manager.getSSVNetworkAddress() - - /** Get SSV cluster snapshot */ - const cluster = await getCluster({ networkAddress, operatorIds, provider, withdrawalAddress }) - /** Create validator */ const validator: Validator = { depositDataRoot, publicKey, operatorIds, shares, - cluster, signature, withdrawalCredentials } @@ -71,7 +63,7 @@ export class DKG { * @returns {Promise} Validator with operator key shares and deposit data */ async reshareValidator(input: ReshareValidatorInput): Promise { - const { provider, manager, operatorIds, publicKey, oldOperatorIds, withdrawalAddress } = input + const { operatorIds, publicKey, oldOperatorIds, withdrawalAddress } = input const operators = this.getOperatorUrls(operatorIds) const oldOperators = this.getOperatorUrls(oldOperatorIds) @@ -85,19 +77,12 @@ export class DKG { /** Get validator deposit data */ const { depositDataRoot, signature, withdrawalCredentials } = await this.getDepositData({ ceremonyId, withdrawalAddress }) - /** Get SSV network address */ - const networkAddress = await manager.getSSVNetworkAddress() - - /** Get SSV cluster snapshot */ - const cluster = await getCluster({ networkAddress, operatorIds, provider, withdrawalAddress }) - /** Create validator */ const validator: Validator = { depositDataRoot, publicKey, operatorIds, shares, - cluster, signature, withdrawalCredentials } diff --git a/services/oracle/src/providers/handlers.ts b/services/oracle/src/providers/handlers.ts index 8165c4a85..77e7e592d 100644 --- a/services/oracle/src/providers/handlers.ts +++ b/services/oracle/src/providers/handlers.ts @@ -1,8 +1,8 @@ -import fs from 'fs' import { ethers } from 'ethers' import { DKG } from './dkg' import { HandlerInput } from '../interfaces/HandlerInput' import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' +import { getClusterDetails } from '@casimir/ssv' export async function initiatePoolDepositHandler(input: HandlerInput) { const { provider, signer, manager, cliPath, messengerUrl } = input @@ -16,21 +16,24 @@ export async function initiatePoolDepositHandler(input: HandlerInput) { withdrawalAddress: manager.address }) - // Save validator for mocks - const validators = JSON.parse(fs.readFileSync('./scripts/.out/validators.json', 'utf8')) - validators[Date.now()] = validator - fs.writeFileSync('./scripts/.out/validators.json', JSON.stringify(validators, null, 4)) - const { depositDataRoot, publicKey, signature, withdrawalCredentials, operatorIds, - shares, - cluster + shares } = validator + const clusterDetails = await getClusterDetails({ + provider, + networkAddress: await manager.getSSVNetworkAddress(), + operatorIds, + withdrawalAddress: manager.address + }) + + const { cluster, requiredFees } = clusterDetails + const initiatePoolDeposit = await (manager.connect(signer) as CasimirManager & ethers.Contract).initiatePoolDeposit( depositDataRoot, publicKey, @@ -39,7 +42,7 @@ export async function initiatePoolDepositHandler(input: HandlerInput) { operatorIds, shares, cluster, - ethers.utils.parseEther('0.1') // Mock fee amount estimate ~ 10 SSV + requiredFees // Mock fee amount estimate ~ 10 SSV ) await initiatePoolDeposit.wait() } From b509ff0ac53deaaeadeb31604cf9025a8aae7c84 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Wed, 31 May 2023 23:18:47 -0400 Subject: [PATCH 43/78] Build SSV network views contract ABI --- .../ssv/src/interfaces/ClusterDetailsInput.ts | 7 ++- common/ssv/src/providers/clusters.ts | 23 +++++++--- contracts/ethereum/hardhat.config.ts | 2 + contracts/ethereum/helpers/oracle.ts | 40 ++++++++--------- contracts/ethereum/scripts/dev.ts | 5 ++- contracts/ethereum/src/CasimirManager.sol | 12 ----- contracts/ethereum/src/vendor/SSVNetwork.sol | 4 ++ .../ethereum/src/vendor/SSVNetworkViews.sol | 4 ++ services/oracle/scripts/dev.ts | 2 + services/oracle/src/index.ts | 23 +++++++--- .../oracle/src/interfaces/HandlerInput.ts | 8 +++- services/oracle/src/providers/config.ts | 8 +++- services/oracle/src/providers/dkg.ts | 7 +-- services/oracle/src/providers/handlers.ts | 45 ++++++++++++++++--- 14 files changed, 128 insertions(+), 62 deletions(-) create mode 100644 contracts/ethereum/src/vendor/SSVNetwork.sol create mode 100644 contracts/ethereum/src/vendor/SSVNetworkViews.sol diff --git a/common/ssv/src/interfaces/ClusterDetailsInput.ts b/common/ssv/src/interfaces/ClusterDetailsInput.ts index a0edf8c10..6cc008aac 100644 --- a/common/ssv/src/interfaces/ClusterDetailsInput.ts +++ b/common/ssv/src/interfaces/ClusterDetailsInput.ts @@ -1,12 +1,15 @@ +import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' import { ethers } from 'ethers' export interface ClusterDetailsInput { + /** JSON RPC node provider */ + provider: ethers.providers.JsonRpcProvider /** SSV network address */ networkAddress: string + /** SSV network views address */ + networkViewsAddress: string /** Operator IDs */ operatorIds: number[] - /** JSON RPC node provider */ - provider: ethers.providers.JsonRpcProvider /** Withdrawal address */ withdrawalAddress: string } \ No newline at end of file diff --git a/common/ssv/src/providers/clusters.ts b/common/ssv/src/providers/clusters.ts index fab7f63ab..8c7896a4e 100644 --- a/common/ssv/src/providers/clusters.ts +++ b/common/ssv/src/providers/clusters.ts @@ -1,5 +1,7 @@ import { ethers } from 'ethers' +import { SSVNetwork, SSVNetworkViews } from '@casimir/ethereum/build/artifacts/types' import SSVNetworkJson from '@casimir/ethereum/build/artifacts/scripts/resources/ssv-network/contracts/SSVNetwork.sol/SSVNetwork.json' +import SSVNetworkJsonViews from '@casimir/ethereum/build/artifacts/scripts/resources/ssv-network/contracts/SSVNetworkViews.sol/SSVNetworkViews.json' import { ClusterDetailsInput } from '../interfaces/ClusterDetailsInput' import { ClusterDetails } from '../interfaces/ClusterDetails' import { Cluster } from '@casimir/types' @@ -22,10 +24,12 @@ const eventList = [ * @returns {Promise} Cluster snapshot */ export async function getClusterDetails(input: ClusterDetailsInput): Promise { - const { provider, networkAddress, operatorIds, withdrawalAddress } = input + const { provider, networkAddress, networkViewsAddress, operatorIds, withdrawalAddress } = input - const ssv = new ethers.Contract(networkAddress, SSVNetworkJson.abi, provider) - const eventFilters = eventList.map(event => ssv.filters[event](withdrawalAddress)) + const ssvNetwork = new ethers.Contract(networkAddress, SSVNetworkJson.abi, provider) as SSVNetwork & ethers.Contract + const ssvNetworkViews = new ethers.Contract(networkViewsAddress, SSVNetworkJsonViews.abi, provider) as SSVNetworkViews & ethers.Contract + + const eventFilters = eventList.map(event => ssvNetwork.filters[event](withdrawalAddress)) let step = MONTH const latestBlockNumber = await provider.getBlockNumber() @@ -38,7 +42,7 @@ export async function getClusterDetails(input: ClusterDetailsInput): Promise { - return await ssv.queryFilter(eventFilter, fromBlock, toBlock) + return await ssvNetwork.queryFilter(eventFilter, fromBlock, toBlock) }) )).flat() @@ -68,8 +72,8 @@ export async function getClusterDetails(input: ClusterDetailsInput): Promise }) { const { poolId } = args @@ -22,22 +23,14 @@ export async function initiatePoolDepositHandler({ manager, signer, args }: { ma shares, } = mockValidators[poolId - 1] - let clusterDetails: ClusterDetails = { - cluster: { - validatorCount: 0, - networkFeeIndex: 0, - index: 0, - balance: 0, - active: true - }, - requiredFees: ethers.utils.parseEther(mockFee.toString()) - } - - if (poolId !== 1) { - const networkAddress = await manager.getSSVNetworkAddress() - const withdrawalAddress = manager.address - clusterDetails = await getClusterDetails({ provider: ethers.provider, networkAddress, operatorIds, withdrawalAddress }) - } + const withdrawalAddress = manager.address + const clusterDetails = await getClusterDetails({ + provider: ethers.provider, + networkAddress, + networkViewsAddress, + operatorIds, + withdrawalAddress + }) const { cluster, requiredFees } = clusterDetails @@ -63,9 +56,14 @@ export async function completePoolExitHandler({ manager, signer }: { manager: Ca const finalEffectiveBalance = ethers.utils.parseEther('32') const blamePercents = [0, 0, 0, 0] - const networkAddress = await manager.getSSVNetworkAddress() const withdrawalAddress = manager.address - const clusterDetails = await getClusterDetails({ provider: ethers.provider, networkAddress, operatorIds, withdrawalAddress }) + const clusterDetails = await getClusterDetails({ + provider: ethers.provider, + networkAddress, + networkViewsAddress, + operatorIds, + withdrawalAddress + }) const { cluster } = clusterDetails const completePoolExit = await manager.connect(signer).completePoolExit( diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 30bc59f2b..5f8aa556e 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -48,7 +48,7 @@ void async function () { /** Link mock external contracts to Casimir */ if (name === 'CasimirManager') { - (config[name as keyof typeof config] as ContractConfig).args.functionsOracleAddress = config.MockFunctionsOracle?.address + (config[name as keyof typeof config] as ContractConfig).args.functionsAddress = config.MockFunctionsOracle?.address } const { args, options, proxy } = config[name as keyof typeof config] as ContractConfig @@ -79,7 +79,8 @@ void async function () { const rewardPerValidator = 0.105 let lastRewardBlock = await ethers.provider.getBlockNumber() for await (const block of on(ethers.provider as unknown as EventEmitter, 'block')) { - if (block - blocksPerReward === lastRewardBlock) { + if (block - blocksPerReward >= lastRewardBlock) { + console.log('New reward block') lastRewardBlock = block const depositedPoolCount = await manager.getDepositedPoolCount() if (depositedPoolCount) { diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index 7f02ba33b..f80e11eb8 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -1069,18 +1069,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { return ssvFeePercent; } - /** - * @notice Get the SSV network address - * @return ssvNetworkAddress The SSV network address - */ - function getSSVNetworkAddress() - external - view - returns (address ssvNetworkAddress) - { - ssvNetworkAddress = address(ssvNetwork); - } - /** * @notice Get the upkeep address * @return upkeepAddress The upkeep address diff --git a/contracts/ethereum/src/vendor/SSVNetwork.sol b/contracts/ethereum/src/vendor/SSVNetwork.sol new file mode 100644 index 000000000..797b3824a --- /dev/null +++ b/contracts/ethereum/src/vendor/SSVNetwork.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.18; + +import "../../scripts/resources/ssv-network/contracts/SSVNetwork.sol"; \ No newline at end of file diff --git a/contracts/ethereum/src/vendor/SSVNetworkViews.sol b/contracts/ethereum/src/vendor/SSVNetworkViews.sol new file mode 100644 index 000000000..9e36a3f52 --- /dev/null +++ b/contracts/ethereum/src/vendor/SSVNetworkViews.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.18; + +import "../../scripts/resources/ssv-network/contracts/SSVNetworkViews.sol"; \ No newline at end of file diff --git a/services/oracle/scripts/dev.ts b/services/oracle/scripts/dev.ts index 10a6c9226..59139510e 100644 --- a/services/oracle/scripts/dev.ts +++ b/services/oracle/scripts/dev.ts @@ -5,6 +5,8 @@ const resourcePath = 'scripts/resources/rockx-dkg-cli' void async function () { process.env.BIP39_PATH_INDEX = '6' process.env.MANAGER_ADDRESS = process.env.PUBLIC_MANAGER_ADDRESS + process.env.NETWORK_ADDRESS = '0xAfdb141Dd99b5a101065f40e3D7636262dce65b3' + process.env.NETWORK_VIEWS_ADDRESS = '0x8dB45282d7C4559fd093C26f677B3837a5598914' process.env.CLI_PATH = `./${resourcePath}/build/bin/rockx-dkg-cli` process.env.MESSENGER_SRV_ADDR = 'http://0.0.0.0:3000' process.env.USE_HARDCODED_OPERATORS = 'true' diff --git a/services/oracle/src/index.ts b/services/oracle/src/index.ts index eac17fc64..2798af79b 100644 --- a/services/oracle/src/index.ts +++ b/services/oracle/src/index.ts @@ -5,21 +5,30 @@ import { initiatePoolDepositHandler, initiatePoolExitHandler, initiatePoolReshar const handlers = { PoolDepositRequested: initiatePoolDepositHandler, PoolReshareRequested: initiatePoolReshareHandler, - PoolExitRequested: initiatePoolExitHandler + PoolExitRequested: initiatePoolExitHandler, + // PoolUnexpectedExitReportsRequested: reportUnexpectedExitsHandler, + // PoolSlashedExitReportsRequested: reportSlashedExitsHandler, + // PoolWithdrawnExitReportsRequested: reportWithdrawnExitsHandler } -const { provider, signer, manager, cliPath, messengerUrl } = config() +const { provider, signer, manager, networkAddress, networkViewsAddress, cliPath, messengerUrl } = config() ;(async function () { const eventEmitter = getEventEmitter({ manager, events: Object.keys(handlers) }) for await (const event of eventEmitter) { - const [ id, details ] = event - - console.log(`Event ${details.event} received for pool ${id}`) - + const [ value, details ] = event const handler = handlers[details.event as keyof typeof handlers] if (!handler) throw new Error(`No handler found for event ${details.event}`) - await handler({ provider, signer, manager, cliPath, messengerUrl, args: { poolId: id } }) + await handler({ + provider, + signer, + manager, + networkAddress, + networkViewsAddress, + cliPath, + messengerUrl, + value + }) } })() diff --git a/services/oracle/src/interfaces/HandlerInput.ts b/services/oracle/src/interfaces/HandlerInput.ts index 39b42a440..ee65b6bee 100644 --- a/services/oracle/src/interfaces/HandlerInput.ts +++ b/services/oracle/src/interfaces/HandlerInput.ts @@ -8,10 +8,14 @@ export interface HandlerInput { signer: ethers.Signer /** Manager contract */ manager: CasimirManager & ethers.Contract + /** Network address */ + networkAddress: string + /** Network views address */ + networkViewsAddress: string /** DKG cli path */ cliPath: string /** DKG messenger service URL */ messengerUrl: string - /** Handler args */ - args: Record + /** Event value */ + value: number } \ No newline at end of file diff --git a/services/oracle/src/providers/config.ts b/services/oracle/src/providers/config.ts index 599fc08e7..37b610946 100644 --- a/services/oracle/src/providers/config.ts +++ b/services/oracle/src/providers/config.ts @@ -19,6 +19,12 @@ export function config() { const managerAddress = process.env.MANAGER_ADDRESS if (!managerAddress) throw new Error('No manager address provided') const manager = new ethers.Contract(managerAddress, CasimirManagerJson.abi, provider) as CasimirManager & ethers.Contract + + /** Get network contract addresses */ + const networkAddress = process.env.NETWORK_ADDRESS + if (!networkAddress) throw new Error('No network address provided') + const networkViewsAddress = process.env.NETWORK_VIEWS_ADDRESS + if (!networkViewsAddress) throw new Error('No network views address provided') /** Get DKG CLI path */ const cliPath = process.env.CLI_PATH @@ -28,5 +34,5 @@ export function config() { const messengerUrl = process.env.MESSENGER_SRV_ADDR if (!messengerUrl) throw new Error('No messenger url provided') - return { provider, signer, manager, cliPath, messengerUrl } + return { provider, signer, manager, networkAddress, networkViewsAddress, cliPath, messengerUrl } } diff --git a/services/oracle/src/providers/dkg.ts b/services/oracle/src/providers/dkg.ts index bac0253f2..7e91c1162 100644 --- a/services/oracle/src/providers/dkg.ts +++ b/services/oracle/src/providers/dkg.ts @@ -36,7 +36,7 @@ export class DKG { console.log(`Started ceremony with ID ${ceremonyId}`) /** Wait for ceremony to complete */ - await new Promise(resolve => setTimeout(resolve, 2000)) + await new Promise(resolve => setTimeout(resolve, 3000)) /** Get operator key shares */ const shares = await this.getShares(ceremonyId) @@ -71,6 +71,9 @@ export class DKG { const ceremonyId = await this.startReshare({ operators, publicKey, oldOperators }) console.log(`Started ceremony with ID ${ceremonyId}`) + /** Wait for ceremony to complete */ + await new Promise(resolve => setTimeout(resolve, 3000)) + /** Get operator key shares */ const shares = await this.getShares(ceremonyId) @@ -102,8 +105,6 @@ export class DKG { const withdrawalCredentialsFlag = `--withdrawal-credentials ${getWithdrawalCredentials(withdrawalAddress)}` const forkVersionFlag = '--fork-version prater' const command = `${this.cliPath} keygen ${operatorFlags} ${thresholdFlag} ${withdrawalCredentialsFlag} ${forkVersionFlag}` - - console.log('Running command', command) const ceremony = await runRetry(`${command}`) as string return ceremony.trim().split(' ').pop() as string } diff --git a/services/oracle/src/providers/handlers.ts b/services/oracle/src/providers/handlers.ts index 77e7e592d..c129449b6 100644 --- a/services/oracle/src/providers/handlers.ts +++ b/services/oracle/src/providers/handlers.ts @@ -5,7 +5,18 @@ import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' import { getClusterDetails } from '@casimir/ssv' export async function initiatePoolDepositHandler(input: HandlerInput) { - const { provider, signer, manager, cliPath, messengerUrl } = input + const { + provider, + signer, + manager, + networkAddress, + networkViewsAddress, + cliPath, + messengerUrl, + value + } = input + + const poolId = value const newOperatorIds = [1, 2, 3, 4] // Todo get new group here const dkg = new DKG({ cliPath, messengerUrl }) @@ -27,7 +38,8 @@ export async function initiatePoolDepositHandler(input: HandlerInput) { const clusterDetails = await getClusterDetails({ provider, - networkAddress: await manager.getSSVNetworkAddress(), + networkAddress, + networkViewsAddress, operatorIds, withdrawalAddress: manager.address }) @@ -48,8 +60,19 @@ export async function initiatePoolDepositHandler(input: HandlerInput) { } export async function initiatePoolReshareHandler(input: HandlerInput) { - const { manager, signer, cliPath, messengerUrl, args } = input - const { poolId } = args + const { + provider, + signer, + manager, + networkAddress, + networkViewsAddress, + cliPath, + messengerUrl, + value + } = input + + const poolId = value + // Todo reshare event will include the operator to boot // Get pool to reshare @@ -76,8 +99,18 @@ export async function initiatePoolReshareHandler(input: HandlerInput) { } export async function initiatePoolExitHandler(input: HandlerInput) { - const { manager, signer, cliPath, messengerUrl, args } = input - const { poolId } = args + const { + provider, + signer, + manager, + networkAddress, + networkViewsAddress, + cliPath, + messengerUrl, + value + } = input + + const poolId = value // Get pool to exit const pool = await manager.getPool(poolId) From 0ca0dd97e3ea0be2d83d293cc7cd3dfb1b1dc8e4 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Thu, 1 Jun 2023 11:41:12 -0400 Subject: [PATCH 44/78] Get uniswap pool rate for fee estimate --- .../ssv/src/interfaces/ClusterDetailsInput.ts | 5 --- .../ssv/src/interfaces/ExchangeRateInput.ts | 12 +++++++ common/ssv/src/providers/clusters.ts | 24 +++++++++---- common/ssv/src/providers/uniswap.ts | 17 ++++++++++ contracts/ethereum/docs/index.md | 34 ++++++------------- contracts/ethereum/hardhat.config.ts | 4 +-- contracts/ethereum/helpers/oracle.ts | 8 ----- contracts/ethereum/src/CasimirManager.sol | 8 ++--- .../src/interfaces/ICasimirManager.sol | 10 +++--- services/oracle/README.md | 2 +- services/oracle/scripts/dev.ts | 2 -- services/oracle/src/index.ts | 14 ++++---- .../oracle/src/interfaces/HandlerInput.ts | 4 --- services/oracle/src/providers/config.ts | 8 +---- services/oracle/src/providers/handlers.ts | 8 ----- 15 files changed, 74 insertions(+), 86 deletions(-) create mode 100644 common/ssv/src/interfaces/ExchangeRateInput.ts create mode 100644 common/ssv/src/providers/uniswap.ts diff --git a/common/ssv/src/interfaces/ClusterDetailsInput.ts b/common/ssv/src/interfaces/ClusterDetailsInput.ts index 6cc008aac..536f22da8 100644 --- a/common/ssv/src/interfaces/ClusterDetailsInput.ts +++ b/common/ssv/src/interfaces/ClusterDetailsInput.ts @@ -1,13 +1,8 @@ -import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' import { ethers } from 'ethers' export interface ClusterDetailsInput { /** JSON RPC node provider */ provider: ethers.providers.JsonRpcProvider - /** SSV network address */ - networkAddress: string - /** SSV network views address */ - networkViewsAddress: string /** Operator IDs */ operatorIds: number[] /** Withdrawal address */ diff --git a/common/ssv/src/interfaces/ExchangeRateInput.ts b/common/ssv/src/interfaces/ExchangeRateInput.ts new file mode 100644 index 000000000..39d883ea1 --- /dev/null +++ b/common/ssv/src/interfaces/ExchangeRateInput.ts @@ -0,0 +1,12 @@ +import { ethers } from 'ethers' + +export interface ExchangeRateInput { + /** JSON RPC node provider */ + provider: ethers.providers.JsonRpcProvider + /** The input token */ + tokenIn: string + /** The output token */ + tokenOut: string + /** The fee tier of the pool */ + uniswapFeeTier: number +} \ No newline at end of file diff --git a/common/ssv/src/providers/clusters.ts b/common/ssv/src/providers/clusters.ts index 8c7896a4e..b6facc881 100644 --- a/common/ssv/src/providers/clusters.ts +++ b/common/ssv/src/providers/clusters.ts @@ -5,6 +5,12 @@ import SSVNetworkJsonViews from '@casimir/ethereum/build/artifacts/scripts/resou import { ClusterDetailsInput } from '../interfaces/ClusterDetailsInput' import { ClusterDetails } from '../interfaces/ClusterDetails' import { Cluster } from '@casimir/types' +import { getExchangeRate } from './uniswap' + +const networkAddress = '0xAfdb141Dd99b5a101065f40e3D7636262dce65b3' +const networkViewsAddress = '0x8dB45282d7C4559fd093C26f677B3837a5598914' +const networkTokenAddress = '0x3a9f01091C446bdE031E39ea8354647AFef091E7' +const wethTokenAddress = '0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6' const DAY = 5400 const WEEK = DAY * 7 @@ -24,7 +30,7 @@ const eventList = [ * @returns {Promise} Cluster snapshot */ export async function getClusterDetails(input: ClusterDetailsInput): Promise { - const { provider, networkAddress, networkViewsAddress, operatorIds, withdrawalAddress } = input + const { provider, operatorIds, withdrawalAddress } = input const ssvNetwork = new ethers.Contract(networkAddress, SSVNetworkJson.abi, provider) as SSVNetwork & ethers.Contract const ssvNetworkViews = new ethers.Contract(networkViewsAddress, SSVNetworkJsonViews.abi, provider) as SSVNetworkViews & ethers.Contract @@ -91,13 +97,17 @@ export async function getClusterDetails(input: ClusterDetailsInput): Promise }) { const { poolId } = args @@ -26,8 +22,6 @@ export async function initiatePoolDepositHandler({ manager, signer, args }: { ma const withdrawalAddress = manager.address const clusterDetails = await getClusterDetails({ provider: ethers.provider, - networkAddress, - networkViewsAddress, operatorIds, withdrawalAddress }) @@ -59,8 +53,6 @@ export async function completePoolExitHandler({ manager, signer }: { manager: Ca const withdrawalAddress = manager.address const clusterDetails = await getClusterDetails({ provider: ethers.provider, - networkAddress, - networkViewsAddress, operatorIds, withdrawalAddress }) diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index f80e11eb8..b91a1b01d 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -301,7 +301,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { pool.deposits = poolCapacity; readyPoolIds.push(poolId); - emit PoolDepositRequested(poolId); + emit DepositRequested(poolId); } } } @@ -571,7 +571,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function requestPoolUnexpectedExitReports(uint256 count) external onlyUpkeep() { requestedPoolUnexpectedExitReports = count; - emit PoolUnexpectedExitReportsRequested(count); + emit UnexpectedExitReportsRequested(count); } /** @@ -581,7 +581,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function requestPoolSlashedExitReports(uint256 count) external onlyUpkeep() { requestedPoolSlashedExitReports = count; - emit PoolSlashedExitReportsRequested(count); + emit SlashedExitReportsRequested(count); } /** @@ -591,7 +591,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function requestPoolWithdrawnExitReports(uint256 count) external onlyUpkeep() { requestedPoolWithdrawnExitReports = count; - emit PoolWithdrawnExitReportsRequested(count); + emit WithdrawnExitReportsRequested(count); } /** diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index e1811cb03..2881cfbc4 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -41,15 +41,15 @@ interface ICasimirManager { /* Events */ /**********/ - event PoolDepositRequested(uint32 poolId); + event DepositRequested(uint32 poolId); event PoolDepositInitiated(uint32 poolId); event PoolDeposited(uint32 poolId); - event PoolReshareRequested(uint32 poolId); + event ReshareRequested(uint32 poolId); event PoolReshared(uint32 poolId); event PoolExitRequested(uint32 poolId); - event PoolUnexpectedExitReportsRequested(uint256 count); - event PoolSlashedExitReportsRequested(uint256 count); - event PoolWithdrawnExitReportsRequested(uint256 count); + event UnexpectedExitReportsRequested(uint256 count); + event SlashedExitReportsRequested(uint256 count); + event WithdrawnExitReportsRequested(uint256 count); event PoolExited(uint32 poolId); event StakeDeposited(address sender, uint256 amount); event StakeRebalanced(uint256 amount); diff --git a/services/oracle/README.md b/services/oracle/README.md index 518fc024b..d82bd8fc2 100644 --- a/services/oracle/README.md +++ b/services/oracle/README.md @@ -4,7 +4,7 @@ Casimir validators oracle service ## About -The validator oracle service initiates and reports on validator operations: distributed key generation (DKG) ceremonies, DKG reshares, and DKG or presigned exit requests. It contains a [NodeJS](https://nodejs.org) application that listens for `PoolDepositRequested`, `PoolReshareRequested`, and `PoolExitRequested` events, which then internally uses the [RockX DKG CLI and messenger server](https://github.com/rockx/rockx-dkg-cli) to initiate and retrieve operator group DKG results. The `PoolDepositRequested` event starts a new DKG keygen and retrieves the results to submit a new validator via `depositPool`. The `PoolReshareRequested` event starts a new DKG reshare and retrieves the results to update an existing validator via `resharePool`. The `PoolExitRequested` event starts a new DKG exit and retrieves the results to submit a signed exit message directly to the Beacon chain. +The validator oracle service initiates and reports on validator operations: distributed key generation (DKG) ceremonies, DKG reshares, and DKG or presigned exit requests. It contains a [NodeJS](https://nodejs.org) application that listens for `DepositRequested`, `ReshareRequested`, and `PoolExitRequested` events, which then internally uses the [RockX DKG CLI and messenger server](https://github.com/rockx/rockx-dkg-cli) to initiate and retrieve operator group DKG results. The `DepositRequested` event starts a new DKG keygen and retrieves the results to submit a new validator via `depositPool`. The `ReshareRequested` event starts a new DKG reshare and retrieves the results to update an existing validator via `resharePool`. The `PoolExitRequested` event starts a new DKG exit and retrieves the results to submit a signed exit message directly to the Beacon chain. DKG operations and reports will theoretically have [verifiable](https://docs.obol.tech/docs/next/charon/dkg#dkg-verification) aspects that prove fair DKG ceremonies. diff --git a/services/oracle/scripts/dev.ts b/services/oracle/scripts/dev.ts index 59139510e..10a6c9226 100644 --- a/services/oracle/scripts/dev.ts +++ b/services/oracle/scripts/dev.ts @@ -5,8 +5,6 @@ const resourcePath = 'scripts/resources/rockx-dkg-cli' void async function () { process.env.BIP39_PATH_INDEX = '6' process.env.MANAGER_ADDRESS = process.env.PUBLIC_MANAGER_ADDRESS - process.env.NETWORK_ADDRESS = '0xAfdb141Dd99b5a101065f40e3D7636262dce65b3' - process.env.NETWORK_VIEWS_ADDRESS = '0x8dB45282d7C4559fd093C26f677B3837a5598914' process.env.CLI_PATH = `./${resourcePath}/build/bin/rockx-dkg-cli` process.env.MESSENGER_SRV_ADDR = 'http://0.0.0.0:3000' process.env.USE_HARDCODED_OPERATORS = 'true' diff --git a/services/oracle/src/index.ts b/services/oracle/src/index.ts index 2798af79b..6d37b61a9 100644 --- a/services/oracle/src/index.ts +++ b/services/oracle/src/index.ts @@ -3,15 +3,15 @@ import { getEventEmitter } from './providers/events' import { initiatePoolDepositHandler, initiatePoolExitHandler, initiatePoolReshareHandler } from './providers/handlers' const handlers = { - PoolDepositRequested: initiatePoolDepositHandler, - PoolReshareRequested: initiatePoolReshareHandler, + DepositRequested: initiatePoolDepositHandler, + ReshareRequested: initiatePoolReshareHandler, PoolExitRequested: initiatePoolExitHandler, - // PoolUnexpectedExitReportsRequested: reportUnexpectedExitsHandler, - // PoolSlashedExitReportsRequested: reportSlashedExitsHandler, - // PoolWithdrawnExitReportsRequested: reportWithdrawnExitsHandler + // UnexpectedExitReportsRequested: reportUnexpectedExitsHandler, + // SlashedExitReportsRequested: reportSlashedExitsHandler, + // WithdrawnExitReportsRequested: reportWithdrawnExitsHandler } -const { provider, signer, manager, networkAddress, networkViewsAddress, cliPath, messengerUrl } = config() +const { provider, signer, manager, cliPath, messengerUrl } = config() ;(async function () { const eventEmitter = getEventEmitter({ manager, events: Object.keys(handlers) }) @@ -23,8 +23,6 @@ const { provider, signer, manager, networkAddress, networkViewsAddress, cliPath, provider, signer, manager, - networkAddress, - networkViewsAddress, cliPath, messengerUrl, value diff --git a/services/oracle/src/interfaces/HandlerInput.ts b/services/oracle/src/interfaces/HandlerInput.ts index ee65b6bee..59a3c6e2c 100644 --- a/services/oracle/src/interfaces/HandlerInput.ts +++ b/services/oracle/src/interfaces/HandlerInput.ts @@ -8,10 +8,6 @@ export interface HandlerInput { signer: ethers.Signer /** Manager contract */ manager: CasimirManager & ethers.Contract - /** Network address */ - networkAddress: string - /** Network views address */ - networkViewsAddress: string /** DKG cli path */ cliPath: string /** DKG messenger service URL */ diff --git a/services/oracle/src/providers/config.ts b/services/oracle/src/providers/config.ts index 37b610946..599fc08e7 100644 --- a/services/oracle/src/providers/config.ts +++ b/services/oracle/src/providers/config.ts @@ -19,12 +19,6 @@ export function config() { const managerAddress = process.env.MANAGER_ADDRESS if (!managerAddress) throw new Error('No manager address provided') const manager = new ethers.Contract(managerAddress, CasimirManagerJson.abi, provider) as CasimirManager & ethers.Contract - - /** Get network contract addresses */ - const networkAddress = process.env.NETWORK_ADDRESS - if (!networkAddress) throw new Error('No network address provided') - const networkViewsAddress = process.env.NETWORK_VIEWS_ADDRESS - if (!networkViewsAddress) throw new Error('No network views address provided') /** Get DKG CLI path */ const cliPath = process.env.CLI_PATH @@ -34,5 +28,5 @@ export function config() { const messengerUrl = process.env.MESSENGER_SRV_ADDR if (!messengerUrl) throw new Error('No messenger url provided') - return { provider, signer, manager, networkAddress, networkViewsAddress, cliPath, messengerUrl } + return { provider, signer, manager, cliPath, messengerUrl } } diff --git a/services/oracle/src/providers/handlers.ts b/services/oracle/src/providers/handlers.ts index c129449b6..0f31f0a75 100644 --- a/services/oracle/src/providers/handlers.ts +++ b/services/oracle/src/providers/handlers.ts @@ -9,8 +9,6 @@ export async function initiatePoolDepositHandler(input: HandlerInput) { provider, signer, manager, - networkAddress, - networkViewsAddress, cliPath, messengerUrl, value @@ -38,8 +36,6 @@ export async function initiatePoolDepositHandler(input: HandlerInput) { const clusterDetails = await getClusterDetails({ provider, - networkAddress, - networkViewsAddress, operatorIds, withdrawalAddress: manager.address }) @@ -64,8 +60,6 @@ export async function initiatePoolReshareHandler(input: HandlerInput) { provider, signer, manager, - networkAddress, - networkViewsAddress, cliPath, messengerUrl, value @@ -103,8 +97,6 @@ export async function initiatePoolExitHandler(input: HandlerInput) { provider, signer, manager, - networkAddress, - networkViewsAddress, cliPath, messengerUrl, value From 30728d6617569be3d15134a28044b49867ce6726 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Sun, 4 Jun 2023 22:52:52 -0400 Subject: [PATCH 45/78] Add collateral recovery --- apps/web/src/composables/ssv.ts | 6 +- apps/web/src/composables/users.ts | 2 +- common/ssv/src/interfaces/ClusterDetails.ts | 2 +- .../ssv/src/interfaces/ClusterDetailsInput.ts | 4 +- .../{ExchangeRateInput.ts => PriceInput.ts} | 2 +- common/ssv/src/providers/clusters.ts | 41 +- common/ssv/src/providers/uniswap.ts | 8 +- contracts/ethereum/docs/index.md | 532 ++++++------ .../ethereum/functions/API-request-source.js | 8 +- contracts/ethereum/hardhat.config.ts | 2 + contracts/ethereum/helpers/oracle.ts | 71 +- contracts/ethereum/helpers/upkeep.ts | 39 +- contracts/ethereum/scripts/dev.ts | 46 +- contracts/ethereum/src/CasimirManager.sol | 790 +++++++++--------- contracts/ethereum/src/CasimirPool.sol | 91 ++ contracts/ethereum/src/CasimirRecipient.sol | 20 - contracts/ethereum/src/CasimirRegistry.sol | 78 +- contracts/ethereum/src/CasimirUpkeep.sol | 167 ++-- .../src/interfaces/ICasimirManager.sol | 98 ++- .../ethereum/src/interfaces/ICasimirPool.sol | 47 ++ .../src/interfaces/ICasimirRecipient.sol | 4 - .../src/interfaces/ICasimirRegistry.sol | 15 +- .../src/interfaces/ICasimirUpkeep.sol | 13 +- contracts/ethereum/src/vendor/SSVNetwork.sol | 4 - .../ethereum/src/vendor/SSVNetworkViews.sol | 4 - contracts/ethereum/test/fixtures/shared.ts | 248 +++--- contracts/ethereum/test/integration.ts | 28 +- services/oracle/README.md | 2 +- services/oracle/src/index.ts | 20 +- services/oracle/src/providers/handlers.ts | 72 +- 30 files changed, 1397 insertions(+), 1067 deletions(-) rename common/ssv/src/interfaces/{ExchangeRateInput.ts => PriceInput.ts} (88%) create mode 100644 contracts/ethereum/src/CasimirPool.sol delete mode 100644 contracts/ethereum/src/CasimirRecipient.sol create mode 100644 contracts/ethereum/src/interfaces/ICasimirPool.sol delete mode 100644 contracts/ethereum/src/interfaces/ICasimirRecipient.sol delete mode 100644 contracts/ethereum/src/vendor/SSVNetwork.sol delete mode 100644 contracts/ethereum/src/vendor/SSVNetworkViews.sol diff --git a/apps/web/src/composables/ssv.ts b/apps/web/src/composables/ssv.ts index 4db734d06..df8cc7852 100644 --- a/apps/web/src/composables/ssv.ts +++ b/apps/web/src/composables/ssv.ts @@ -72,7 +72,7 @@ export default function useSSV() { console.log('poolIds :>> ', poolIds) return await Promise.all(poolIds.map(async (poolId: number) => { - const { deposits, publicKey, operatorIds } = await manager.connect(provider).getPool(poolId) + const { publicKey, operatorIds } = await manager.connect(provider).getPoolDetails(poolId) // TODO: Decide when/how to get rewards/userRewards let pool: Pool = { @@ -98,12 +98,12 @@ export default function useSSV() { // TODO: Replace with less hardcoded network call? - const operators = await Promise.all(operatorIds.map(async (operatorId: number) => { + const operators = await Promise.all(operatorIds.map(async (operatorId) => { const network = 'prater' const response = await fetch(`https://api.ssv.network/api/v3/${network}/operators/${operatorId}`) const { performance } = await response.json() return { - id: operatorId, + id: operatorId.toNumber(), '24HourPerformance': performance['24h'], '30DayPerformance': performance['30d'], url: `https://explorer.ssv.network/operators/${operatorId}` diff --git a/apps/web/src/composables/users.ts b/apps/web/src/composables/users.ts index 3bee763f0..3fbbb48c7 100644 --- a/apps/web/src/composables/users.ts +++ b/apps/web/src/composables/users.ts @@ -179,7 +179,7 @@ export default function useUsers () { address: manager.address, topics: [ // ethers.utils.id('ManagerDistribution(address,uint256,uint256,uint256)'), // TODO: Make sure to query for past events on page load (Fetch and then subscribe), - ethers.utils.id('PoolDepositInitiated(uint32)'), + ethers.utils.id('DepositInitiated(uint32)'), ] } manager.connect(provider).on(validatorInitFilter, async () => { diff --git a/common/ssv/src/interfaces/ClusterDetails.ts b/common/ssv/src/interfaces/ClusterDetails.ts index d258f8867..f0d804056 100644 --- a/common/ssv/src/interfaces/ClusterDetails.ts +++ b/common/ssv/src/interfaces/ClusterDetails.ts @@ -3,5 +3,5 @@ import { BigNumber } from 'ethers' export interface ClusterDetails { cluster: Cluster, - requiredFees: BigNumber + requiredBalancePerValidator: BigNumber } \ No newline at end of file diff --git a/common/ssv/src/interfaces/ClusterDetailsInput.ts b/common/ssv/src/interfaces/ClusterDetailsInput.ts index 536f22da8..966ed7f9a 100644 --- a/common/ssv/src/interfaces/ClusterDetailsInput.ts +++ b/common/ssv/src/interfaces/ClusterDetailsInput.ts @@ -3,8 +3,8 @@ import { ethers } from 'ethers' export interface ClusterDetailsInput { /** JSON RPC node provider */ provider: ethers.providers.JsonRpcProvider + /** Owner address */ + ownerAddress: string /** Operator IDs */ operatorIds: number[] - /** Withdrawal address */ - withdrawalAddress: string } \ No newline at end of file diff --git a/common/ssv/src/interfaces/ExchangeRateInput.ts b/common/ssv/src/interfaces/PriceInput.ts similarity index 88% rename from common/ssv/src/interfaces/ExchangeRateInput.ts rename to common/ssv/src/interfaces/PriceInput.ts index 39d883ea1..78a8762c0 100644 --- a/common/ssv/src/interfaces/ExchangeRateInput.ts +++ b/common/ssv/src/interfaces/PriceInput.ts @@ -1,6 +1,6 @@ import { ethers } from 'ethers' -export interface ExchangeRateInput { +export interface PriceInput { /** JSON RPC node provider */ provider: ethers.providers.JsonRpcProvider /** The input token */ diff --git a/common/ssv/src/providers/clusters.ts b/common/ssv/src/providers/clusters.ts index b6facc881..85b986fe0 100644 --- a/common/ssv/src/providers/clusters.ts +++ b/common/ssv/src/providers/clusters.ts @@ -1,11 +1,11 @@ import { ethers } from 'ethers' -import { SSVNetwork, SSVNetworkViews } from '@casimir/ethereum/build/artifacts/types' -import SSVNetworkJson from '@casimir/ethereum/build/artifacts/scripts/resources/ssv-network/contracts/SSVNetwork.sol/SSVNetwork.json' -import SSVNetworkJsonViews from '@casimir/ethereum/build/artifacts/scripts/resources/ssv-network/contracts/SSVNetworkViews.sol/SSVNetworkViews.json' +import { ISSVNetwork, ISSVNetworkViews } from '@casimir/ethereum/build/artifacts/types' +import ISSVNetworkJson from '@casimir/ethereum/build/artifacts/scripts/resources/ssv-network/contracts/ISSVNetwork.sol/ISSVNetwork.json' +import ISSVNetworkViewsJson from '@casimir/ethereum/build/artifacts/scripts/resources/ssv-network/contracts/ISSVNetworkViews.sol/ISSVNetworkViews.json' import { ClusterDetailsInput } from '../interfaces/ClusterDetailsInput' import { ClusterDetails } from '../interfaces/ClusterDetails' import { Cluster } from '@casimir/types' -import { getExchangeRate } from './uniswap' +import { getPrice } from './uniswap' const networkAddress = '0xAfdb141Dd99b5a101065f40e3D7636262dce65b3' const networkViewsAddress = '0x8dB45282d7C4559fd093C26f677B3837a5598914' @@ -30,12 +30,12 @@ const eventList = [ * @returns {Promise} Cluster snapshot */ export async function getClusterDetails(input: ClusterDetailsInput): Promise { - const { provider, operatorIds, withdrawalAddress } = input + const { provider, ownerAddress, operatorIds } = input - const ssvNetwork = new ethers.Contract(networkAddress, SSVNetworkJson.abi, provider) as SSVNetwork & ethers.Contract - const ssvNetworkViews = new ethers.Contract(networkViewsAddress, SSVNetworkJsonViews.abi, provider) as SSVNetworkViews & ethers.Contract + const ssvNetwork = new ethers.Contract(networkAddress, ISSVNetworkJson.abi, provider) as ISSVNetwork & ethers.Contract + const ssvNetworkViews = new ethers.Contract(networkViewsAddress, ISSVNetworkViewsJson.abi, provider) as ISSVNetworkViews & ethers.Contract - const eventFilters = eventList.map(event => ssvNetwork.filters[event](withdrawalAddress)) + const eventFilters = eventList.map(event => ssvNetwork.filters[event](ownerAddress)) let step = MONTH const latestBlockNumber = await provider.getBlockNumber() @@ -97,17 +97,22 @@ export async function getClusterDetails(input: ClusterDetailsInput): Promise }) { +export async function initiateDepositHandler({ manager, signer, args }: { manager: CasimirManager, signer: SignerWithAddress, args: Record }) { const { poolId } = args - const { depositDataRoot, publicKey, @@ -18,17 +17,13 @@ export async function initiatePoolDepositHandler({ manager, signer, args }: { ma operatorIds, shares, } = mockValidators[poolId - 1] - - const withdrawalAddress = manager.address const clusterDetails = await getClusterDetails({ provider: ethers.provider, - operatorIds, - withdrawalAddress + ownerAddress: manager.address, + operatorIds }) - - const { cluster, requiredFees } = clusterDetails - - const initiatePoolDeposit = await manager.connect(signer).initiatePoolDeposit( + const { cluster, requiredBalancePerValidator } = clusterDetails + const initiateDeposit = await manager.connect(signer).initiateDeposit( depositDataRoot, publicKey, signature, @@ -36,33 +31,39 @@ export async function initiatePoolDepositHandler({ manager, signer, args }: { ma operatorIds, shares, cluster, - requiredFees // Mock fee amount estimate ~ 10 SSV + requiredBalancePerValidator // Mock fee amount estimate ~ 10 SSV ) - await initiatePoolDeposit.wait() + await initiateDeposit.wait() } -export async function completePoolExitHandler({ manager, signer }: { manager: CasimirManager, signer: SignerWithAddress }) { - const stakedPoolIds = await manager.getStakedPoolIds() - const exitedPoolId = stakedPoolIds[0] - const exitedPool = await manager.getPool(exitedPoolId) - const poolIndex = stakedPoolIds.findIndex((poolId: number) => poolId === exitedPoolId) - const operatorIds = exitedPool.operatorIds.map((operatorId) => operatorId.toNumber()) - const finalEffectiveBalance = ethers.utils.parseEther('32') - const blamePercents = [0, 0, 0, 0] +export async function reportCompletedExitsHandler({ manager, signer, args }: { manager: CasimirManager, signer: SignerWithAddress, args: Record }) { + const { count } = args - const withdrawalAddress = manager.address - const clusterDetails = await getClusterDetails({ - provider: ethers.provider, - operatorIds, - withdrawalAddress - }) - const { cluster } = clusterDetails - - const completePoolExit = await manager.connect(signer).completePoolExit( - poolIndex, - finalEffectiveBalance, - blamePercents, - cluster - ) - await completePoolExit.wait() + // In production, we get the withdrawn exit order from the Beacon API (sorting by withdrawal epoch) + // Here, we're just reporting them in the order they were exited + let remaining = count + let poolIndex = 0 + const stakedPoolIds = await manager.getStakedPoolIds() + while (remaining > 0) { + const poolId = stakedPoolIds[poolIndex] + const poolDetails = await manager.getPoolDetails(poolId) + if (poolDetails.status === 2 || poolDetails.status === 3) { + remaining-- + const operatorIds = poolDetails.operatorIds.map((operatorId) => operatorId.toNumber()) + const blamePercents = [0, 0, 0, 0] + const clusterDetails = await getClusterDetails({ + provider: ethers.provider, + ownerAddress: manager.address, + operatorIds + }) + const { cluster } = clusterDetails + const reportCompletedExit = await manager.connect(signer).reportCompletedExit( + poolIndex, + blamePercents, + cluster + ) + await reportCompletedExit.wait() + } + poolIndex++ + } } \ No newline at end of file diff --git a/contracts/ethereum/helpers/upkeep.ts b/contracts/ethereum/helpers/upkeep.ts index e565b50b9..1f0fdee48 100644 --- a/contracts/ethereum/helpers/upkeep.ts +++ b/contracts/ethereum/helpers/upkeep.ts @@ -4,13 +4,14 @@ import { CasimirUpkeep } from '../build/artifacts/types' export interface ReportValues { activeBalance: number + sweptBalance: number activatedDeposits: number - unexpectedExits: number - slashedExits: number - withdrawnExits: number + forcedExits: number + completedExits: number + compoundablePoolIds: number[] } -export async function fulfillReportRequest({ +export async function fulfillReport({ upkeep, keeper, requestId, @@ -21,20 +22,34 @@ export async function fulfillReportRequest({ requestId: number, values: ReportValues }) { + const { activeBalance, sweptBalance, activatedDeposits, forcedExits, completedExits, compoundablePoolIds } = values + requestId++ - const requestIdHash = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [requestId])) - const { activeBalance, activatedDeposits, unexpectedExits, slashedExits, withdrawnExits } = values - const activeBalanceGwei = ethers.utils.parseUnits(activeBalance.toString(), 'gwei') - const responseBytes = ethers.utils.defaultAbiCoder.encode( - ['uint128', 'uint32', 'uint32', 'uint32', 'uint32'], - [activeBalanceGwei, activatedDeposits, unexpectedExits, slashedExits, withdrawnExits] + const balancesRequestIdHash = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [requestId])) + const balancesResponseBytes = ethers.utils.defaultAbiCoder.encode( + ['uint128', 'uint128'], + [ethers.utils.parseEther(activeBalance.toString()), ethers.utils.parseEther(sweptBalance.toString())] ) await fulfillFunctionsRequest({ upkeep, keeper, - requestIdHash, - responseBytes + requestIdHash: balancesRequestIdHash, + responseBytes: balancesResponseBytes }) + + requestId++ + const detailsRequestIdHash = ethers.utils.keccak256(ethers.utils.defaultAbiCoder.encode(['uint256'], [requestId])) + const detailsResponseBytes = ethers.utils.defaultAbiCoder.encode( + ['uint32', 'uint32', 'uint32', 'uint32[5]'], + [activatedDeposits, forcedExits, completedExits, compoundablePoolIds] + ) + await fulfillFunctionsRequest({ + upkeep, + keeper, + requestIdHash: detailsRequestIdHash, + responseBytes: detailsResponseBytes + }) + return requestId } diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 5f8aa556e..56d7b4dd1 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -1,11 +1,12 @@ import { deployContract } from '@casimir/ethereum/helpers/deploy' import { ContractConfig, DeploymentConfig } from '@casimir/types' -import { CasimirUpkeep, CasimirManager } from '@casimir/ethereum/build/artifacts/types' -import { ethers } from 'hardhat' -import { fulfillReportRequest, runUpkeep } from '@casimir/ethereum/helpers/upkeep' +import { CasimirUpkeep, CasimirManager, CasimirRegistry, ISSVNetworkViews } from '@casimir/ethereum/build/artifacts/types' +import { ethers, network } from 'hardhat' +import { fulfillReport, runUpkeep } from '@casimir/ethereum/helpers/upkeep' import { round } from '@casimir/ethereum/helpers/math' import EventEmitter, { on } from 'events' import { time, setBalance } from '@nomicfoundation/hardhat-network-helpers' +import ISSVNetworkViewsJson from '@casimir/ethereum/build/artifacts/scripts/resources/ssv-network/contracts/ISSVNetworkViews.sol/ISSVNetworkViews.json' void async function () { const [, , , , fourthUser, keeper, oracle] = await ethers.getSigners() @@ -20,6 +21,7 @@ void async function () { functionsSubscriptionId: process.env.FUNCTIONS_SUBSCRIPTION_ID, linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, + ssvNetworkViewsAddress: process.env.SSV_NETWORK_VIEWS_ADDRESS, ssvTokenAddress: process.env.SSV_TOKEN_ADDRESS, swapFactoryAddress: process.env.SWAP_FACTORY_ADDRESS, swapRouterAddress: process.env.SWAP_ROUTER_ADDRESS, @@ -64,7 +66,23 @@ void async function () { } const manager = await ethers.getContractAt('CasimirManager', config.CasimirManager.address as string) as CasimirManager - const upkeep = await ethers.getContractAt('CasimirUpkeep', await manager.getUpkeepAddress() as string) as CasimirUpkeep + const registry = await ethers.getContractAt('CasimirRegistry', await manager.getRegistryAddress()) as CasimirRegistry + const upkeep = await ethers.getContractAt('CasimirUpkeep', await manager.getUpkeepAddress()) as CasimirUpkeep + const ssvNetworkViews = await ethers.getContractAt(ISSVNetworkViewsJson.abi, process.env.SSV_NETWORK_VIEWS_ADDRESS as string) as ISSVNetworkViews + + for (const operatorId of [1, 2, 3, 4]) { + const [ operatorOwnerAddress ] = await ssvNetworkViews.getOperatorById(operatorId) + const currentBalance = await ethers.provider.getBalance(operatorOwnerAddress) + const nextBalance = currentBalance.add(ethers.utils.parseEther('4')) + await setBalance(operatorOwnerAddress, nextBalance) + await network.provider.request({ + method: 'hardhat_impersonateAccount', + params: [operatorOwnerAddress] + }) + const operatorSigner = ethers.provider.getSigner(operatorOwnerAddress) + const result = await registry.connect(operatorSigner).registerOperator(operatorId, { value: ethers.utils.parseEther('4') }) + await result.wait() + } /** Stake 160 from the fourth user */ setTimeout(async () => { @@ -82,7 +100,7 @@ void async function () { if (block - blocksPerReward >= lastRewardBlock) { console.log('New reward block') lastRewardBlock = block - const depositedPoolCount = await manager.getDepositedPoolCount() + const depositedPoolCount = await manager.getTotalDeposits() if (depositedPoolCount) { console.log(`Rewarding ${depositedPoolCount} validators ${rewardPerValidator} each`) await time.increase(time.duration.days(1)) @@ -101,13 +119,14 @@ void async function () { let nextActivatedDeposits = (await manager.getPendingPoolIds()).length let nextValues = { activeBalance: nextActiveBalance, + sweptBalance: 0, activatedDeposits: nextActivatedDeposits, - unexpectedExits: 0, - slashedExits: 0, - withdrawnExits: 0 + forcedExits: 0, + completedExits: 0, + compoundablePoolIds: [0, 0, 0, 0, 0] } - requestId = await fulfillReportRequest({ + requestId = await fulfillReport({ upkeep, keeper, values: nextValues, @@ -134,13 +153,14 @@ void async function () { nextActivatedDeposits = (await manager.getPendingPoolIds()).length nextValues = { activeBalance: nextActiveBalance, + sweptBalance: rewardAmount, activatedDeposits: nextActivatedDeposits, - unexpectedExits: 0, - slashedExits: 0, - withdrawnExits: 0 + forcedExits: 0, + completedExits: 0, + compoundablePoolIds: [0, 0, 0, 0, 0] } - requestId = await fulfillReportRequest({ + requestId = await fulfillReport({ upkeep, keeper, values: nextValues, diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index b91a1b01d..08e2800fa 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: Apache pragma solidity 0.8.18; +import "./CasimirPool.sol"; +import "./CasimirRegistry.sol"; import "./CasimirUpkeep.sol"; import "./interfaces/ICasimirManager.sol"; import "./libraries/Types.sol"; @@ -42,8 +44,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /* Constants */ /*************/ - /* Distribution threshold (100 WEI) */ - uint256 private constant distributionThreshold = 100 wei; + /** Compound minimum (0.1 ETH) */ + uint256 private constant compoundMinimum = 100000000000000000; + /** Stake minimum (0.0001 ETH) */ + uint256 private constant stakeMinimum = 100000000000000; /** Scale factor for each rewards to stake ratio */ uint256 private constant scaleFactor = 1 ether; /** Uniswap 0.3% fee tier */ @@ -57,6 +61,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Manager oracle address */ address private immutable oracleAddress; + /** Registry contract */ + ICasimirRegistry private immutable registry; /** Upkeep contract */ ICasimirUpkeep private immutable upkeep; /** Beacon deposit contract */ @@ -72,65 +78,52 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Uniswap router contract */ ISwapRouter private immutable swapRouter; - /***************/ - /* Enumerators */ - /***************/ - - /** Token abbreviations */ - enum Token { - LINK, - SSV, - WETH - } - /********************/ /* Dynamic State */ /********************/ - /** Latest active rewards */ - int256 private latestRewards; + /** Current report period */ + uint32 private reportPeriod; + /** Last pool ID created */ + uint32 private lastPoolId; /** Latest active balance */ uint256 private latestActiveBalance; /** Latest active balance after fees */ uint256 private latestActiveBalanceAfterFees; - /** Latest expected effective balance */ - uint256 private latestExpectedEffectiveBalance; + /** Latest active rewards */ + int256 private latestActiveRewardBalance; /** Requested pool exit reports */ - uint256 private requestedPoolWithdrawnExitReports; - /** Requested pool slash reports */ - uint256 private requestedPoolSlashedExitReports; + uint256 private requestedCompletedExitReports; /** Requested pool unexpected exit reports */ - uint256 private requestedPoolUnexpectedExitReports; + uint256 private requestedForcedExitReports; /** Exited balance */ - uint256 private reportFinalizableWithdrawnBalance; + uint256 private finalizableExitedBalance; /** Exited pool count */ - uint256 finalizableWithdrawnPoolCount; - /** Current report period */ - uint32 private reportPeriod; - /** Last pool ID created */ - uint32 private lastPoolId; + uint256 finalizableCompletedExits; /** Token addresses */ mapping(Token => address) private tokenAddresses; - /** Unswapped tokens by address */ - mapping(address => uint256) private unswappedTokens; /** All users */ mapping(address => User) private users; /** Sum of scaled rewards to balance ratios (intial value required) */ uint256 private stakeRatioSum = 1000 ether; /** Pending withdrawals */ - Withdrawal[] private pendingWithdrawalQueue; - /** Total pending withdrawals */ - uint256 private pendingWithdrawals; + Withdrawal[] private requestedWithdrawalQueue; + /** Total pending withdrawal amount */ + uint256 private requestedWithdrawalBalance; /** Total pending withdrawals count */ - uint256 private pendingWithdrawalCount; - /** All pools (ready, pending, or staked) */ - mapping(uint32 => Pool) private pools; + uint256 private requestedWithdrawals; + /** All pool addresses */ + mapping(uint32 => address) private poolAddresses; + /** Validator tip balance */ + uint256 private tipBalance; + /** Pool recovered balances */ + mapping(uint32 => uint256) private recoveredBalances; /** Total deposits not yet in pools */ uint256 private prepoolBalance; - /** Total withdrawable deposits */ + /** Total exited deposits */ uint256 private exitedBalance; /** Total reserved (execution) fees */ - uint256 private reservedFees; + uint256 private reservedFeeBalance; /** IDs of pools ready for initiation */ uint32[] private readyPoolIds; /** IDS of pools pending deposit confirmation */ @@ -138,24 +131,26 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** IDs of pools staked */ uint32[] private stakedPoolIds; /** Active pool count */ - uint256 private depositedPoolCount; + uint256 private totalDeposits; /** Slashed pool count */ - uint256 private slashedPoolCount; + uint256 private forcedExits; /** Exiting pool count */ - uint256 private exitingPoolCount; + uint256 private requestedExits; /** Total fee percentage */ uint32 private feePercent = 5; - /** ETH fee percentage */ - uint32 private ethFeePercent = 3; - /** LINK fee percentage */ - uint32 private linkFeePercent = 1; - /** SSV fee percentage */ - uint32 private ssvFeePercent = 1; /*************/ /* Modifiers */ /*************/ + /** + * @dev Validate the caller is the authorized pool + */ + modifier onlyPool(uint32 poolId) { + require(msg.sender == poolAddresses[poolId], "Only authorized pool can call this function"); + _; + } + /** * @dev Validate the caller is the manager oracle */ @@ -167,6 +162,17 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { _; } + /** + * @dev Validate the caller is the registry + */ + modifier onlyRegistry() { + require( + msg.sender == address(registry), + "Only registry can call this function" + ); + _; + } + /** * @dev Validate the caller is the upkeep contract */ @@ -181,10 +187,18 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @dev Validate a deposit */ - modifier validateDeposit() { + modifier validDeposit() { + require(msg.value >= stakeMinimum, "Deposit must be greater than minimum"); + _; + } + + /** + * @dev Validate a withdrawal + */ + modifier validWithdrawal(uint256 amount) { require( - msg.value > 0, - "Deposit must be greater than zero" + amount >= stakeMinimum, + "Withdrawal must be greater than minimum" ); _; } @@ -194,10 +208,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param amount The amount to validate */ modifier validDistribution(uint256 amount) { - require( - amount > 0, - "Distribution must be greater than zero" - ); + require(amount > 0, "Distribution must be greater than zero"); _; } @@ -209,6 +220,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param functionsSubscriptionId The Chainlink functions subscription ID * @param linkTokenAddress The Chainlink token address * @param ssvNetworkAddress The SSV network address + * @param ssvNetworkViewsAddress The SSV network views address * @param ssvTokenAddress The SSV token address * @param swapFactoryAddress The Uniswap factory address * @param swapRouterAddress The Uniswap router address @@ -221,6 +233,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint32 functionsSubscriptionId, address linkTokenAddress, address ssvNetworkAddress, + address ssvNetworkViewsAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, @@ -237,26 +250,26 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { swapRouter = ISwapRouter(swapRouterAddress); tokenAddresses[Token.WETH] = wethTokenAddress; - upkeep = new CasimirUpkeep( - address(this), - functionsAddress, - functionsSubscriptionId - ); + registry = new CasimirRegistry(ssvNetworkViewsAddress); + upkeep = new CasimirUpkeep(functionsAddress, functionsSubscriptionId); } /** - * @notice Redirect users to the deposit function + * @notice Receive and deposit validator tips */ receive() external payable { - revert("Use depositStake() instead"); + tipBalance += msg.value; + if (tipBalance >= compoundMinimum) { + depositTips(); + } } /** * @notice Deposit user stake */ - function depositStake() external payable nonReentrant validateDeposit() { + function depositStake() external payable nonReentrant validDeposit { uint256 depositAfterFees = subtractFees(msg.value); - reservedFees += msg.value - depositAfterFees; + reservedFeeBalance += msg.value - depositAfterFees; if (users[msg.sender].stake0 > 0) { users[msg.sender].stake0 = getUserStake(msg.sender); @@ -271,16 +284,48 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Deposit a given amount of rewards - * @param rewards The amount of rewards to deposit */ - function depositRewards(uint256 rewards) private { - uint256 rewardsAfterFees = subtractFees(rewards); - reservedFees += rewards - rewardsAfterFees; + function depositRewards() external payable { + uint256 rewardsAfterFees = subtractFees(msg.value); + reservedFeeBalance += msg.value - rewardsAfterFees; distributeStake(rewardsAfterFees); emit RewardsDeposited(rewardsAfterFees); } + /** + * @notice Deposit the current tip balance + */ + function depositTips() private { + uint256 tipsAfterFees = subtractFees(tipBalance); + reservedFeeBalance += tipBalance - tipsAfterFees; + tipBalance = 0; + distributeStake(tipsAfterFees); + + emit TipsDeposited(tipsAfterFees); + } + + /** + * @notice Deposit exited balance from a given pool ID + * @param poolId The pool ID + */ + function depositExitedBalance(uint32 poolId) external payable onlyPool(poolId) { + delete poolAddresses[poolId]; + uint256 balance = msg.value + recoveredBalances[poolId]; + delete recoveredBalances[poolId]; + + exitedBalance += balance; + finalizableExitedBalance += balance; + finalizableCompletedExits++; + } + + /** + * @notice Deposit recovered balance for a given pool from an operator + */ + function depositRecoveredBalance(uint32 poolId) external payable onlyRegistry { + recoveredBalances[poolId] += msg.value; + } + /** * @dev Distribute a given amount of stake * @param amount The amount of stake to distribute @@ -294,11 +339,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } else { lastPoolId++; uint32 poolId = lastPoolId; - Pool storage pool; - pool = pools[poolId]; prepoolBalance = 0; amount -= remainingCapacity; - pool.deposits = poolCapacity; readyPoolIds.push(poolId); emit DepositRequested(poolId); @@ -311,19 +353,20 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param activeBalance The active balance * @param sweptBalance The swept balance * @param activatedDeposits The count of activated deposits - * @param withdrawnExits The count of withdrawn exits + * @param completedExits The count of withdrawn exits */ function rebalanceStake( uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, - uint256 withdrawnExits - ) external onlyUpkeep() { - uint256 activatedBalance = activatedDeposits * poolCapacity; - uint256 withdrawnBalance = withdrawnExits * poolCapacity; - int256 surplus = int256(activeBalance + sweptBalance) - (int256(getExpectedEffectiveBalance() + withdrawnBalance)); - int256 rewards = surplus - int256(reportFinalizableWithdrawnBalance); - int256 change = rewards - latestRewards; + uint256 completedExits + ) external onlyUpkeep { + uint256 expectedActivatedBalance = activatedDeposits * poolCapacity; + uint256 expectedExitedBalance = completedExits * poolCapacity; + int256 surplus = int256(activeBalance + sweptBalance) - + (int256(getExpectedEffectiveBalance() + expectedExitedBalance)); + int256 rewards = surplus - int256(finalizableExitedBalance); + int256 change = rewards - latestActiveRewardBalance; if (change > 0) { uint256 gain = SafeCast.toUint256(change); @@ -355,27 +398,38 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { emit StakeRebalanced(loss); } - uint256 sweptRewards = sweptBalance - reportFinalizableWithdrawnBalance; - latestRewards = rewards - int256(sweptRewards); - if (sweptRewards > 0) { - latestActiveBalanceAfterFees -= subtractFees(sweptRewards); - depositRewards(sweptRewards); - } - + uint256 sweptRewards = sweptBalance - finalizableExitedBalance; + latestActiveRewardBalance = rewards - int256(sweptRewards); latestActiveBalance = activeBalance; - latestActiveBalanceAfterFees += activatedBalance; - latestActiveBalanceAfterFees -= reportFinalizableWithdrawnBalance; + latestActiveBalanceAfterFees += expectedActivatedBalance; + latestActiveBalanceAfterFees -= subtractFees(sweptRewards); + latestActiveBalanceAfterFees -= finalizableExitedBalance; reportPeriod++; - reportFinalizableWithdrawnBalance = 0; - finalizableWithdrawnPoolCount = 0; + finalizableExitedBalance = 0; + finalizableCompletedExits = 0; + } + + /** + * @notice Compound rewards given a list of pool IDs + * @param poolIds The list of pool IDs + */ + function compoundRewards(uint32[5] memory poolIds) external onlyUpkeep { + for (uint256 i = 0; i < poolIds.length; i++) { + uint32 poolId = poolIds[i]; + if (poolId == 0) { + break; + } + ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); + pool.depositRewards(); + } } /** * @notice Request to withdraw user stake * @param amount The amount of stake to withdraw */ - function requestWithdrawal(uint256 amount) external nonReentrant { + function requestWithdrawal(uint256 amount) external nonReentrant validWithdrawal(amount) { users[msg.sender].stake0 = getUserStake(msg.sender); require( users[msg.sender].stake0 >= amount, @@ -386,27 +440,27 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { users[msg.sender].stake0 -= amount; if (amount <= getWithdrawableBalance()) { - completeWithdrawal(msg.sender, amount); + fulfillWithdrawal(msg.sender, amount); } else { - pendingWithdrawalQueue.push( + requestedWithdrawalQueue.push( Withdrawal({ user: msg.sender, amount: amount, period: reportPeriod }) ); - pendingWithdrawals += amount; - pendingWithdrawalCount++; + requestedWithdrawalBalance += amount; + requestedWithdrawals++; - uint256 coveredExitBalance = (exitingPoolCount - slashedPoolCount) * - poolCapacity; - if (pendingWithdrawals > coveredExitBalance) { - uint256 exitsRequired = (pendingWithdrawals - + uint256 coveredExitBalance = requestedExits * poolCapacity; + if (requestedWithdrawalBalance > coveredExitBalance) { + uint256 exitsRequired = (requestedWithdrawalBalance - coveredExitBalance) / poolCapacity; - if (exitsRequired == 0) { - exitsRequired = 1; + if ((requestedWithdrawalBalance - + coveredExitBalance) % poolCapacity > 0) { + exitsRequired++; } - requestPoolExits(exitsRequired); + requestExits(exitsRequired); } emit WithdrawalInitiated(msg.sender, amount); @@ -414,39 +468,37 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Complete a given count of pending withdrawals + * @notice Fulfill a given count of pending withdrawals * @param count The number of withdrawals to complete */ - function completePendingWithdrawals(uint256 count) external onlyUpkeep() { + function fulfillWithdrawals(uint256 count) external onlyUpkeep { while (count > 0) { count--; - if (pendingWithdrawalQueue.length == 0) { + if (requestedWithdrawalQueue.length == 0) { break; } - Withdrawal memory withdrawal = pendingWithdrawalQueue[0]; + Withdrawal memory withdrawal = requestedWithdrawalQueue[0]; if (withdrawal.period > reportPeriod) { break; } - pendingWithdrawalQueue.remove(0); - pendingWithdrawals -= withdrawal.amount; - pendingWithdrawalCount--; + requestedWithdrawalQueue.remove(0); + requestedWithdrawalBalance -= withdrawal.amount; + requestedWithdrawals--; - completeWithdrawal(withdrawal.user, withdrawal.amount); - - emit WithdrawalCompleted(withdrawal.user, withdrawal.amount); + fulfillWithdrawal(withdrawal.user, withdrawal.amount); } } /** - * @notice Complete a withdrawal + * @notice Fulfill a withdrawal * @param sender The withdrawal sender * @param amount The withdrawal amount */ - function completeWithdrawal(address sender, uint256 amount) private { + function fulfillWithdrawal(address sender, uint256 amount) private { if (amount <= exitedBalance) { exitedBalance -= amount; } else { @@ -457,7 +509,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { sender.send(amount); - emit WithdrawalCompleted(sender, amount); + emit WithdrawalFulfilled(sender, amount); } /** @@ -470,65 +522,94 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param shares The operator shares * @param feeAmount The fee amount */ - function initiatePoolDeposit( + function initiateDeposit( bytes32 depositDataRoot, - bytes calldata publicKey, - bytes calldata signature, - bytes calldata withdrawalCredentials, + bytes memory publicKey, + bytes memory signature, + bytes memory withdrawalCredentials, uint64[] memory operatorIds, - bytes calldata shares, + bytes memory shares, ISSVNetworkCore.Cluster memory cluster, uint256 feeAmount - ) external onlyOracle() { + ) external onlyOracle { require(readyPoolIds.length > 0, "No ready pools"); - require(reservedFees >= feeAmount, "Not enough reserved fees"); + require(reservedFeeBalance >= feeAmount, "Not enough reserved fees"); // Todo validate deposit data root - reservedFees -= feeAmount; - - (, uint256 ssvFees) = processFees(feeAmount); - uint32 poolId = readyPoolIds[0]; - Pool storage pool = pools[poolId]; - pool.depositDataRoot = depositDataRoot; - pool.publicKey = publicKey; - pool.operatorIds = operatorIds; - pool.shares = shares; - pool.signature = signature; - pool.withdrawalCredentials = withdrawalCredentials; - readyPoolIds.remove(0); pendingPoolIds.push(poolId); - depositedPoolCount++; + totalDeposits++; + + poolAddresses[poolId] = deployPool(poolId, publicKey, operatorIds); + + registerPool( + poolId, + depositDataRoot, + publicKey, + signature, + withdrawalCredentials, + operatorIds, + shares, + cluster, + feeAmount + ); + + emit DepositInitiated(poolId); + } - beaconDeposit.deposit{value: pool.deposits}( - pool.publicKey, - pool.withdrawalCredentials, - pool.signature, - pool.depositDataRoot + function deployPool( + uint32 poolId, + bytes memory publicKey, + uint64[] memory operatorIds + ) private returns (address poolAddress) { + ICasimirPool pool = new CasimirPool( + address(registry), + poolId, publicKey, + operatorIds ); + poolAddress = address(pool); + } - linkToken.approve(address(upkeep), linkToken.balanceOf(address(this))); + function registerPool( + uint32 poolId, + bytes32 depositDataRoot, + bytes memory publicKey, + bytes memory signature, + bytes memory withdrawalCredentials, + uint64[] memory operatorIds, + bytes memory shares, + ISSVNetworkCore.Cluster memory cluster, + uint256 feeAmount + ) private { + for (uint256 i = 0; i < operatorIds.length; i++) { + registry.addActivePool(poolId, operatorIds[i]); + } - ssvToken.approve(address(ssvNetwork), ssvFees); + beaconDeposit.deposit{value: poolCapacity}( + publicKey, + withdrawalCredentials, + signature, + depositDataRoot + ); + uint256 ssvFees = processFees(feeAmount, tokenAddresses[Token.SSV]); + ssvToken.approve(address(ssvNetwork), ssvFees); ssvNetwork.registerValidator( - pool.publicKey, - pool.operatorIds, - pool.shares, + publicKey, + operatorIds, + shares, ssvFees, cluster ); - - emit PoolDepositInitiated(poolId); } /** - * @notice Complete a given count of the next pending pools - * @param count The number of pools to complete + * @notice Activate a given count of the next pending pools + * @param count The number of pools to activate */ - function completePoolDeposits(uint256 count) external onlyUpkeep() { + function activateDeposits(uint256 count) external onlyUpkeep { require(pendingPoolIds.length >= count, "Not enough pending pools"); while (count > 0) { @@ -538,7 +619,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { pendingPoolIds.remove(0); stakedPoolIds.push(poolId); - emit PoolDeposited(poolId); + emit DepositActivated(poolId); } } @@ -546,134 +627,110 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Request a given count of staked pool exits * @param count The number of exits to request */ - function requestPoolExits(uint256 count) private { + function requestExits(uint256 count) private { uint256 index = 0; while (count > 0) { uint32 poolId = stakedPoolIds[index]; - Pool storage pool = pools[poolId]; + ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); - if (!pool.exiting) { + ICasimirPool.PoolStatus poolStatus = pool.getStatus(); + if (poolStatus == ICasimirPool.PoolStatus.PENDING || poolStatus == ICasimirPool.PoolStatus.ACTIVE) { count--; index++; - pool.exiting = true; - exitingPoolCount++; + pool.setStatus(ICasimirPool.PoolStatus.EXITING_REQUESTED); + requestedExits++; - emit PoolExitRequested(poolId); + emit ExitRequested(poolId); } } } /** - * @notice Request a given count of pool unexpected exit reports - * @param count The number of pool unexpected exit reports + * @notice Request reports for a given count of pools forced to exit + * @param count The number of pools forced to exit */ - function requestPoolUnexpectedExitReports(uint256 count) external onlyUpkeep() { - requestedPoolUnexpectedExitReports = count; + function requestForcedExitReports(uint256 count) external onlyUpkeep { + requestedForcedExitReports = count; - emit UnexpectedExitReportsRequested(count); + emit ForcedExitReportsRequested(count); } /** - * @notice Request a given count of pool slashed exit reports - * @param count The number of pool slashed exit reports + * @notice Request reports for a given count of completed exits + * @param count The number of completed exits */ - function requestPoolSlashedExitReports(uint256 count) external onlyUpkeep() { - requestedPoolSlashedExitReports = count; + function requestCompletedExitReports(uint256 count) external onlyUpkeep { + requestedCompletedExitReports = count; - emit SlashedExitReportsRequested(count); - } - - /** - * @notice Request a given count of pool exit completions - * @param count The number of pool exits to complete - */ - function requestPoolWithdrawnExitReports(uint256 count) external onlyUpkeep() { - requestedPoolWithdrawnExitReports = count; - - emit WithdrawnExitReportsRequested(count); + emit CompletedExitReportsRequested(count); } /** * @notice Report a pool unexpected exit * @param poolId The pool ID */ - function reportPoolUnexpectedExit(uint32 poolId) external onlyOracle() { + function reportForcedExit(uint32 poolId) external onlyOracle { require( - requestedPoolUnexpectedExitReports > 0, + requestedForcedExitReports > 0, "No requested pool unexpected exit reports" ); - Pool storage pool = pools[poolId]; - require(!pool.exiting, "Pool is already exiting"); - - requestedPoolUnexpectedExitReports -= 1; - pool.exiting = true; - exitingPoolCount++; - } - - /** - * @notice Report a pool slash - * @param poolId The pool ID - */ - function reportPoolSlash(uint32 poolId) external onlyOracle() { + ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); + ICasimirPool.PoolStatus poolStatus = pool.getStatus(); require( - requestedPoolSlashedExitReports > 0, - "No requested pool slash reports" + poolStatus != ICasimirPool.PoolStatus.EXITING_FORCED, + "Forced exit already reported" ); - Pool storage pool = pools[poolId]; - require(!pool.slashed, "Pool is already slashed"); - - requestedPoolSlashedExitReports -= 1; - pool.slashed = true; - slashedPoolCount++; - if (!pool.exiting) { - pool.exiting = true; - exitingPoolCount++; + + requestedForcedExitReports -= 1; + forcedExits++; + if (poolStatus == ICasimirPool.PoolStatus.EXITING_REQUESTED) { + requestedExits--; } + pool.setStatus(ICasimirPool.PoolStatus.EXITING_FORCED); } /** - * @notice Complete a pool exit + * @notice Report a completed exit * @param poolIndex The staked pool index - * @param finalEffectiveBalance The final effective balance * @param blamePercents The operator blame percents (0 if balance is 32 ether) * @param cluster The SSV cluster snapshot */ - function completePoolExit( + function reportCompletedExit( uint256 poolIndex, - uint256 finalEffectiveBalance, uint32[] memory blamePercents, ISSVNetworkCore.Cluster memory cluster - ) external onlyOracle() { + ) external onlyOracle { require( - requestedPoolWithdrawnExitReports > 0, + requestedCompletedExitReports > 0, "No requested pool withdrawn exit reports" ); - - requestedPoolWithdrawnExitReports -= 1; uint32 poolId = stakedPoolIds[poolIndex]; - Pool storage pool = pools[poolId]; - uint64[] memory operatorIds = pool.operatorIds; - bytes memory publicKey = pool.publicKey; - - // Todo recover lost funds from collateral using blame percents - - depositedPoolCount--; - exitingPoolCount--; - if (pool.slashed) { - slashedPoolCount--; - } - - exitedBalance += finalEffectiveBalance; - reportFinalizableWithdrawnBalance += finalEffectiveBalance; - finalizableWithdrawnPoolCount++; + ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); + ICasimirPool.PoolConfig memory poolConfig = pool.getConfig(); + require( + poolConfig.status == ICasimirPool.PoolStatus.EXITING_FORCED || + poolConfig.status == ICasimirPool.PoolStatus.EXITING_REQUESTED, + "Pool not exiting" + ); + requestedCompletedExitReports -= 1; stakedPoolIds.remove(poolIndex); - delete pools[poolId]; + uint64[] memory operatorIds = poolConfig.operatorIds; + bytes memory publicKey = poolConfig.publicKey; + + totalDeposits--; + if (poolConfig.status == ICasimirPool.PoolStatus.EXITING_REQUESTED) { + requestedExits--; + } else if (poolConfig.status == ICasimirPool.PoolStatus.EXITING_FORCED) { + forcedExits--; + } + pool.setStatus(ICasimirPool.PoolStatus.WITHDRAWN); + pool.withdrawBalance(blamePercents); ssvNetwork.removeValidator(publicKey, operatorIds, cluster); - emit PoolExited(poolId); + emit ExitCompleted(poolId); } /** @@ -688,38 +745,23 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @dev Process fees - * @param amount The amount of ETH to process - * @return linkFees The amount of swapped LINK fees - * @return ssvFees The amount of swapped SSV fees + * @dev Process reserved fees to a given token + * @param amount The amount to process + * @param tokenOut The output token address + * @return amountOut The output token amount out */ function processFees( - uint256 amount - ) private returns (uint256 linkFees, uint256 ssvFees) { + uint256 amount, + address tokenOut + ) private returns (uint256 amountOut) { + reservedFeeBalance -= amount; wrapFees(amount); - - (uint256 swappedLINK, uint256 unswappedLINK) = swapFees( - tokenAddresses[Token.WETH], - tokenAddresses[Token.LINK], - Math.mulDiv(amount, linkFeePercent, feePercent) - ); - linkFees = swappedLINK; - unswappedTokens[tokenAddresses[Token.LINK]] += unswappedLINK; - - (uint256 swappedSSV, uint256 unswappedSSV) = swapFees( - tokenAddresses[Token.WETH], - tokenAddresses[Token.SSV], - Math.mulDiv(amount, ssvFeePercent, feePercent) - ); - ssvFees = swappedSSV; - unswappedTokens[tokenAddresses[Token.SSV]] += unswappedSSV; + amountOut = swapFees(amount, tokenOut); } - /** - * @dev Deposit WETH to use ETH in swaps - * @param amount The amount of ETH to deposit - */ - function wrapFees(uint256 amount) private { + function wrapFees( + uint256 amount + ) private { IWETH9 wethToken = IWETH9(tokenAddresses[Token.WETH]); wethToken.deposit{value: amount}(); wethToken.approve( @@ -728,63 +770,29 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ); } - /** - * @dev Swap token in for token out - * @param tokenIn The token to swap in - * @param tokenOut The token to swap out - * @param amountIn The amount of token in - */ function swapFees( - address tokenIn, - address tokenOut, - uint256 amountIn - ) private returns (uint256 amountOut, uint256 amountUnswapped) { + uint256 amount, + address tokenOut + ) private returns (uint256 amountOut) { address swapPool = swapFactory.getPool( - tokenIn, + tokenAddresses[Token.WETH], tokenOut, uniswapFeeTier ); uint256 liquidity = IUniswapV3PoolState(swapPool).liquidity(); - if (liquidity < amountIn) { - amountUnswapped = amountIn - liquidity; - amountIn = liquidity; - } - if (amountIn > 0) { - ISwapRouter.ExactInputSingleParams memory params = ISwapRouter - .ExactInputSingleParams({ - tokenIn: tokenIn, - tokenOut: tokenOut, - fee: uniswapFeeTier, - recipient: address(this), - deadline: block.timestamp, - amountIn: amountIn, - amountOutMinimum: 0, - sqrtPriceLimitX96: 0 - }); - amountOut = swapRouter.exactInputSingle(params); - } - } - - /** - * @dev Update fee percentages - * @param _ethFeePercent The new ETH fee percentage - * @param _linkFeePercent The new LINK fee percentage - * @param _ssvFeePercent The new SSV fee percentage - */ - function setFeePercents( - uint32 _ethFeePercent, - uint32 _linkFeePercent, - uint32 _ssvFeePercent - ) external onlyOwner { - require( - _ethFeePercent + _linkFeePercent + _ssvFeePercent == - getFeePercent(), - "Total fee percentage must remain the same" - ); - - ethFeePercent = _ethFeePercent; - linkFeePercent = _linkFeePercent; - ssvFeePercent = _ssvFeePercent; + require(liquidity >= amount, "Not enough liquidity"); + + ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({ + tokenIn: tokenAddresses[Token.WETH], + tokenOut: tokenOut, + fee: uniswapFeeTier, + recipient: address(this), + deadline: block.timestamp, + amountIn: amount, + amountOutMinimum: 0, + sqrtPriceLimitX96: 0 + }); + amountOut = swapRouter.exactInputSingle(params); } /** @@ -818,7 +826,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { totalStake = getBufferedBalance() + latestActiveBalanceAfterFees - - pendingWithdrawals; + requestedWithdrawalBalance; } /** @@ -858,22 +866,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Get the reserved fees - * @return reservedFees The reserved fees + * @notice Get the reserved fee balance + * @return reservedFeeBalance The reserved fee balance */ - function getReservedFees() public view returns (uint256) { - return reservedFees; - } - - /** - * @notice Get the swept balance - * @return balance The swept balance - */ - function getSweptBalance() public view returns (uint256 balance) { - balance = - address(this).balance - - getBufferedBalance() - - getReservedFees(); + function getReservedFeeBalance() public view returns (uint256) { + return reservedFeeBalance; } /** @@ -913,39 +910,27 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Get the latest active rewards - * @return latestRewards The latest active rewards + * @notice Get the latest active reward balance + * @return latestActiveRewardBalance The latest active reward balance */ - function getLatestActiveRewards() public view returns (int256) { - return latestRewards; + function getLatestActiveRewardBalance() public view returns (int256) { + return latestActiveRewardBalance; } /** - * @notice Get the finalizable withdrawn balance of the current reporting period - * @return reportFinalizableWithdrawnBalance The finalizable withdrawn balance of the current reporting period + * @notice Get the finalizable exited balance of the current reporting period + * @return finalizableExitedBalance The finalizable exited balance of the current reporting period */ - function getReportFinalizableWithdrawnBalance() public view returns (uint256) { - return reportFinalizableWithdrawnBalance; + function getFinalizableExitedBalance() public view returns (uint256) { + return finalizableExitedBalance; } /** - * @notice Get the finalizable withdrawn pool count of the current reporting period - * @return finalizableWithdrawnPoolCount The finalizable withdrawn pool count of the current reporting period + * @notice Get the finalizable completed exit count of the current reporting period + * @return finalizableCompletedExits The finalizable completed exit count of the current reporting period */ - function getFinalizableWithdrawnPoolCount() public view returns (uint256) { - return finalizableWithdrawnPoolCount; - } - - /** - * @notice Get the pending withdrawal queue - * @return pendingWithdrawalQueue The pending withdrawal queue - */ - function getPendingWithdrawalQueue() - public - view - returns (Withdrawal[] memory) - { - return pendingWithdrawalQueue; + function getFinalizableCompletedExits() public view returns (uint256) { + return finalizableCompletedExits; } /** @@ -956,26 +941,26 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint256 index, uint256 period ) public view returns (bool) { - if (pendingWithdrawalCount > index) { - return pendingWithdrawalQueue[index].period <= period; + if (requestedWithdrawals > index) { + return requestedWithdrawalQueue[index].period <= period; } return false; } /** - * @notice Get the total pending withdrawals - * @return pendingWithdrawals The total pending withdrawals + * @notice Get the total pending user withdrawal amount + * @return requestedWithdrawalBalance The total pending user withdrawal amount */ - function getPendingWithdrawals() public view returns (uint256) { - return pendingWithdrawals; + function getPendingWithdrawalBalance() public view returns (uint256) { + return requestedWithdrawalBalance; } /** * @notice Get the total pending withdrawal count - * @return pendingWithdrawalCount The total pending withdrawal count + * @return requestedWithdrawals The total pending withdrawal count */ - function getPendingWithdrawalCount() public view returns (uint256) { - return pendingWithdrawalCount; + function getPendingWithdrawals() public view returns (uint256) { + return requestedWithdrawals; } /** @@ -986,22 +971,20 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { return feePercent; } - // External view functions - /** - * @notice Get the count of active pools - * @return depositedPoolCount The count of active pools + * @notice Get the count of deposited pools + * @return totalDeposits The count of deposited pools */ - function getDepositedPoolCount() external view returns (uint256) { - return depositedPoolCount; + function getTotalDeposits() external view returns (uint256) { + return totalDeposits; } /** - * @notice Get the count of exiting pools - * @return exitingPoolCount The count of exiting pools + * @notice Get the count of pools requested to exit + * @return requestedExits The count of pools requested to exit */ - function getExitingPoolCount() external view returns (uint256) { - return exitingPoolCount; + function getRequestedExits() external view returns (uint256) { + return requestedExits; } /** @@ -1037,36 +1020,39 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Get a pool by ID + * @notice Get a pool's address by ID * @param poolId The pool ID - * @return pool The pool details - */ - function getPool(uint32 poolId) external view returns (Pool memory pool) { - pool = pools[poolId]; - } - - /** - * @notice Get the ETH fee percentage to charge on each deposit - * @return ethFeePercent The ETH fee percentage to charge on each deposit + * @return poolAddress The pool address */ - function getETHFeePercent() external view returns (uint32) { - return ethFeePercent; + function getPoolAddress(uint32 poolId) external view returns (address) { + return poolAddresses[poolId]; } /** - * @notice Get the LINK fee percentage to charge on each deposit - * @return linkFeePercent The LINK fee percentage to charge on each deposit + * @notice Get a pool's details by ID + * @param poolId The pool ID + * @return poolDetails The pool details */ - function getLINKFeePercent() external view returns (uint32) { - return linkFeePercent; + function getPoolDetails(uint32 poolId) external view returns (PoolDetails memory poolDetails) { + if (poolAddresses[poolId] != address(0)) { + ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); + ICasimirPool.PoolConfig memory poolConfig = pool.getConfig(); + poolDetails = PoolDetails({ + id: poolId, + balance: pool.getBalance(), + publicKey: poolConfig.publicKey, + operatorIds: poolConfig.operatorIds, + status: poolConfig.status + }); + } } /** - * @notice Get the SSV fee percentage to charge on each deposit - * @return ssvFeePercent The SSV fee percentage to charge on each deposit + * @notice Get the registry address + * @return registryAddress The registry address */ - function getSSVFeePercent() external view returns (uint32) { - return ssvFeePercent; + function getRegistryAddress() external view returns (address registryAddress) { + registryAddress = address(registry); } /** @@ -1076,4 +1062,42 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function getUpkeepAddress() external view returns (address upkeepAddress) { upkeepAddress = address(upkeep); } + + /** + * @notice Get the swept balance + * @dev Should be called off-chain + * @return balance The swept balance + */ + function getSweptBalance() public view returns (uint256 balance) { + for (uint256 i = 0; i < pendingPoolIds.length; i++) { + uint32 poolId = pendingPoolIds[i]; + ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); + balance += pool.getBalance(); + } + for (uint256 i = 0; i < stakedPoolIds.length; i++) { + uint32 poolId = stakedPoolIds[i]; + ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); + balance += pool.getBalance(); + } + } + + /** + * @notice Get the next five compoundable pool IDs + * @dev Should be called off-chain + * @return poolIds The next five compoundable pool IDs + */ + function getCompoundablePoolIds() external view returns (uint32[5] memory poolIds) { + uint256 count = 0; + for (uint256 i = 0; i < stakedPoolIds.length; i++) { + uint32 poolId = stakedPoolIds[i]; + ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); + if (pool.getBalance() >= compoundMinimum) { + poolIds[count] = poolId; + count++; + if (count == 5) { + break; + } + } + } + } } diff --git a/contracts/ethereum/src/CasimirPool.sol b/contracts/ethereum/src/CasimirPool.sol new file mode 100644 index 000000000..7d443eb3e --- /dev/null +++ b/contracts/ethereum/src/CasimirPool.sol @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; + +import './interfaces/ICasimirPool.sol'; +import './interfaces/ICasimirManager.sol'; +import './interfaces/ICasimirRegistry.sol'; +import "@openzeppelin/contracts/utils/math/Math.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; + +// Dev-only imports +import "hardhat/console.sol"; + +/** + * @title Pool contract that accepts deposits and stakes a validator + */ +contract CasimirPool is ICasimirPool, Ownable, ReentrancyGuard { + + uint256 poolCapacity = 32 ether; + ICasimirManager private immutable manager; + ICasimirRegistry private immutable registry; + PoolConfig private config; + + constructor( + address registryAddress, + uint32 poolId, + bytes memory publicKey, + uint64[] memory operatorIds + ) { + manager = ICasimirManager(msg.sender); + registry = ICasimirRegistry(registryAddress); + config.poolId = poolId; + config.publicKey = publicKey; + config.operatorIds = operatorIds; + } + + function depositRewards() external onlyOwner { + uint256 balance = address(this).balance; + manager.depositRewards{value: balance}(); + } + + function withdrawBalance(uint32[] memory blamePercents) external onlyOwner { + require(config.status == PoolStatus.WITHDRAWN, "Pool must be withdrawn"); + + uint256 balance = address(this).balance; + uint256 rewards = poolCapacity - balance; + if (rewards > 0) { + manager.depositRewards{value: rewards}(); + } + uint256 exitedBalance = balance - rewards; + uint256 lostBalance = poolCapacity - exitedBalance; + for (uint256 i = 0; i < blamePercents.length; i++) { + uint256 blameAmount; + if (lostBalance > 0) { + uint256 blamePercent = blamePercents[i]; + blameAmount = Math.mulDiv(lostBalance, blamePercent, 100); + } + registry.removeActivePool(config.poolId, config.operatorIds[i], blameAmount); + } + + manager.depositExitedBalance{value: balance}(config.poolId); + } + + function setOperatorIds(uint64[] memory operatorIds) external onlyOwner { + config.operatorIds = operatorIds; + } + + function setStatus(PoolStatus status) external onlyOwner { + config.status = status; + } + + function getBalance() external view returns (uint256) { + return address(this).balance; + } + + function getConfig() external view override returns (PoolConfig memory) { + return config; + } + + function getOperatorIds() external view returns (uint64[] memory) { + return config.operatorIds; + } + + function getPublicKey() external view returns (bytes memory) { + return config.publicKey; + } + + function getStatus() external view returns (PoolStatus) { + return config.status; + } +} \ No newline at end of file diff --git a/contracts/ethereum/src/CasimirRecipient.sol b/contracts/ethereum/src/CasimirRecipient.sol deleted file mode 100644 index 296d6c4e6..000000000 --- a/contracts/ethereum/src/CasimirRecipient.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: Apache -pragma solidity 0.8.18; - -import "./interfaces/ICasimirRecipient.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; -import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; - -// Dev-only imports -import "hardhat/console.sol"; - -/** - * @title Recipient contract that distributes validator execution fee rewards - */ -contract CasimirRecipient is Ownable, ReentrancyGuard, ICasimirRecipient { - uint256 private rewards; - - receive() external payable nonReentrant { - rewards += msg.value; - } -} \ No newline at end of file diff --git a/contracts/ethereum/src/CasimirRegistry.sol b/contracts/ethereum/src/CasimirRegistry.sol index 80e4ed2e6..009195815 100644 --- a/contracts/ethereum/src/CasimirRegistry.sol +++ b/contracts/ethereum/src/CasimirRegistry.sol @@ -1,14 +1,15 @@ // SPDX-License-Identifier: Apache pragma solidity 0.8.18; -import './interfaces/ICasimirManager.sol'; import './interfaces/ICasimirRegistry.sol'; +import './interfaces/ICasimirManager.sol'; import './libraries/Types.sol'; import './vendor/interfaces/ISSVNetworkViews.sol'; +import "@openzeppelin/contracts/access/Ownable.sol"; // Todo efficiently reshare or exit pools when deregistering -contract CasimirRegistry is ICasimirRegistry { +contract CasimirRegistry is ICasimirRegistry, Ownable { using TypesAddress for address; ICasimirManager private manager; @@ -18,8 +19,20 @@ contract CasimirRegistry is ICasimirRegistry { uint256 totalCollateral; mapping(uint64 => Operator) private operators; - constructor(address managerAddress, address ssvNetworkViewsAddress) { - manager = ICasimirManager(managerAddress); + /*************/ + /* Modifiers */ + /*************/ + + /** + * @dev Validate the caller is the authorized pool + */ + modifier onlyPool(uint32 poolId) { + require(msg.sender == manager.getPoolAddress(poolId), "Only authorized pool can call this function"); + _; + } + + constructor(address ssvNetworkViewsAddress) { + manager = ICasimirManager(msg.sender); ssvNetworkViews = ISSVNetworkViews(ssvNetworkViewsAddress); } @@ -33,12 +46,9 @@ contract CasimirRegistry is ICasimirRegistry { require(msg.sender == operatorOwner, "Only operator owner can register"); totalCollateral += msg.value; - operators[operatorId] = Operator({ - id: operatorId, - collateral: int256(msg.value), - poolCount: 0, - deregistering: false - }); + Operator storage operator = operators[operatorId]; + operator.active = true; + operator.collateral = int256(msg.value); emit OperatorRegistered(operatorId); } @@ -55,16 +65,14 @@ contract CasimirRegistry is ICasimirRegistry { operator.deregistering = true; - emit OperatorDeregistrationRequested(operatorId); - - // Now the oracle reshares or exits their pools as needed then deregisters + emit DeregistrationRequested(operatorId); } /** * @notice Deregister an operator from the set * @param operatorId The operator ID */ - function completeOperatorDeregistration(uint64 operatorId) external { + function deregisterOperator(uint64 operatorId) external { require(msg.sender == address(manager), "Only manager can deregister operators"); Operator storage operator = operators[operatorId]; require(operator.collateral >= 0, "Operator owes collateral"); @@ -77,7 +85,7 @@ contract CasimirRegistry is ICasimirRegistry { operatorOwner.send(uint256(operator.collateral)); } - emit OperatorDeregistrationCompleted(operatorId); + emit DeregistrationCompleted(operatorId); } /** @@ -87,7 +95,6 @@ contract CasimirRegistry is ICasimirRegistry { function depositCollateral(uint64 operatorId) external payable { require(msg.value > minimumCollateralDeposit, "Insufficient collateral deposit"); Operator storage operator = operators[operatorId]; - require(operator.id != 0, "Operator is not registered"); (address operatorOwner, , , ,) = ssvNetworkViews.getOperatorById(operatorId); require(msg.sender == operatorOwner, "Only operator owner can deposit collateral"); @@ -95,17 +102,44 @@ contract CasimirRegistry is ICasimirRegistry { } /** - * @notice Set the collateral for an operator + * @notice Add an active pool to an operator + * @param poolId The pool ID * @param operatorId The operator ID - * @param collateral The collateral */ - function setOperatorCollateral(uint64 operatorId, int256 collateral) external { - require(msg.sender == address(manager), "Only manager can set operator collateral"); - + function addActivePool(uint32 poolId, uint64 operatorId) external onlyOwner { Operator storage operator = operators[operatorId]; - operator.collateral = collateral; + require(operator.active, "Operator is not active"); + require(operator.collateral >= 0, "Operator owes collateral"); + require(!operator.deregistering, "Operator is deregistering"); + require(!operator.activePools[poolId], "Pool is already active for operator"); + operator.activePools[poolId] = true; + operator.poolCount += 1; } + /** + * @notice Remove an active pool from an operator + * @param poolId The pool ID + * @param operatorId The operator ID + * @param blameAmount The amount to recover from collateral + */ + function removeActivePool(uint32 poolId, uint64 operatorId, uint256 blameAmount) external onlyPool(poolId) { + Operator storage operator = operators[operatorId]; + require(operator.activePools[poolId], "Pool is not active for operator"); + + operator.activePools[poolId] = false; + operator.poolCount -= 1; + + if (blameAmount > 0) { + uint256 recoverableCollateral; + if (operator.collateral >= int256(blameAmount)) { + recoverableCollateral = blameAmount; + } else if (operator.collateral > 0) { + recoverableCollateral = uint256(operator.collateral); + } + operator.collateral -= int256(blameAmount); + manager.depositRecoveredBalance{value: recoverableCollateral}(poolId); + } + } /** * @notice Get the collateral for an operator diff --git a/contracts/ethereum/src/CasimirUpkeep.sol b/contracts/ethereum/src/CasimirUpkeep.sol index bb136c83a..c7f11a84c 100644 --- a/contracts/ethereum/src/CasimirUpkeep.sol +++ b/contracts/ethereum/src/CasimirUpkeep.sol @@ -40,13 +40,11 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /********************/ /** Current report status */ - Status private reportStatus; + ReportStatus private reportStatus; /** Current report period */ uint256 reportPeriod; - /** Current report pending pool count */ - uint256 reportPendingPoolCount; - /** Current report exiting pool count */ - uint256 reportExitingPoolCount; + /** Current report remaining request count */ + uint256 reportRemainingRequests; /** Current report block */ uint256 reportRequestBlock; /** Current report request timestamp */ @@ -58,15 +56,17 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /** Current report deposit activations */ uint256 private reportActivatedDeposits; /** Current report unexpected exits */ - uint256 private reportUnexpectedExits; - /** Current report withdrawn exits */ - uint256 private reportWithdrawnExits; - /** Current report slashedExits */ - uint256 private reportSlashedExits; - /** Finalizable completed deposits */ - uint256 private reportFinalizableActivatedDeposits; + uint256 private reportForcedExits; + /** Current report completed exits */ + uint256 private reportCompletedExits; + /** Current report compoundable pools */ + uint32[5] reportCompoundablePoolIds; + /** Finalizable activated deposits */ + uint256 private finalizableActivatedDeposits; + /** Finalizable compoundable pools */ + uint32[5] finalizableCompoundablePoolIds; /** Current report request */ - bytes32 private reportRequestId; + mapping(bytes32 => RequestType) private reportRequests; /** Current report response error */ bytes private reportResponseError; /** Binary request source code */ @@ -76,35 +76,20 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /** Functions subscription ID */ uint64 private functionsSubscriptionId; - /*************/ - /* Modifiers */ - /*************/ - - /** - * @dev Verify a request ID - * @param requestId The request ID - */ - modifier validateRequestId(bytes32 requestId) { - require(requestId == reportRequestId, "Invalid request ID"); - _; - } - /***************/ /* Constructor */ /***************/ /** * Constructor - * @param managerAddress The manager contract address * @param functionsOracleAddress The functions oracle contract address * @param _functionsSubscriptionId The functions subscription ID */ constructor( - address managerAddress, address functionsOracleAddress, uint64 _functionsSubscriptionId ) FunctionsClient(functionsOracleAddress) { - manager = ICasimirManager(managerAddress); + manager = ICasimirManager(msg.sender); functionsSubscriptionId = _functionsSubscriptionId; } @@ -162,12 +147,12 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { override returns (bool upkeepNeeded, bytes memory) { - if (reportStatus == Status.FINALIZED) { - bool checkActive = manager.getDepositedPoolCount() > 0; + if (reportStatus == ReportStatus.FINALIZED) { + bool checkActive = manager.getTotalDeposits() > 0; bool heartbeatLapsed = (block.timestamp - reportTimestamp) >= reportHeartbeat; upkeepNeeded = checkActive && heartbeatLapsed; - } else if (reportStatus == Status.PROCESSING) { - bool finalizeReport = reportWithdrawnExits == manager.getFinalizableWithdrawnPoolCount(); + } else if (reportStatus == ReportStatus.PROCESSING) { + bool finalizeReport = reportCompletedExits == manager.getFinalizableCompletedExits(); upkeepNeeded = finalizeReport; } } @@ -179,48 +164,51 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { (bool upkeepNeeded, ) = checkUpkeep(""); require(upkeepNeeded, "Upkeep not needed"); - if (reportStatus == Status.FINALIZED) { - reportStatus = Status.REQUESTING; + if (reportStatus == ReportStatus.FINALIZED) { + reportStatus = ReportStatus.REQUESTING; reportRequestBlock = block.number; reportTimestamp = block.timestamp; reportPeriod = manager.getReportPeriod(); - reportPendingPoolCount = manager.getPendingPoolIds().length; - reportExitingPoolCount = manager.getExitingPoolCount(); - reportSweptBalance = manager.getSweptBalance(); Functions.Request memory req; - reportRequestId = sendRequest(req, functionsSubscriptionId, fulfillGasLimit); + reportRemainingRequests = 2; + for (uint256 i = 0; i < reportRemainingRequests; i++) { + bytes32 requestId = sendRequest(req, functionsSubscriptionId, fulfillGasLimit); + reportRequests[requestId] = RequestType(i + 1); + } } else { if ( - manager.getPendingWithdrawals() > 0 && + manager.getPendingWithdrawalBalance() > 0 && manager.getPendingWithdrawalEligibility(0, reportPeriod) && - manager.getPendingWithdrawals() <= manager.getWithdrawableBalance() + manager.getPendingWithdrawalBalance() <= manager.getWithdrawableBalance() ) { - manager.completePendingWithdrawals(5); + manager.fulfillWithdrawals(5); } - if (reportFinalizableActivatedDeposits > 0) { - uint256 maxActivatedDeposits = reportFinalizableActivatedDeposits > 5 ? 5 : reportFinalizableActivatedDeposits; - reportFinalizableActivatedDeposits -= maxActivatedDeposits; - manager.completePoolDeposits(maxActivatedDeposits); + if (finalizableActivatedDeposits > 0) { + uint256 maxActivatedDeposits = finalizableActivatedDeposits > 5 ? 5 : finalizableActivatedDeposits; + finalizableActivatedDeposits -= maxActivatedDeposits; + manager.activateDeposits(maxActivatedDeposits); } - if (!manager.getPendingWithdrawalEligibility(0, reportPeriod) && reportFinalizableActivatedDeposits == 0) { - reportStatus = Status.FINALIZED; + if (!manager.getPendingWithdrawalEligibility(0, reportPeriod) && finalizableActivatedDeposits == 0) { + reportStatus = ReportStatus.FINALIZED; manager.rebalanceStake({ activeBalance: reportActiveBalance, sweptBalance: reportSweptBalance, activatedDeposits: reportActivatedDeposits, - withdrawnExits: reportWithdrawnExits + completedExits: reportCompletedExits }); + manager.compoundRewards(reportCompoundablePoolIds); + reportActiveBalance = 0; reportActivatedDeposits = 0; - reportUnexpectedExits = 0; - reportSlashedExits = 0; - reportWithdrawnExits = 0; + reportForcedExits = 0; + reportCompletedExits = 0; + reportCompoundablePoolIds = [0, 0, 0, 0, 0]; } } @@ -238,37 +226,54 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { bytes32 requestId, bytes memory response, bytes memory _error - ) internal override validateRequestId(requestId) { - reportResponseError = _error; + ) internal override { + RequestType requestType = reportRequests[requestId]; + require(requestType != RequestType.NONE, "Invalid request ID"); + + reportResponseError = _error; // TODO: Handle error + if (_error.length == 0) { - reportStatus = Status.PROCESSING; - reportRequestId = bytes32(0); - ( - uint128 activeBalance, - uint32 activatedDeposits, - uint32 unexpectedExits, - uint32 slashedExits, - uint32 withdrawnExits - ) = abi.decode(response, (uint128, uint32, uint32, uint32, uint32)); - reportActiveBalance = uint256(activeBalance) * 1 gwei; - reportActivatedDeposits = activatedDeposits; - reportUnexpectedExits = unexpectedExits; - reportSlashedExits = slashedExits; - reportWithdrawnExits = withdrawnExits; - - reportFinalizableActivatedDeposits = activatedDeposits; - - if (reportUnexpectedExits > 0) { - manager.requestPoolUnexpectedExitReports(reportUnexpectedExits); - } - if (reportSlashedExits > 0) { - manager.requestPoolSlashedExitReports(reportSlashedExits); + delete reportRequests[requestId]; + reportRemainingRequests--; + + if (requestType == RequestType.BALANCES) { + ( + uint128 activeBalance, + uint128 sweptBalance + ) = abi.decode(response, (uint128, uint128)); + + reportActiveBalance = uint256(activeBalance); + reportSweptBalance = uint256(sweptBalance); + } else { + ( + uint32 activatedDeposits, + uint32 unexpectedExits, + uint32 completedExits, + uint32[5] memory compoundablePools + ) = abi.decode(response, (uint32, uint32, uint32, uint32[5])); + + reportActivatedDeposits = activatedDeposits; + reportForcedExits = unexpectedExits; + reportCompletedExits = completedExits; + reportCompoundablePoolIds = compoundablePools; + + finalizableActivatedDeposits = activatedDeposits; + finalizableCompoundablePoolIds = compoundablePools; } - if (reportWithdrawnExits > 0) { - manager.requestPoolWithdrawnExitReports(reportWithdrawnExits); + if (reportRemainingRequests == 0) { + reportStatus = ReportStatus.PROCESSING; + + if (reportForcedExits > 0) { + manager.requestForcedExitReports(reportForcedExits); + } + + if (reportCompletedExits > 0) { + manager.requestCompletedExitReports(reportCompletedExits); + } } + } emit OCRResponse(requestId, response, _error); @@ -288,19 +293,19 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { * @notice Encode the response for testing * @param activeBalance Active balance * @param activatedDeposits Count of new deposits - * @param withdrawnExits Count of new exits + * @param completedExits Count of new exits * @param slashedExits Count of new slashedExits */ function encodeResponse( uint128 activeBalance, uint32 activatedDeposits, - uint32 withdrawnExits, + uint32 completedExits, uint32 slashedExits ) external pure returns (bytes memory) { return abi.encode( activeBalance, activatedDeposits, - withdrawnExits, + completedExits, slashedExits ); } diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index 2881cfbc4..b8e1c39ec 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -1,29 +1,31 @@ // SPDX-License-Identifier: Apache pragma solidity 0.8.18; +import './ICasimirPool.sol'; import "../vendor/interfaces/ISSVNetwork.sol"; interface ICasimirManager { + /***************/ + /* Enumerators */ + /***************/ + + /** Token abbreviation */ + enum Token { + LINK, + SSV, + WETH + } + /***********/ /* Structs */ /***********/ - struct ProcessedDeposit { - uint256 ethAmount; - uint256 linkAmount; - uint256 ssvAmount; - } - - struct Pool { - uint256 deposits; - bool exiting; - bool slashed; - bytes32 depositDataRoot; + struct PoolDetails { + uint32 id; + uint256 balance; bytes publicKey; - bytes signature; - bytes withdrawalCredentials; uint64[] operatorIds; - bytes shares; + ICasimirPool.PoolStatus status; } struct User { @@ -42,21 +44,22 @@ interface ICasimirManager { /**********/ event DepositRequested(uint32 poolId); - event PoolDepositInitiated(uint32 poolId); - event PoolDeposited(uint32 poolId); + event DepositInitiated(uint32 poolId); + event DepositActivated(uint32 poolId); event ReshareRequested(uint32 poolId); - event PoolReshared(uint32 poolId); - event PoolExitRequested(uint32 poolId); - event UnexpectedExitReportsRequested(uint256 count); + event ReshareCompleted(uint32 poolId); + event ExitRequested(uint32 poolId); + event ForcedExitReportsRequested(uint256 count); event SlashedExitReportsRequested(uint256 count); - event WithdrawnExitReportsRequested(uint256 count); - event PoolExited(uint32 poolId); + event CompletedExitReportsRequested(uint256 count); + event ExitCompleted(uint32 poolId); event StakeDeposited(address sender, uint256 amount); event StakeRebalanced(uint256 amount); event RewardsDeposited(uint256 amount); + event TipsDeposited(uint256 amount); event WithdrawalRequested(address sender, uint256 amount); event WithdrawalInitiated(address sender, uint256 amount); - event WithdrawalCompleted(address sender, uint256 amount); + event WithdrawalFulfilled(address sender, uint256 amount); /*************/ /* Functions */ @@ -64,18 +67,26 @@ interface ICasimirManager { function depositStake() external payable; + function depositRewards() external payable; + function rebalanceStake( uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, - uint256 withdrawnExits + uint256 completedExits ) external; + function compoundRewards(uint32[5] memory poolIds) external; + + function depositExitedBalance(uint32 poolId) external payable; + + function depositRecoveredBalance(uint32 poolId) external payable; + function requestWithdrawal(uint256 amount) external; - function completePendingWithdrawals(uint256 count) external; + function fulfillWithdrawals(uint256 count) external; - function initiatePoolDeposit( + function initiateDeposit( bytes32 depositDataRoot, bytes calldata publicKey, bytes calldata signature, @@ -86,39 +97,28 @@ interface ICasimirManager { uint256 feeAmount ) external; - function completePoolDeposits(uint256 count) external; + function activateDeposits(uint256 count) external; - function requestPoolUnexpectedExitReports(uint256 count) external; + function requestForcedExitReports(uint256 count) external; - function requestPoolSlashedExitReports(uint256 count) external; + function requestCompletedExitReports(uint256 count) external; - function requestPoolWithdrawnExitReports(uint256 count) external; - - function completePoolExit( + function reportCompletedExit( uint256 poolIndex, - uint256 finalEffectiveBalance, uint32[] memory blamePercents, ISSVNetworkCore.Cluster memory cluster ) external; - function setFeePercents(uint32 ethFeePercent, uint32 linkFeePercent, uint32 ssvFeePercent) external; - function setFunctionsAddress(address functionsAddress) external; function getFeePercent() external view returns (uint32); - function getETHFeePercent() external view returns (uint32); - - function getLINKFeePercent() external view returns (uint32); - - function getSSVFeePercent() external view returns (uint32); - - function getDepositedPoolCount() + function getTotalDeposits() external view returns (uint256); - function getExitingPoolCount() + function getRequestedExits() external view returns (uint256); @@ -137,9 +137,9 @@ interface ICasimirManager { function getReportPeriod() external view returns (uint32); - function getFinalizableWithdrawnPoolCount() external view returns (uint256); + function getFinalizableCompletedExits() external view returns (uint256); - function getReportFinalizableWithdrawnBalance() external view returns (uint256); + function getFinalizableExitedBalance() external view returns (uint256); function getLatestActiveBalance() external view returns (uint256); @@ -155,9 +155,15 @@ interface ICasimirManager { function getUserStake(address userAddress) external view returns (uint256); - function getPendingWithdrawalQueue() external view returns (Withdrawal[] memory); + function getPendingWithdrawalBalance() external view returns (uint256); function getPendingWithdrawals() external view returns (uint256); - function getPendingWithdrawalCount() external view returns (uint256); + function getPoolAddress(uint32 poolId) external view returns (address); + + function getPoolDetails(uint32 poolId) external view returns (PoolDetails memory); + + function getRegistryAddress() external view returns (address); + + function getUpkeepAddress() external view returns (address); } diff --git a/contracts/ethereum/src/interfaces/ICasimirPool.sol b/contracts/ethereum/src/interfaces/ICasimirPool.sol new file mode 100644 index 000000000..05bc4b971 --- /dev/null +++ b/contracts/ethereum/src/interfaces/ICasimirPool.sol @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; + +interface ICasimirPool { + /***********/ + /* Structs */ + /***********/ + + /** Pool config */ + struct PoolConfig { + uint32 poolId; + bytes publicKey; + uint64[] operatorIds; + PoolStatus status; + } + + /** Pool status */ + enum PoolStatus { + PENDING, + ACTIVE, + EXITING_FORCED, + EXITING_REQUESTED, + WITHDRAWN + } + + /*************/ + /* Functions */ + /*************/ + + function depositRewards() external; + + function withdrawBalance(uint32[] memory blamePercents) external; + + function setOperatorIds(uint64[] memory operatorIds) external; + + function setStatus(PoolStatus status) external; + + function getBalance() external view returns (uint256); + + function getConfig() external view returns (PoolConfig memory); + + function getOperatorIds() external view returns (uint64[] memory); + + function getPublicKey() external view returns (bytes memory); + + function getStatus() external view returns (PoolStatus); +} \ No newline at end of file diff --git a/contracts/ethereum/src/interfaces/ICasimirRecipient.sol b/contracts/ethereum/src/interfaces/ICasimirRecipient.sol deleted file mode 100644 index 99267604d..000000000 --- a/contracts/ethereum/src/interfaces/ICasimirRecipient.sol +++ /dev/null @@ -1,4 +0,0 @@ -// SPDX-License-Identifier: Apache -pragma solidity 0.8.18; - -interface ICasimirRecipient {} \ No newline at end of file diff --git a/contracts/ethereum/src/interfaces/ICasimirRegistry.sol b/contracts/ethereum/src/interfaces/ICasimirRegistry.sol index 2651deee5..b520b7dd7 100644 --- a/contracts/ethereum/src/interfaces/ICasimirRegistry.sol +++ b/contracts/ethereum/src/interfaces/ICasimirRegistry.sol @@ -1,15 +1,18 @@ // SPDX-License-Identifier: Apache pragma solidity 0.8.18; +import './ICasimirManager.sol'; + interface ICasimirRegistry { event OperatorRegistered(uint64 operatorId); - event OperatorDeregistrationRequested(uint64 operatorId); - event OperatorDeregistrationCompleted(uint64 operatorId); + event DeregistrationRequested(uint64 operatorId); + event DeregistrationCompleted(uint64 operatorId); struct Operator { - uint64 id; + bool active; int256 collateral; uint256 poolCount; + mapping(uint32 => bool active) activePools; bool deregistering; } @@ -17,11 +20,13 @@ interface ICasimirRegistry { function requestOperatorDeregistration(uint64 operatorId) external; - function completeOperatorDeregistration(uint64 operatorId) external; + function deregisterOperator(uint64 operatorId) external; function depositCollateral(uint64 operatorId) external payable; - function setOperatorCollateral(uint64 operatorId, int256 collateral) external; + function addActivePool(uint32 poolId, uint64 operatorId) external; + + function removeActivePool(uint32 poolId, uint64 operatorId, uint256 blameAmount) external; function getOperatorCollateral(uint64 operatorId) external view returns (int256); } \ No newline at end of file diff --git a/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol b/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol index 08ad49b68..507363229 100644 --- a/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol +++ b/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol @@ -8,8 +8,15 @@ interface ICasimirUpkeep is AutomationCompatibleInterface { /* Enumerators */ /***************/ - /** Upkeep statuses */ - enum Status { + /** Request type */ + enum RequestType { + NONE, + BALANCES, + DETAILS + } + + /** Report status */ + enum ReportStatus { FINALIZED, REQUESTING, PROCESSING @@ -20,7 +27,7 @@ interface ICasimirUpkeep is AutomationCompatibleInterface { /**********/ event OCRResponse(bytes32 indexed requestId, bytes result, bytes err); - event UpkeepPerformed(Status status); + event UpkeepPerformed(ReportStatus status); /*************/ /* Functions */ diff --git a/contracts/ethereum/src/vendor/SSVNetwork.sol b/contracts/ethereum/src/vendor/SSVNetwork.sol deleted file mode 100644 index 797b3824a..000000000 --- a/contracts/ethereum/src/vendor/SSVNetwork.sol +++ /dev/null @@ -1,4 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity 0.8.18; - -import "../../scripts/resources/ssv-network/contracts/SSVNetwork.sol"; \ No newline at end of file diff --git a/contracts/ethereum/src/vendor/SSVNetworkViews.sol b/contracts/ethereum/src/vendor/SSVNetworkViews.sol deleted file mode 100644 index 9e36a3f52..000000000 --- a/contracts/ethereum/src/vendor/SSVNetworkViews.sol +++ /dev/null @@ -1,4 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity 0.8.18; - -import "../../scripts/resources/ssv-network/contracts/SSVNetworkViews.sol"; \ No newline at end of file diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index e5664ea8d..649c87b9f 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -1,11 +1,12 @@ -import { ethers } from 'hardhat' +import { ethers, network } from 'hardhat' import { loadFixture, time, setBalance } from '@nomicfoundation/hardhat-network-helpers' import { deployContract } from '@casimir/ethereum/helpers/deploy' -import { CasimirManager, CasimirUpkeep } from '@casimir/ethereum/build/artifacts/types' -import { fulfillReportRequest, runUpkeep } from '@casimir/ethereum/helpers/upkeep' -import { initiatePoolDepositHandler, completePoolExitHandler } from '@casimir/ethereum/helpers/oracle' +import { CasimirManager, CasimirRegistry, CasimirUpkeep, ISSVNetworkViews } from '@casimir/ethereum/build/artifacts/types' +import { fulfillReport, runUpkeep } from '@casimir/ethereum/helpers/upkeep' +import { initiateDepositHandler, reportCompletedExitsHandler } from '@casimir/ethereum/helpers/oracle' import { round } from '@casimir/ethereum/helpers/math' import { ContractConfig, DeploymentConfig } from '@casimir/types' +import ISSVNetworkViewsJson from '@casimir/ethereum/build/artifacts/scripts/resources/ssv-network/contracts/ISSVNetworkViews.sol/ISSVNetworkViews.json' /** Fixture to deploy SSV manager contract */ export async function deploymentFixture() { @@ -20,6 +21,7 @@ export async function deploymentFixture() { functionsSubscriptionId: process.env.FUNCTIONS_SUBSCRIPTION_ID, linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, + ssvNetworkViewsAddress: process.env.SSV_NETWORK_VIEWS_ADDRESS, ssvTokenAddress: process.env.SSV_TOKEN_ADDRESS, swapFactoryAddress: process.env.SWAP_FACTORY_ADDRESS, swapRouterAddress: process.env.SWAP_ROUTER_ADDRESS, @@ -64,7 +66,23 @@ export async function deploymentFixture() { } const manager = await ethers.getContractAt('CasimirManager', config.CasimirManager.address as string) as CasimirManager + const registry = await ethers.getContractAt('CasimirRegistry', await manager.getRegistryAddress()) as CasimirRegistry const upkeep = await ethers.getContractAt('CasimirUpkeep', await manager.getUpkeepAddress()) as CasimirUpkeep + const ssvNetworkViews = await ethers.getContractAt(ISSVNetworkViewsJson.abi, process.env.SSV_NETWORK_VIEWS_ADDRESS as string) as ISSVNetworkViews + + for (const operatorId of [1, 2, 3, 4]) { + const [ operatorOwnerAddress ] = await ssvNetworkViews.getOperatorById(operatorId) + const currentBalance = await ethers.provider.getBalance(operatorOwnerAddress) + const nextBalance = currentBalance.add(ethers.utils.parseEther('4')) + await setBalance(operatorOwnerAddress, nextBalance) + await network.provider.request({ + method: 'hardhat_impersonateAccount', + params: [operatorOwnerAddress] + }) + const operatorSigner = ethers.provider.getSigner(operatorOwnerAddress) + const result = await registry.connect(operatorSigner).registerOperator(operatorId, { value: ethers.utils.parseEther('4') }) + await result.wait() + } return { manager: manager as CasimirManager, upkeep: upkeep as CasimirUpkeep, owner, keeper, oracle } } @@ -91,7 +109,7 @@ export async function secondUserDepositFixture() { await deposit.wait() const nextPoolId = 1 - await initiatePoolDepositHandler({ manager, signer: oracle, args: { poolId: nextPoolId } }) + await initiateDepositHandler({ manager, signer: oracle, args: { poolId: nextPoolId } }) await time.increase(time.duration.days(1)) @@ -100,12 +118,13 @@ export async function secondUserDepositFixture() { let requestId = 0 const nextValues = { activeBalance: 32, + sweptBalance: 0, activatedDeposits: 1, - unexpectedExits: 0, - slashedExits: 0, - withdrawnExits: 0 + forcedExits: 0, + completedExits: 0, + compoundablePoolIds: [0, 0, 0, 0, 0] } - requestId = await fulfillReportRequest({ + requestId = await fulfillReport({ upkeep, keeper, values: nextValues, @@ -128,12 +147,13 @@ export async function rewardsPostSecondUserDepositFixture() { let requestId = latestRequestId const nextValues = { activeBalance: 32.105, + sweptBalance: 0, activatedDeposits: 0, - unexpectedExits: 0, - slashedExits: 0, - withdrawnExits: 0 + forcedExits: 0, + completedExits: 0, + compoundablePoolIds: [0, 0, 0, 0, 0] } - requestId = await fulfillReportRequest({ + requestId = await fulfillReport({ upkeep, keeper, values: nextValues, @@ -150,23 +170,33 @@ export async function sweepPostSecondUserDepositFixture() { const { manager, upkeep, owner, firstUser, secondUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(secondUserDepositFixture) const sweptRewards = 0.105 - const currentBalance = await ethers.provider.getBalance(manager.address) - const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptRewards.toString())) - await setBalance(manager.address, nextBalance) + const stakedPoolIds = await manager.getStakedPoolIds() + for (const poolId of stakedPoolIds) { + const poolAddress = await manager.getPoolAddress(poolId) + const poolSweptRewards = sweptRewards / stakedPoolIds.length + const currentBalance = await ethers.provider.getBalance(poolAddress) + const nextBalance = currentBalance.add(ethers.utils.parseEther(poolSweptRewards.toString())) + await setBalance(poolAddress, nextBalance) + } await time.increase(time.duration.days(1)) await runUpkeep({ upkeep, keeper }) let requestId = latestRequestId + const compoundablePoolIds = [0, 0, 0, 0, 0] + for (let i = 0; i < compoundablePoolIds.length; i++) { + if (i < stakedPoolIds.length) compoundablePoolIds[i] = stakedPoolIds[i] + } const nextValues = { activeBalance: 32, + sweptBalance: sweptRewards, activatedDeposits: 0, - unexpectedExits: 0, - slashedExits: 0, - withdrawnExits: 0 + forcedExits: 0, + completedExits: 0, + compoundablePoolIds } - requestId = await fulfillReportRequest({ + requestId = await fulfillReport({ upkeep, keeper, values: nextValues, @@ -189,7 +219,7 @@ export async function thirdUserDepositFixture() { const readyPools = await manager.getReadyPoolIds() const nextPoolId = readyPools[readyPools.length - 1] - await initiatePoolDepositHandler({ manager, signer: oracle, args: { poolId: nextPoolId } }) + await initiateDepositHandler({ manager, signer: oracle, args: { poolId: nextPoolId } }) await time.increase(time.duration.days(1)) @@ -198,12 +228,13 @@ export async function thirdUserDepositFixture() { let requestId = latestRequestId const nextValues = { activeBalance: 64, + sweptBalance: 0, activatedDeposits: 1, - unexpectedExits: 0, - slashedExits: 0, - withdrawnExits: 0 + forcedExits: 0, + completedExits: 0, + compoundablePoolIds: [0, 0, 0, 0, 0] } - requestId = await fulfillReportRequest({ + requestId = await fulfillReport({ upkeep, keeper, values: nextValues, @@ -226,12 +257,13 @@ export async function rewardsPostThirdUserDepositFixture() { let requestId = latestRequestId const nextValues = { activeBalance: 64.21, + sweptBalance: 0, activatedDeposits: 0, - unexpectedExits: 0, - slashedExits: 0, - withdrawnExits: 0 + forcedExits: 0, + completedExits: 0, + compoundablePoolIds: [0, 0, 0, 0, 0] } - requestId = await fulfillReportRequest({ + requestId = await fulfillReport({ upkeep, keeper, values: nextValues, @@ -248,23 +280,33 @@ export async function sweepPostThirdUserDepositFixture() { const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(rewardsPostThirdUserDepositFixture) const sweptRewards = 0.21 - const currentBalance = await ethers.provider.getBalance(manager.address) - const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptRewards.toString())) - await setBalance(manager.address, nextBalance) + const stakedPoolIds = await manager.getStakedPoolIds() + for (const poolId of stakedPoolIds) { + const poolAddress = await manager.getPoolAddress(poolId) + const poolSweptRewards = sweptRewards / stakedPoolIds.length + const currentBalance = await ethers.provider.getBalance(poolAddress) + const nextBalance = currentBalance.add(ethers.utils.parseEther(poolSweptRewards.toString())) + await setBalance(poolAddress, nextBalance) + } await time.increase(time.duration.days(1)) await runUpkeep({ upkeep, keeper }) let requestId = latestRequestId + const compoundablePoolIds = [0, 0, 0, 0, 0] + for (let i = 0; i < compoundablePoolIds.length; i++) { + if (i < stakedPoolIds.length) compoundablePoolIds[i] = stakedPoolIds[i] + } const nextValues = { activeBalance: 64, + sweptBalance: sweptRewards, activatedDeposits: 0, - unexpectedExits: 0, - slashedExits: 0, - withdrawnExits: 0 + forcedExits: 0, + completedExits: 0, + compoundablePoolIds } - requestId = await fulfillReportRequest({ + requestId = await fulfillReport({ upkeep, keeper, values: nextValues, @@ -290,12 +332,13 @@ export async function firstUserPartialWithdrawalFixture() { let requestId = latestRequestId const nextValues = { activeBalance: 64, + sweptBalance: 0, activatedDeposits: 0, - unexpectedExits: 0, - slashedExits: 0, - withdrawnExits: 0 + forcedExits: 0, + completedExits: 0, + compoundablePoolIds: [0, 0, 0, 0, 0] } - requestId = await fulfillReportRequest({ + requestId = await fulfillReport({ upkeep, keeper, values: nextValues, @@ -320,7 +363,7 @@ export async function fourthUserDepositFixture() { const readyPools = await manager.getReadyPoolIds() for (let i = 0; i < 2; i++) { const nextPoolId = readyPools[i] - await initiatePoolDepositHandler({ manager, signer: oracle, args: { poolId: nextPoolId } }) + await initiateDepositHandler({ manager, signer: oracle, args: { poolId: nextPoolId } }) } await time.increase(time.duration.days(1)) @@ -330,12 +373,13 @@ export async function fourthUserDepositFixture() { let requestId = latestRequestId const nextValues = { activeBalance: 128, + sweptBalance: 0, activatedDeposits: 2, - unexpectedExits: 0, - slashedExits: 0, - withdrawnExits: 0 + forcedExits: 0, + completedExits: 0, + compoundablePoolIds: [0, 0, 0, 0, 0] } - requestId = await fulfillReportRequest({ + requestId = await fulfillReport({ upkeep, keeper, values: nextValues, @@ -359,13 +403,14 @@ export async function activeBalanceLossFixture() { const nextValues = { activeBalance: 126, + sweptBalance: 0, activatedDeposits: 0, - unexpectedExits: 0, - slashedExits: 0, - withdrawnExits: 0 + forcedExits: 0, + completedExits: 0, + compoundablePoolIds: [0, 0, 0, 0, 0] } - requestId = await fulfillReportRequest({ + requestId = await fulfillReport({ upkeep, keeper, values: nextValues, @@ -391,13 +436,14 @@ export async function activeBalanceRecoveryFixture() { const nextValues = { activeBalance: nextActiveBalance, + sweptBalance: 0, activatedDeposits: 0, - unexpectedExits: 0, - slashedExits: 0, - withdrawnExits: 0 + forcedExits: 0, + completedExits: 0, + compoundablePoolIds: [0, 0, 0, 0, 0] } - requestId = await fulfillReportRequest({ + requestId = await fulfillReport({ upkeep, keeper, values: nextValues, @@ -420,10 +466,12 @@ export async function thirdUserFullWithdrawalFixture() { const withdraw = await manager.connect(thirdUser).requestWithdrawal(thirdStake) await withdraw.wait() - const sweptExitBalance = 32 - const currentBalance = await ethers.provider.getBalance(manager.address) - const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptExitBalance.toString())) - await setBalance(manager.address, nextBalance) + const sweptExitedBalance = 32 + const withdrawnPoolId = (await manager.getStakedPoolIds())[0] + const withdrawnPoolAddress = await manager.getPoolAddress(withdrawnPoolId) + const currentBalance = await ethers.provider.getBalance(withdrawnPoolAddress) + const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptExitedBalance.toString())) + await setBalance(withdrawnPoolAddress, nextBalance) await time.increase(time.duration.days(1)) @@ -433,20 +481,21 @@ export async function thirdUserFullWithdrawalFixture() { const nextValues = { activeBalance: 128, + sweptBalance: sweptExitedBalance, activatedDeposits: 0, - unexpectedExits: 0, - slashedExits: 0, - withdrawnExits: 1 + forcedExits: 0, + completedExits: 1, + compoundablePoolIds: [0, 0, 0, 0, 0] } - requestId = await fulfillReportRequest({ + requestId = await fulfillReport({ upkeep, keeper, values: nextValues, requestId }) - await completePoolExitHandler({ manager, signer: oracle }) + await reportCompletedExitsHandler({ manager, signer: oracle, args: { count: 1 } }) await runUpkeep({ upkeep, keeper }) @@ -463,53 +512,62 @@ export async function simulationFixture() { let requestId = latestRequestId for (let i = 0; i < 5; i++) { - const depositedPoolCount = await manager.getDepositedPoolCount() - if (depositedPoolCount) { - await time.increase(time.duration.days(1)) - - await runUpkeep({ upkeep, keeper }) - - const rewardsAmount = rewardsPerValidator * depositedPoolCount.toNumber() - totalRewards += round(rewardsAmount, 10) - nextActiveBalance = round(nextActiveBalance + rewardsAmount, 10) - - const nextValues = { - activeBalance: nextActiveBalance, - activatedDeposits: 0, - unexpectedExits: 0, - slashedExits: 0, - withdrawnExits: 0 - } - - requestId = await fulfillReportRequest({ - upkeep, - keeper, - values: nextValues, - requestId - }) - - await runUpkeep({ upkeep, keeper }) + const stakedPoolIds = await manager.getStakedPoolIds() + await time.increase(time.duration.days(1)) + + await runUpkeep({ upkeep, keeper }) + + const rewardsAmount = rewardsPerValidator * stakedPoolIds.length + totalRewards += round(rewardsAmount, 10) + nextActiveBalance = round(nextActiveBalance + rewardsAmount, 10) + + const nextValues = { + activeBalance: nextActiveBalance, + sweptBalance: 0, + activatedDeposits: 0, + forcedExits: 0, + completedExits: 0, + compoundablePoolIds: [0, 0, 0, 0, 0] } + + requestId = await fulfillReport({ + upkeep, + keeper, + values: nextValues, + requestId + }) + + await runUpkeep({ upkeep, keeper }) } const sweptRewards = totalRewards - const currentBalance = await ethers.provider.getBalance(manager.address) - const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptRewards.toString())) - await setBalance(manager.address, nextBalance) + const stakedPoolIds = await manager.getStakedPoolIds() + for (const poolId of stakedPoolIds) { + const poolAddress = await manager.getPoolAddress(poolId) + const poolSweptRewards = sweptRewards / stakedPoolIds.length + const currentBalance = await ethers.provider.getBalance(poolAddress) + const nextBalance = currentBalance.add(ethers.utils.parseEther(poolSweptRewards.toString())) + await setBalance(poolAddress, nextBalance) + } await time.increase(time.duration.days(1)) await runUpkeep({ upkeep, keeper }) + const compoundablePoolIds = [0, 0, 0, 0, 0] + for (let i = 0; i < compoundablePoolIds.length; i++) { + if (i < stakedPoolIds.length) compoundablePoolIds[i] = stakedPoolIds[i] + } const nextValues = { activeBalance: 96, + sweptBalance: sweptRewards, activatedDeposits: 0, - unexpectedExits: 0, - slashedExits: 0, - withdrawnExits: 0 + forcedExits: 0, + completedExits: 0, + compoundablePoolIds } - requestId = await fulfillReportRequest({ + requestId = await fulfillReport({ upkeep, keeper, values: nextValues, diff --git a/contracts/ethereum/test/integration.ts b/contracts/ethereum/test/integration.ts index e50d04a39..561dc6353 100644 --- a/contracts/ethereum/test/integration.ts +++ b/contracts/ethereum/test/integration.ts @@ -23,10 +23,9 @@ describe('Casimir manager', async function () { expect(stakedPoolIds.length).equal(1) const firstPoolId = stakedPoolIds[0] - const pool = await manager.getPool(firstPoolId) - expect(ethers.utils.formatEther(pool.deposits)).equal('32.0') - expect(pool.publicKey).not.equal('0x') - expect(pool.operatorIds.length).equal(4) + const poolDetails = await manager.getPoolDetails(firstPoolId) + expect(poolDetails.publicKey).not.equal('0x') + expect(poolDetails.operatorIds.length).equal(4) }) it('Second user\'s 24.0 stake increases the total stake to 40.0', async function () { @@ -67,10 +66,9 @@ describe('Casimir manager', async function () { expect(stakedPools.length).equal(2) const secondPoolId = stakedPools[1] - const pool = await manager.getPool(secondPoolId) - expect(ethers.utils.formatEther(pool.deposits)).equal('32.0') - expect(pool.publicKey).not.equal('0x') - expect(pool.operatorIds.length).equal(4) + const poolDetails = await manager.getPoolDetails(secondPoolId) + expect(poolDetails.publicKey).not.equal('0x') + expect(poolDetails.operatorIds.length).equal(4) }) it('Third user\'s 24.0 stake increases the total stake to 64.1', async function () { @@ -125,16 +123,14 @@ describe('Casimir manager', async function () { expect(stakedPools.length).equal(4) const thirdPoolId = stakedPools[2] - const thirdPool = await manager.getPool(thirdPoolId) - expect(ethers.utils.formatEther(thirdPool.deposits)).equal('32.0') - expect(thirdPool.publicKey).not.equal('0x') - expect(thirdPool.operatorIds.length).equal(4) + const thirdPoolDetails = await manager.getPoolDetails(thirdPoolId) + expect(thirdPoolDetails.publicKey).not.equal('0x') + expect(thirdPoolDetails.operatorIds.length).equal(4) const fourthPoolId = stakedPools[3] - const fourthPool = await manager.getPool(fourthPoolId) - expect(ethers.utils.formatEther(fourthPool.deposits)).equal('32.0') - expect(fourthPool.publicKey).not.equal('0x') - expect(fourthPool.operatorIds.length).equal(4) + const fourthPoolDetails = await manager.getPoolDetails(fourthPoolId) + expect(fourthPoolDetails.publicKey).not.equal('0x') + expect(fourthPoolDetails.operatorIds.length).equal(4) }) it('A loss is reported and brings the active stake below expected', async function () { diff --git a/services/oracle/README.md b/services/oracle/README.md index d82bd8fc2..836b05016 100644 --- a/services/oracle/README.md +++ b/services/oracle/README.md @@ -4,7 +4,7 @@ Casimir validators oracle service ## About -The validator oracle service initiates and reports on validator operations: distributed key generation (DKG) ceremonies, DKG reshares, and DKG or presigned exit requests. It contains a [NodeJS](https://nodejs.org) application that listens for `DepositRequested`, `ReshareRequested`, and `PoolExitRequested` events, which then internally uses the [RockX DKG CLI and messenger server](https://github.com/rockx/rockx-dkg-cli) to initiate and retrieve operator group DKG results. The `DepositRequested` event starts a new DKG keygen and retrieves the results to submit a new validator via `depositPool`. The `ReshareRequested` event starts a new DKG reshare and retrieves the results to update an existing validator via `resharePool`. The `PoolExitRequested` event starts a new DKG exit and retrieves the results to submit a signed exit message directly to the Beacon chain. +The validator oracle service initiates and reports on validator operations: distributed key generation (DKG) ceremonies, DKG reshares, and DKG or presigned exit requests. It contains a [NodeJS](https://nodejs.org) application that listens for `DepositRequested`, `ReshareRequested`, and `ExitRequested` events, which then internally uses the [RockX DKG CLI and messenger server](https://github.com/rockx/rockx-dkg-cli) to initiate and retrieve operator group DKG results. The `DepositRequested` event starts a new DKG keygen and retrieves the results to submit a new validator via `depositPool`. The `ReshareRequested` event starts a new DKG reshare and retrieves the results to update an existing validator via `resharePool`. The `ExitRequested` event starts a new DKG exit and retrieves the results to submit a signed exit message directly to the Beacon chain. DKG operations and reports will theoretically have [verifiable](https://docs.obol.tech/docs/next/charon/dkg#dkg-verification) aspects that prove fair DKG ceremonies. diff --git a/services/oracle/src/index.ts b/services/oracle/src/index.ts index 6d37b61a9..bab186619 100644 --- a/services/oracle/src/index.ts +++ b/services/oracle/src/index.ts @@ -1,21 +1,27 @@ import { config } from './providers/config' import { getEventEmitter } from './providers/events' -import { initiatePoolDepositHandler, initiatePoolExitHandler, initiatePoolReshareHandler } from './providers/handlers' +import { + initiateDepositHandler, + initiatePoolExitHandler, + initiatePoolReshareHandler, + reportCompletedExitsHandler +} from './providers/handlers' const handlers = { - DepositRequested: initiatePoolDepositHandler, + DepositRequested: initiateDepositHandler, ReshareRequested: initiatePoolReshareHandler, - PoolExitRequested: initiatePoolExitHandler, - // UnexpectedExitReportsRequested: reportUnexpectedExitsHandler, - // SlashedExitReportsRequested: reportSlashedExitsHandler, - // WithdrawnExitReportsRequested: reportWithdrawnExitsHandler + ExitRequested: initiatePoolExitHandler, + // ForcedExitReportsRequested: reportForcedExitsHandler, + CompletedExitReportsRequested: reportCompletedExitsHandler } const { provider, signer, manager, cliPath, messengerUrl } = config() ;(async function () { const eventEmitter = getEventEmitter({ manager, events: Object.keys(handlers) }) - for await (const event of eventEmitter) { + for await (const event of eventEmitter) { + console.log('Event received', event) + const [ value, details ] = event const handler = handlers[details.event as keyof typeof handlers] if (!handler) throw new Error(`No handler found for event ${details.event}`) diff --git a/services/oracle/src/providers/handlers.ts b/services/oracle/src/providers/handlers.ts index 0f31f0a75..7ebcb2d34 100644 --- a/services/oracle/src/providers/handlers.ts +++ b/services/oracle/src/providers/handlers.ts @@ -4,17 +4,21 @@ import { HandlerInput } from '../interfaces/HandlerInput' import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' import { getClusterDetails } from '@casimir/ssv' -export async function initiatePoolDepositHandler(input: HandlerInput) { +export async function initiateDepositHandler(input: HandlerInput) { const { provider, signer, manager, cliPath, - messengerUrl, - value + messengerUrl } = input - const poolId = value + const nonce = await provider.getTransactionCount(manager.address) + const poolAddress = ethers.utils.getContractAddress({ + from: manager.address, + nonce + }) + const newOperatorIds = [1, 2, 3, 4] // Todo get new group here const dkg = new DKG({ cliPath, messengerUrl }) @@ -22,7 +26,7 @@ export async function initiatePoolDepositHandler(input: HandlerInput) { provider, manager, operatorIds: newOperatorIds, - withdrawalAddress: manager.address + withdrawalAddress: poolAddress }) const { @@ -36,13 +40,13 @@ export async function initiatePoolDepositHandler(input: HandlerInput) { const clusterDetails = await getClusterDetails({ provider, - operatorIds, - withdrawalAddress: manager.address + ownerAddress: manager.address, + operatorIds }) - const { cluster, requiredFees } = clusterDetails + const { cluster, requiredBalancePerValidator } = clusterDetails - const initiatePoolDeposit = await (manager.connect(signer) as CasimirManager & ethers.Contract).initiatePoolDeposit( + const initiateDeposit = await (manager.connect(signer) as CasimirManager & ethers.Contract).initiateDeposit( depositDataRoot, publicKey, signature, @@ -50,9 +54,9 @@ export async function initiatePoolDepositHandler(input: HandlerInput) { operatorIds, shares, cluster, - requiredFees // Mock fee amount estimate ~ 10 SSV + requiredBalancePerValidator ) - await initiatePoolDeposit.wait() + await initiateDeposit.wait() } export async function initiatePoolReshareHandler(input: HandlerInput) { @@ -70,8 +74,7 @@ export async function initiatePoolReshareHandler(input: HandlerInput) { // Todo reshare event will include the operator to boot // Get pool to reshare - const pool = await manager.getPool(poolId) - const { publicKey, operatorIds } = pool + const poolDetails = await manager.getPoolDetails(poolId) // Todo old operators and new operators only different by 1 operator const newOperatorGroup = [1, 2, 3, 4] @@ -105,12 +108,49 @@ export async function initiatePoolExitHandler(input: HandlerInput) { const poolId = value // Get pool to exit - const pool = await manager.getPool(poolId) - const { publicKey, operatorIds } = pool - + const poolDetails = await manager.getPoolDetails(poolId) // Get operators to sign exit const dkg = new DKG({ cliPath, messengerUrl }) // Broadcast exit signature +} + +export async function reportCompletedExitsHandler(input: HandlerInput) { + const { + provider, + signer, + manager, + value + } = input + + const count = value + + // In production, we get the withdrawn exit order from the Beacon API (sorting by withdrawal epoch) + // Here, we're just reporting them in the order they were exited + let remaining = count + let poolIndex = 0 + const stakedPoolIds = await manager.getStakedPoolIds() + while (remaining > 0) { + const poolId = stakedPoolIds[poolIndex] + const poolDetails = await manager.getPoolDetails(poolId) + if (poolDetails.status === 2 || poolDetails.status === 3) { + remaining-- + const operatorIds = poolDetails.operatorIds.map((operatorId) => operatorId.toNumber()) + const blamePercents = [0, 0, 0, 0] + const clusterDetails = await getClusterDetails({ + provider: provider, + ownerAddress: manager.address, + operatorIds + }) + const { cluster } = clusterDetails + const reportCompletedExit = await manager.connect(signer).reportCompletedExit( + poolIndex, + blamePercents, + cluster + ) + await reportCompletedExit.wait() + } + poolIndex++ + } } \ No newline at end of file From 61738223bf7b7d5b6be0a73ca32ad575270df5a7 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Sun, 4 Jun 2023 23:53:31 -0400 Subject: [PATCH 46/78] Make DAO owners changeable --- contracts/ethereum/docs/index.md | 671 ++++++++++++------ contracts/ethereum/src/CasimirDAO.sol | 246 +++++-- contracts/ethereum/src/CasimirRegistry.sol | 45 +- .../ethereum/src/interfaces/ICasimirDAO.sol | 70 +- .../src/interfaces/ICasimirRegistry.sol | 6 +- 5 files changed, 720 insertions(+), 318 deletions(-) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 0f3253301..bbd8ffdf3 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -2,23 +2,21 @@ ## CasimirManager -### Token +### finalizableCompletedExits ```solidity -enum Token { - LINK, - SSV, - WETH -} +uint256 finalizableCompletedExits ``` -### finalizableWithdrawnPoolCount +Exited pool count + +### onlyPool ```solidity -uint256 finalizableWithdrawnPoolCount +modifier onlyPool(uint32 poolId) ``` -Exited pool count +_Validate the caller is the authorized pool_ ### onlyOracle @@ -28,6 +26,14 @@ modifier onlyOracle() _Validate the caller is the manager oracle_ +### onlyRegistry + +```solidity +modifier onlyRegistry() +``` + +_Validate the caller is the registry_ + ### onlyUpkeep ```solidity @@ -36,14 +42,22 @@ modifier onlyUpkeep() _Validate the caller is the upkeep contract_ -### validateDeposit +### validDeposit ```solidity -modifier validateDeposit() +modifier validDeposit() ``` _Validate a deposit_ +### validWithdrawal + +```solidity +modifier validWithdrawal(uint256 amount) +``` + +_Validate a withdrawal_ + ### validDistribution ```solidity @@ -61,7 +75,7 @@ _Validate a distribution_ ### constructor ```solidity -constructor(address _oracleAddress, address beaconDepositAddress, address functionsAddress, uint32 functionsSubscriptionId, address linkTokenAddress, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public +constructor(address _oracleAddress, address beaconDepositAddress, address functionsAddress, uint32 functionsSubscriptionId, address linkTokenAddress, address ssvNetworkAddress, address ssvNetworkViewsAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public ``` Constructor @@ -76,6 +90,7 @@ Constructor | functionsSubscriptionId | uint32 | The Chainlink functions subscription ID | | linkTokenAddress | address | The Chainlink token address | | ssvNetworkAddress | address | The SSV network address | +| ssvNetworkViewsAddress | address | The SSV network views address | | ssvTokenAddress | address | The SSV token address | | swapFactoryAddress | address | The Uniswap factory address | | swapRouterAddress | address | The Uniswap router address | @@ -87,7 +102,7 @@ Constructor receive() external payable ``` -Redirect users to the deposit function +Receive and deposit validator tips ### depositStake @@ -97,6 +112,36 @@ function depositStake() external payable Deposit user stake +### depositRewards + +```solidity +function depositRewards() external payable +``` + +Deposit a given amount of rewards + +### depositExitedBalance + +```solidity +function depositExitedBalance(uint32 poolId) external payable +``` + +Deposit exited balance from a given pool ID + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolId | uint32 | The pool ID | + +### depositRecoveredBalance + +```solidity +function depositRecoveredBalance(uint32 poolId) external payable +``` + +Deposit recovered balance for a given pool from an operator + ### rebalanceStake ```solidity @@ -114,6 +159,20 @@ Rebalance the rewards to stake ratio and redistribute swept rewards | activatedDeposits | uint256 | The count of activated deposits | | completedExits | uint256 | The count of withdrawn exits | +### compoundRewards + +```solidity +function compoundRewards(uint32[5] poolIds) external +``` + +Compound rewards given a list of pool IDs + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolIds | uint32[5] | The list of pool IDs | + ### requestWithdrawal ```solidity @@ -134,7 +193,7 @@ Request to withdraw user stake function fulfillWithdrawals(uint256 count) external ``` -Complete a given count of pending withdrawals +Fulfill a given count of pending withdrawals #### Parameters @@ -169,13 +228,13 @@ Initiate the next ready pool function activateDeposits(uint256 count) external ``` -Complete a given count of the next pending pools +Activate a given count of the next pending pools #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| count | uint256 | The number of pools to complete | +| count | uint256 | The number of pools to activate | ### requestForcedExitReports @@ -183,27 +242,13 @@ Complete a given count of the next pending pools function requestForcedExitReports(uint256 count) external ``` -Request a given count of pool unexpected exit reports - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| count | uint256 | The number of pool unexpected exit reports | - -### requestSlashedExitReports - -```solidity -function requestSlashedExitReports(uint256 count) external -``` - -Request a given count of pool slashed exit reports +Request reports for a given count of pools forced to exit #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| count | uint256 | The number of pool slashed exit reports | +| count | uint256 | The number of pools forced to exit | ### requestCompletedExitReports @@ -211,13 +256,13 @@ Request a given count of pool slashed exit reports function requestCompletedExitReports(uint256 count) external ``` -Request a given count of pool exit completions +Request reports for a given count of completed exits #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| count | uint256 | The number of pool exits to complete | +| count | uint256 | The number of completed exits | ### reportForcedExit @@ -233,53 +278,22 @@ Report a pool unexpected exit | ---- | ---- | ----------- | | poolId | uint32 | The pool ID | -### reportSlashedExit - -```solidity -function reportSlashedExit(uint32 poolId) external -``` - -Report a pool slash - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | - ### reportCompletedExit ```solidity -function reportCompletedExit(uint256 poolIndex, uint256 finalEffectiveBalance, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external +function reportCompletedExit(uint256 poolIndex, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external ``` -Complete a pool exit +Report a completed exit #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | | poolIndex | uint256 | The staked pool index | -| finalEffectiveBalance | uint256 | The final effective balance | | blamePercents | uint32[] | The operator blame percents (0 if balance is 32 ether) | | cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | -### setFeePercents - -```solidity -function setFeePercents(uint32 _ethFeePercent, uint32 _linkFeePercent, uint32 _ssvFeePercent) external -``` - -_Update fee percentages_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _ethFeePercent | uint32 | The new ETH fee percentage | -| _linkFeePercent | uint32 | The new LINK fee percentage | -| _ssvFeePercent | uint32 | The new SSV fee percentage | - ### setFunctionsAddress ```solidity @@ -390,27 +404,13 @@ Get the withdrawable balanace function getReservedFeeBalance() public view returns (uint256) ``` -Get the reserved fees - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | reservedFees The reserved fees | - -### getSweptBalance - -```solidity -function getSweptBalance() public view returns (uint256 balance) -``` - -Get the swept balance +Get the reserved fee balance #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| balance | uint256 | The swept balance | +| [0] | uint256 | reservedFeeBalance The reserved fee balance | ### getExpectedEffectiveBalance @@ -474,13 +474,13 @@ Get the latest active balance after fees function getLatestActiveRewardBalance() public view returns (int256) ``` -Get the latest active rewards +Get the latest active reward balance #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | int256 | latestRewards The latest active rewards | +| [0] | int256 | latestActiveRewardBalance The latest active reward balance | ### getFinalizableExitedBalance @@ -488,13 +488,13 @@ Get the latest active rewards function getFinalizableExitedBalance() public view returns (uint256) ``` -Get the finalizable withdrawn balance of the current reporting period +Get the finalizable exited balance of the current reporting period #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | reportFinalizableExitedBalance The finalizable withdrawn balance of the current reporting period | +| [0] | uint256 | finalizableExitedBalance The finalizable exited balance of the current reporting period | ### getFinalizableCompletedExits @@ -502,27 +502,13 @@ Get the finalizable withdrawn balance of the current reporting period function getFinalizableCompletedExits() public view returns (uint256) ``` -Get the finalizable withdrawn pool count of the current reporting period - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | finalizableWithdrawnPoolCount The finalizable withdrawn pool count of the current reporting period | - -### getPendingWithdrawalQueue - -```solidity -function getPendingWithdrawalQueue() public view returns (struct ICasimirManager.Withdrawal[]) -``` - -Get the pending withdrawal queue +Get the finalizable completed exit count of the current reporting period #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | struct ICasimirManager.Withdrawal[] | requestedWithdrawalQueue The pending withdrawal queue | +| [0] | uint256 | finalizableCompletedExits The finalizable completed exit count of the current reporting period | ### getPendingWithdrawalEligibility @@ -544,13 +530,13 @@ Get the eligibility of a pending withdrawal function getPendingWithdrawalBalance() public view returns (uint256) ``` -Get the total pending withdrawals +Get the total pending user withdrawal amount #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | requestedWithdrawals The total pending withdrawals | +| [0] | uint256 | requestedWithdrawalBalance The total pending user withdrawal amount | ### getPendingWithdrawals @@ -564,7 +550,7 @@ Get the total pending withdrawal count | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | pendingWithdrawalCount The total pending withdrawal count | +| [0] | uint256 | requestedWithdrawals The total pending withdrawal count | ### getFeePercent @@ -586,13 +572,13 @@ Get the total fee percentage function getTotalDeposits() external view returns (uint256) ``` -Get the count of active pools +Get the count of deposited pools #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | depositedPoolCount The count of active pools | +| [0] | uint256 | totalDeposits The count of deposited pools | ### getRequestedExits @@ -600,13 +586,13 @@ Get the count of active pools function getRequestedExits() external view returns (uint256) ``` -Get the count of exiting pools +Get the count of pools requested to exit #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | exitingPoolCount The count of exiting pools | +| [0] | uint256 | requestedExits The count of pools requested to exit | ### getReadyPoolIds @@ -664,13 +650,13 @@ Get the pre-pool balance | ---- | ---- | ----------- | | [0] | uint256 | prepoolBalance The pre-pool balance | -### getPool +### getPoolAddress ```solidity -function getPool(uint32 poolId) external view returns (struct ICasimirManager.Pool pool) +function getPoolAddress(uint32 poolId) external view returns (address) ``` -Get a pool by ID +Get a pool's address by ID #### Parameters @@ -682,63 +668,155 @@ Get a pool by ID | Name | Type | Description | | ---- | ---- | ----------- | -| pool | struct ICasimirManager.Pool | The pool details | +| [0] | address | poolAddress The pool address | -### getETHFeePercent +### getPoolDetails ```solidity -function getETHFeePercent() external view returns (uint32) +function getPoolDetails(uint32 poolId) external view returns (struct ICasimirManager.PoolDetails poolDetails) ``` -Get the ETH fee percentage to charge on each deposit +Get a pool's details by ID + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolId | uint32 | The pool ID | #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32 | ethFeePercent The ETH fee percentage to charge on each deposit | +| poolDetails | struct ICasimirManager.PoolDetails | The pool details | -### getLINKFeePercent +### getRegistryAddress ```solidity -function getLINKFeePercent() external view returns (uint32) +function getRegistryAddress() external view returns (address registryAddress) ``` -Get the LINK fee percentage to charge on each deposit +Get the registry address #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32 | linkFeePercent The LINK fee percentage to charge on each deposit | +| registryAddress | address | The registry address | -### getSSVFeePercent +### getUpkeepAddress ```solidity -function getSSVFeePercent() external view returns (uint32) +function getUpkeepAddress() external view returns (address upkeepAddress) ``` -Get the SSV fee percentage to charge on each deposit +Get the upkeep address #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32 | ssvFeePercent The SSV fee percentage to charge on each deposit | +| upkeepAddress | address | The upkeep address | -### getUpkeepAddress +### getSweptBalance ```solidity -function getUpkeepAddress() external view returns (address upkeepAddress) +function getSweptBalance() public view returns (uint256 balance) ``` -Get the upkeep address +Get the swept balance + +_Should be called off-chain_ #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| upkeepAddress | address | The upkeep address | +| balance | uint256 | The swept balance | + +### getCompoundablePoolIds + +```solidity +function getCompoundablePoolIds() external view returns (uint32[5] poolIds) +``` + +Get the next five compoundable pool IDs + +_Should be called off-chain_ + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolIds | uint32[5] | The next five compoundable pool IDs | + +## CasimirPool + +### poolCapacity + +```solidity +uint256 poolCapacity +``` + +### constructor + +```solidity +constructor(address registryAddress, uint32 poolId, bytes publicKey, uint64[] operatorIds) public +``` + +### depositRewards + +```solidity +function depositRewards() external +``` + +### withdrawBalance + +```solidity +function withdrawBalance(uint32[] blamePercents) external +``` + +### setOperatorIds + +```solidity +function setOperatorIds(uint64[] operatorIds) external +``` + +### setStatus + +```solidity +function setStatus(enum ICasimirPool.PoolStatus status) external +``` + +### getBalance + +```solidity +function getBalance() external view returns (uint256) +``` + +### getConfig + +```solidity +function getConfig() external view returns (struct ICasimirPool.PoolConfig) +``` + +### getOperatorIds + +```solidity +function getOperatorIds() external view returns (uint64[]) +``` + +### getPublicKey + +```solidity +function getPublicKey() external view returns (bytes) +``` + +### getStatus + +```solidity +function getStatus() external view returns (enum ICasimirPool.PoolStatus) +``` ## CasimirRegistry @@ -760,10 +838,18 @@ uint256 minimumCollateralDeposit uint256 totalCollateral ``` +### onlyPool + +```solidity +modifier onlyPool(uint32 poolId) +``` + +_Validate the caller is the authorized pool_ + ### constructor ```solidity -constructor(address managerAddress, address ssvNetworkViewsAddress) public +constructor(address ssvNetworkViewsAddress) public ``` ### registerOperator @@ -822,20 +908,36 @@ Deposit collateral for an operator | ---- | ---- | ----------- | | operatorId | uint64 | The operator ID | -### setOperatorCollateral +### addActivePool ```solidity -function setOperatorCollateral(uint64 operatorId, int256 collateral) external +function addActivePool(uint32 poolId, uint64 operatorId) external ``` -Set the collateral for an operator +Add an active pool to an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | +| poolId | uint32 | The pool ID | +| operatorId | uint64 | The operator ID | + +### removeActivePool + +```solidity +function removeActivePool(uint32 poolId, uint64 operatorId, uint256 blameAmount) external +``` + +Remove an active pool from an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolId | uint32 | The pool ID | | operatorId | uint64 | The operator ID | -| collateral | int256 | The collateral | +| blameAmount | uint256 | The amount to recover from collateral | ### getOperatorCollateral @@ -883,29 +985,37 @@ uint256 reportPeriod Current report period -### reportPendingPoolCount +### reportRemainingRequests ```solidity -uint256 reportPendingPoolCount +uint256 reportRemainingRequests ``` -Current report pending pool count +Current report remaining request count -### reportExitingPoolCount +### reportRequestBlock ```solidity -uint256 reportExitingPoolCount +uint256 reportRequestBlock ``` -Current report exiting pool count +Current report block -### reportRequestBlock +### reportCompoundablePoolIds ```solidity -uint256 reportRequestBlock +uint32[5] reportCompoundablePoolIds ``` -Current report block +Current report compoundable pools + +### finalizableCompoundablePoolIds + +```solidity +uint32[5] finalizableCompoundablePoolIds +``` + +Finalizable compoundable pools ### requestCBOR @@ -923,24 +1033,10 @@ uint32 fulfillGasLimit Fulfillment gas limit -### validateRequestId - -```solidity -modifier validateRequestId(bytes32 requestId) -``` - -_Verify a request ID_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The request ID | - ### constructor ```solidity -constructor(address managerAddress, address functionsOracleAddress, uint64 _functionsSubscriptionId) public +constructor(address functionsOracleAddress, uint64 _functionsSubscriptionId) public ``` Constructor @@ -949,7 +1045,6 @@ Constructor | Name | Type | Description | | ---- | ---- | ----------- | -| managerAddress | address | The manager contract address | | functionsOracleAddress | address | The functions oracle contract address | | _functionsSubscriptionId | uint64 | The functions subscription ID | @@ -1073,29 +1168,25 @@ Fulfill the request for testing ## ICasimirManager -### ProcessedDeposit +### Token ```solidity -struct ProcessedDeposit { - uint256 ethAmount; - uint256 linkAmount; - uint256 ssvAmount; +enum Token { + LINK, + SSV, + WETH } ``` -### Pool +### PoolDetails ```solidity -struct Pool { - uint256 deposits; - bool exiting; - bool slashed; - bytes32 depositDataRoot; +struct PoolDetails { + uint32 id; + uint256 balance; bytes publicKey; - bytes signature; - bytes withdrawalCredentials; uint64[] operatorIds; - bytes shares; + enum ICasimirPool.PoolStatus status; } ``` @@ -1196,6 +1287,12 @@ event StakeRebalanced(uint256 amount) event RewardsDeposited(uint256 amount) ``` +### TipsDeposited + +```solidity +event TipsDeposited(uint256 amount) +``` + ### WithdrawalRequested ```solidity @@ -1220,12 +1317,36 @@ event WithdrawalFulfilled(address sender, uint256 amount) function depositStake() external payable ``` +### depositRewards + +```solidity +function depositRewards() external payable +``` + ### rebalanceStake ```solidity function rebalanceStake(uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, uint256 completedExits) external ``` +### compoundRewards + +```solidity +function compoundRewards(uint32[5] poolIds) external +``` + +### depositExitedBalance + +```solidity +function depositExitedBalance(uint32 poolId) external payable +``` + +### depositRecoveredBalance + +```solidity +function depositRecoveredBalance(uint32 poolId) external payable +``` + ### requestWithdrawal ```solidity @@ -1256,12 +1377,6 @@ function activateDeposits(uint256 count) external function requestForcedExitReports(uint256 count) external ``` -### requestSlashedExitReports - -```solidity -function requestSlashedExitReports(uint256 count) external -``` - ### requestCompletedExitReports ```solidity @@ -1271,13 +1386,7 @@ function requestCompletedExitReports(uint256 count) external ### reportCompletedExit ```solidity -function reportCompletedExit(uint256 poolIndex, uint256 finalEffectiveBalance, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external -``` - -### setFeePercents - -```solidity -function setFeePercents(uint32 ethFeePercent, uint32 linkFeePercent, uint32 ssvFeePercent) external +function reportCompletedExit(uint256 poolIndex, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external ``` ### setFunctionsAddress @@ -1292,24 +1401,6 @@ function setFunctionsAddress(address functionsAddress) external function getFeePercent() external view returns (uint32) ``` -### getETHFeePercent - -```solidity -function getETHFeePercent() external view returns (uint32) -``` - -### getLINKFeePercent - -```solidity -function getLINKFeePercent() external view returns (uint32) -``` - -### getSSVFeePercent - -```solidity -function getSSVFeePercent() external view returns (uint32) -``` - ### getTotalDeposits ```solidity @@ -1418,12 +1509,6 @@ function getSweptBalance() external view returns (uint256) function getUserStake(address userAddress) external view returns (uint256) ``` -### getPendingWithdrawalQueue - -```solidity -function getPendingWithdrawalQueue() external view returns (struct ICasimirManager.Withdrawal[]) -``` - ### getPendingWithdrawalBalance ```solidity @@ -1436,6 +1521,109 @@ function getPendingWithdrawalBalance() external view returns (uint256) function getPendingWithdrawals() external view returns (uint256) ``` +### getPoolAddress + +```solidity +function getPoolAddress(uint32 poolId) external view returns (address) +``` + +### getPoolDetails + +```solidity +function getPoolDetails(uint32 poolId) external view returns (struct ICasimirManager.PoolDetails) +``` + +### getRegistryAddress + +```solidity +function getRegistryAddress() external view returns (address) +``` + +### getUpkeepAddress + +```solidity +function getUpkeepAddress() external view returns (address) +``` + +## ICasimirPool + +### PoolConfig + +```solidity +struct PoolConfig { + uint32 poolId; + bytes publicKey; + uint64[] operatorIds; + enum ICasimirPool.PoolStatus status; +} +``` + +### PoolStatus + +```solidity +enum PoolStatus { + PENDING, + ACTIVE, + EXITING_FORCED, + EXITING_REQUESTED, + WITHDRAWN +} +``` + +### depositRewards + +```solidity +function depositRewards() external +``` + +### withdrawBalance + +```solidity +function withdrawBalance(uint32[] blamePercents) external +``` + +### setOperatorIds + +```solidity +function setOperatorIds(uint64[] operatorIds) external +``` + +### setStatus + +```solidity +function setStatus(enum ICasimirPool.PoolStatus status) external +``` + +### getBalance + +```solidity +function getBalance() external view returns (uint256) +``` + +### getConfig + +```solidity +function getConfig() external view returns (struct ICasimirPool.PoolConfig) +``` + +### getOperatorIds + +```solidity +function getOperatorIds() external view returns (uint64[]) +``` + +### getPublicKey + +```solidity +function getPublicKey() external view returns (bytes) +``` + +### getStatus + +```solidity +function getStatus() external view returns (enum ICasimirPool.PoolStatus) +``` + ## ICasimirRegistry ### OperatorRegistered @@ -1460,9 +1648,10 @@ event DeregistrationCompleted(uint64 operatorId) ```solidity struct Operator { - uint64 id; + bool active; int256 collateral; uint256 poolCount; + mapping(uint32 => bool) activePools; bool deregistering; } ``` @@ -1491,10 +1680,16 @@ function deregisterOperator(uint64 operatorId) external function depositCollateral(uint64 operatorId) external payable ``` -### setOperatorCollateral +### addActivePool + +```solidity +function addActivePool(uint32 poolId, uint64 operatorId) external +``` + +### removeActivePool ```solidity -function setOperatorCollateral(uint64 operatorId, int256 collateral) external +function removeActivePool(uint32 poolId, uint64 operatorId, uint256 blameAmount) external ``` ### getOperatorCollateral @@ -1505,10 +1700,20 @@ function getOperatorCollateral(uint64 operatorId) external view returns (int256) ## ICasimirUpkeep -### Status +### RequestType ```solidity -enum Status { +enum RequestType { + NONE, + BALANCES, + DETAILS +} +``` + +### ReportStatus + +```solidity +enum ReportStatus { FINALIZED, REQUESTING, PROCESSING @@ -1524,7 +1729,7 @@ event OCRResponse(bytes32 requestId, bytes result, bytes err) ### UpkeepPerformed ```solidity -event UpkeepPerformed(enum ICasimirUpkeep.Status status) +event UpkeepPerformed(enum ICasimirUpkeep.ReportStatus status) ``` ### checkUpkeep @@ -1731,6 +1936,28 @@ function withdraw(uint256) external Withdraw wrapped ether to get ether +## CasimirRecipient + +### manager + +```solidity +contract ICasimirManager manager +``` + +### constructor + +```solidity +constructor() public +``` + +### receive + +```solidity +receive() external payable +``` + +## ICasimirRecipient + ## MockFunctionsOracle ### constructor @@ -1775,16 +2002,6 @@ Sends a request (encoded as data) using the provided subscriptionId | ---- | ---- | ----------- | | requestId | bytes32 | A unique request identifier (unique per DON) | -## CasimirRecipient - -### receive - -```solidity -receive() external payable -``` - -## ICasimirRecipient - ## CasimirDAO ### owners diff --git a/contracts/ethereum/src/CasimirDAO.sol b/contracts/ethereum/src/CasimirDAO.sol index 24fbb4973..ae6a71754 100644 --- a/contracts/ethereum/src/CasimirDAO.sol +++ b/contracts/ethereum/src/CasimirDAO.sol @@ -3,16 +3,15 @@ pragma solidity 0.8.18; import './interfaces/ICasimirDAO.sol'; -// Todo enable adding and removing owners - contract CasimirDAO is ICasimirDAO { - address[] public owners; mapping(address => bool) public isOwner; uint public numConfirmationsRequired; - mapping(uint => mapping(address => bool)) public isConfirmed; + mapping(uint => mapping(address => bool)) public isOwnerChangeConfirmed; + mapping(uint => mapping(address => bool)) public isTransactionConfirmed; + OwnerChange[] public ownerChanges; Transaction[] public transactions; modifier onlyOwner() { @@ -20,22 +19,52 @@ contract CasimirDAO is ICasimirDAO { _; } - modifier txExists(uint _txIndex) { - require(_txIndex < transactions.length, "TX does not exist"); + modifier ownerChangeExists(uint256 changeId) { + require(changeId < ownerChanges.length, "Owner change does not exist"); + _; + } + + modifier ownerChangeNotExecuted(uint256 changeId) { + require( + !ownerChanges[changeId].executed, + "Owner change already executed" + ); + _; + } + + modifier ownerChangeNotConfirmed(uint256 changeId) { + require( + !isOwnerChangeConfirmed[changeId][msg.sender], + "Owner change already confirmed" + ); + _; + } + + modifier transactionExists(uint transactionIndex) { + require( + transactionIndex < transactions.length, + "Transaction does not exist" + ); _; } - modifier notExecuted(uint _txIndex) { - require(!transactions[_txIndex].executed, "TX already executed"); + modifier transactionNotExecuted(uint transactionIndex) { + require( + !transactions[transactionIndex].executed, + "Transaction already executed" + ); _; } - modifier notConfirmed(uint _txIndex) { - require(!isConfirmed[_txIndex][msg.sender], "TX already confirmed"); + modifier transactionNotConfirmed(uint transactionIndex) { + require( + !isTransactionConfirmed[transactionIndex][msg.sender], + "Transaction already confirmed" + ); _; } - constructor(address[] memory _owners, uint _numConfirmationsRequired) { + constructor(address[] memory _owners, uint256 _numConfirmationsRequired) { require(_owners.length > 0, "Owners required"); require( _numConfirmationsRequired > 0 && @@ -43,7 +72,7 @@ contract CasimirDAO is ICasimirDAO { "Invalid number of required confirmations" ); - for (uint i = 0; i < _owners.length; i++) { + for (uint256 i = 0; i < _owners.length; i++) { address owner = _owners[i]; require(owner != address(0), "Invalid owner"); @@ -60,44 +89,142 @@ contract CasimirDAO is ICasimirDAO { emit Deposit(msg.sender, msg.value, address(this).balance); } + function submitOwnerChange(address owner, bool add) public onlyOwner { + uint256 changeId = ownerChanges.length; + + ownerChanges.push( + OwnerChange({ + owner: owner, + add: add, + executed: false, + numConfirmations: 0 + }) + ); + + emit SubmitOwnerChange(msg.sender, changeId, add); + } + + function confirmOwnerChange( + uint256 changeId + ) + public + onlyOwner + ownerChangeExists(changeId) + ownerChangeNotExecuted(changeId) + ownerChangeNotConfirmed(changeId) + { + OwnerChange storage ownerChange = ownerChanges[changeId]; + ownerChange.numConfirmations += 1; + isOwnerChangeConfirmed[changeId][msg.sender] = true; + + emit ConfirmOwnerChange(msg.sender, changeId); + } + + function executeOwnerChange( + uint256 changeId + ) + public + onlyOwner + ownerChangeNotExecuted(changeId) + ownerChangeNotConfirmed(changeId) + { + OwnerChange storage ownerChange = ownerChanges[changeId]; + + require( + ownerChange.numConfirmations >= numConfirmationsRequired, + "Cannot execute owner change" + ); + + ownerChange.executed = true; + + if (ownerChange.add) { + isOwner[ownerChange.owner] = true; + owners.push(ownerChange.owner); + } else { + isOwner[ownerChange.owner] = false; + + for (uint256 i = 0; i < owners.length - 1; i++) { + if (owners[i] == ownerChange.owner) { + owners[i] = owners[owners.length - 1]; + break; + } + } + owners.pop(); + } + + emit ExecuteOwnerChange(msg.sender, changeId); + } + + function revokeOwnerChangeConfirmation( + uint256 changeId + ) + public + onlyOwner + ownerChangeExists(changeId) + ownerChangeNotExecuted(changeId) + { + OwnerChange storage ownerChange = ownerChanges[changeId]; + + require( + isOwnerChangeConfirmed[changeId][msg.sender], + "Owner change not confirmed" + ); + + ownerChange.numConfirmations -= 1; + isOwnerChangeConfirmed[changeId][msg.sender] = false; + + emit RevokeOwnerChangeConfirmation(msg.sender, changeId); + } + function submitTransaction( - address _to, - uint _value, - bytes memory _data + address to, + uint256 value, + bytes memory data ) public onlyOwner { - uint txIndex = transactions.length; + uint256 transactionIndex = transactions.length; transactions.push( Transaction({ - to: _to, - value: _value, - data: _data, + to: to, + value: value, + data: data, executed: false, numConfirmations: 0 }) ); - emit SubmitTransaction(msg.sender, txIndex, _to, _value, _data); + emit SubmitTransaction(msg.sender, transactionIndex, to, value, data); } function confirmTransaction( - uint _txIndex - ) public onlyOwner txExists(_txIndex) notExecuted(_txIndex) notConfirmed(_txIndex) { - Transaction storage transaction = transactions[_txIndex]; + uint256 transactionIndex + ) + public + onlyOwner + transactionExists(transactionIndex) + transactionNotExecuted(transactionIndex) + transactionNotConfirmed(transactionIndex) + { + Transaction storage transaction = transactions[transactionIndex]; transaction.numConfirmations += 1; - isConfirmed[_txIndex][msg.sender] = true; + isTransactionConfirmed[transactionIndex][msg.sender] = true; - emit ConfirmTransaction(msg.sender, _txIndex); + emit ConfirmTransaction(msg.sender, transactionIndex); } function executeTransaction( - uint _txIndex - ) public onlyOwner txExists(_txIndex) notExecuted(_txIndex) { - Transaction storage transaction = transactions[_txIndex]; + uint256 transactionIndex + ) + public + onlyOwner + transactionExists(transactionIndex) + transactionNotExecuted(transactionIndex) + { + Transaction storage transaction = transactions[transactionIndex]; require( transaction.numConfirmations >= numConfirmationsRequired, - "Cannot execute TX" + "Cannot execute Transaction" ); transaction.executed = true; @@ -105,46 +232,79 @@ contract CasimirDAO is ICasimirDAO { (bool success, ) = transaction.to.call{value: transaction.value}( transaction.data ); - require(success, "TX failed"); + require(success, "Transaction failed"); - emit ExecuteTransaction(msg.sender, _txIndex); + emit ExecuteTransaction(msg.sender, transactionIndex); } - function revokeConfirmation( - uint _txIndex - ) public onlyOwner txExists(_txIndex) notExecuted(_txIndex) { - Transaction storage transaction = transactions[_txIndex]; + function revokeTransactionConfirmation( + uint256 transactionIndex + ) + public + onlyOwner + transactionExists(transactionIndex) + transactionNotExecuted(transactionIndex) + { + Transaction storage transaction = transactions[transactionIndex]; - require(isConfirmed[_txIndex][msg.sender], "TX not confirmed"); + require( + isTransactionConfirmed[transactionIndex][msg.sender], + "Transaction not confirmed" + ); transaction.numConfirmations -= 1; - isConfirmed[_txIndex][msg.sender] = false; + isTransactionConfirmed[transactionIndex][msg.sender] = false; - emit RevokeConfirmation(msg.sender, _txIndex); + emit RevokeTransactionConfirmation(msg.sender, transactionIndex); } function getOwners() public view returns (address[] memory) { return owners; } - function getTransactionCount() public view returns (uint) { + function getOwnerChangeCount() public view returns (uint256) { + return ownerChanges.length; + } + + function getOwnerChange( + uint256 changeId + ) + public + view + returns ( + address owner, + bool add, + bool executed, + uint256 numConfirmations + ) + { + OwnerChange storage ownerChange = ownerChanges[changeId]; + return ( + ownerChange.owner, + ownerChange.add, + ownerChange.executed, + ownerChange.numConfirmations + ); + } + + function getTransactionCount() public view returns (uint256) { return transactions.length; } function getTransaction( - uint _txIndex + uint256 transactionIndex ) public view returns ( address to, - uint value, + uint256 value, bytes memory data, bool executed, - uint numConfirmations + uint256 numConfirmations ) { - Transaction storage transaction = transactions[_txIndex]; + Transaction storage transaction = transactions[transactionIndex]; return ( transaction.to, transaction.value, diff --git a/contracts/ethereum/src/CasimirRegistry.sol b/contracts/ethereum/src/CasimirRegistry.sol index 009195815..7cefe33f7 100644 --- a/contracts/ethereum/src/CasimirRegistry.sol +++ b/contracts/ethereum/src/CasimirRegistry.sol @@ -54,51 +54,32 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { } /** - * @notice Request to deregister an operator from the set + * @notice Deposit collateral for an operator * @param operatorId The operator ID */ - function requestOperatorDeregistration(uint64 operatorId) external { + function depositCollateral(uint64 operatorId) external payable { + require(msg.value > minimumCollateralDeposit, "Insufficient collateral deposit"); Operator storage operator = operators[operatorId]; - require(operator.collateral >= 0, "Operator owes collateral"); (address operatorOwner, , , ,) = ssvNetworkViews.getOperatorById(operatorId); - require(msg.sender == operatorOwner, "Only operator owner can request deregister"); - - operator.deregistering = true; - - emit DeregistrationRequested(operatorId); - } - - /** - * @notice Deregister an operator from the set - * @param operatorId The operator ID - */ - function deregisterOperator(uint64 operatorId) external { - require(msg.sender == address(manager), "Only manager can deregister operators"); - Operator storage operator = operators[operatorId]; - require(operator.collateral >= 0, "Operator owes collateral"); - - (address operatorOwner, , , ,) = ssvNetworkViews.getOperatorById(operatorId); - - delete operators[operatorId]; - - if (operator.collateral > 0) { - operatorOwner.send(uint256(operator.collateral)); - } + require(msg.sender == operatorOwner, "Only operator owner can deposit collateral"); - emit DeregistrationCompleted(operatorId); + operator.collateral += int256(msg.value); } /** - * @notice Deposit collateral for an operator + * @notice Withdraw collateral for an operator * @param operatorId The operator ID + * @param amount The amount to withdraw */ - function depositCollateral(uint64 operatorId) external payable { - require(msg.value > minimumCollateralDeposit, "Insufficient collateral deposit"); + function withdrawCollateral(uint64 operatorId, uint256 amount) external { Operator storage operator = operators[operatorId]; (address operatorOwner, , , ,) = ssvNetworkViews.getOperatorById(operatorId); - require(msg.sender == operatorOwner, "Only operator owner can deposit collateral"); + require(msg.sender == operatorOwner, "Only operator owner can withdraw collateral"); + require(operator.collateral >= int256(amount), "Insufficient collateral"); - operator.collateral += int256(msg.value); + operator.collateral -= int256(amount); + totalCollateral -= amount; + operatorOwner.send(amount); } /** diff --git a/contracts/ethereum/src/interfaces/ICasimirDAO.sol b/contracts/ethereum/src/interfaces/ICasimirDAO.sol index ed90fb64d..62f223af7 100644 --- a/contracts/ethereum/src/interfaces/ICasimirDAO.sol +++ b/contracts/ethereum/src/interfaces/ICasimirDAO.sol @@ -3,6 +3,14 @@ pragma solidity 0.8.18; interface ICasimirDAO { event Deposit(address indexed sender, uint amount, uint balance); + event SubmitOwnerChange( + address indexed owner, + uint256 changeId, + bool add + ); + event ConfirmOwnerChange(address indexed owner, uint256 changeId); + event RevokeOwnerChangeConfirmation(address indexed owner, uint256 changeId); + event ExecuteOwnerChange(address indexed owner, uint256 changeId); event SubmitTransaction( address indexed owner, uint indexed txIndex, @@ -11,9 +19,16 @@ interface ICasimirDAO { bytes data ); event ConfirmTransaction(address indexed owner, uint indexed txIndex); - event RevokeConfirmation(address indexed owner, uint indexed txIndex); + event RevokeTransactionConfirmation(address indexed owner, uint indexed txIndex); event ExecuteTransaction(address indexed owner, uint indexed txIndex); + struct OwnerChange { + address owner; + bool add; + bool executed; + uint numConfirmations; + } + struct Transaction { address to; uint value; @@ -24,38 +39,69 @@ interface ICasimirDAO { receive() external payable; + function submitOwnerChange( + address owner, + bool add + ) external; + + function confirmOwnerChange( + uint256 changeId + ) external; + + function executeOwnerChange( + uint256 changeId + ) external; + + function revokeOwnerChangeConfirmation( + uint256 changeId + ) external; + function submitTransaction( - address _to, - uint _value, - bytes memory _data + address to, + uint value, + bytes memory data ) external; function confirmTransaction( - uint _txIndex + uint256 transactionIndex ) external; function executeTransaction( - uint _txIndex + uint256 transactionIndex ) external; - function revokeConfirmation( - uint _txIndex + function revokeTransactionConfirmation( + uint256 transactionIndex ) external; function getOwners() external view returns (address[] memory); - function getTransactionCount() external view returns (uint); + function getOwnerChangeCount() external view returns (uint256); + + function getOwnerChange( + uint256 changeId + ) + external + view + returns ( + address owner, + bool add, + bool executed, + uint256 numConfirmations + ); + + function getTransactionCount() external view returns (uint256); function getTransaction( - uint _txIndex + uint256 transactionIndex ) external view returns ( address to, - uint value, + uint256 value, bytes memory data, bool executed, - uint numConfirmations + uint256 numConfirmations ); } \ No newline at end of file diff --git a/contracts/ethereum/src/interfaces/ICasimirRegistry.sol b/contracts/ethereum/src/interfaces/ICasimirRegistry.sol index b520b7dd7..52d39329a 100644 --- a/contracts/ethereum/src/interfaces/ICasimirRegistry.sol +++ b/contracts/ethereum/src/interfaces/ICasimirRegistry.sol @@ -18,12 +18,10 @@ interface ICasimirRegistry { function registerOperator(uint64 operatorId) external payable; - function requestOperatorDeregistration(uint64 operatorId) external; - - function deregisterOperator(uint64 operatorId) external; - function depositCollateral(uint64 operatorId) external payable; + function withdrawCollateral(uint64 operatorId, uint256 amount) external; + function addActivePool(uint32 poolId, uint64 operatorId) external; function removeActivePool(uint32 poolId, uint64 operatorId, uint256 blameAmount) external; From a6f38f8260b0ab246dc0786b719ff0d38ed43915 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Mon, 5 Jun 2023 00:21:07 -0400 Subject: [PATCH 47/78] Add keeper registrar --- contracts/ethereum/docs/index.md | 582 +++++++++++------- contracts/ethereum/hardhat.config.ts | 10 +- contracts/ethereum/scripts/dev.ts | 7 +- contracts/ethereum/src/CasimirManager.sol | 17 +- contracts/ethereum/src/CasimirUpkeep.sol | 46 +- .../interfaces/KeeperRegistrarInterface.sol | 27 + contracts/ethereum/test/fixtures/shared.ts | 7 +- 7 files changed, 438 insertions(+), 258 deletions(-) create mode 100644 contracts/ethereum/src/vendor/interfaces/KeeperRegistrarInterface.sol diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index bbd8ffdf3..6710a42db 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -1,5 +1,181 @@ # Solidity API +## CasimirDAO + +### owners + +```solidity +address[] owners +``` + +### isOwner + +```solidity +mapping(address => bool) isOwner +``` + +### numConfirmationsRequired + +```solidity +uint256 numConfirmationsRequired +``` + +### isOwnerChangeConfirmed + +```solidity +mapping(uint256 => mapping(address => bool)) isOwnerChangeConfirmed +``` + +### isTransactionConfirmed + +```solidity +mapping(uint256 => mapping(address => bool)) isTransactionConfirmed +``` + +### ownerChanges + +```solidity +struct ICasimirDAO.OwnerChange[] ownerChanges +``` + +### transactions + +```solidity +struct ICasimirDAO.Transaction[] transactions +``` + +### onlyOwner + +```solidity +modifier onlyOwner() +``` + +### ownerChangeExists + +```solidity +modifier ownerChangeExists(uint256 changeId) +``` + +### ownerChangeNotExecuted + +```solidity +modifier ownerChangeNotExecuted(uint256 changeId) +``` + +### ownerChangeNotConfirmed + +```solidity +modifier ownerChangeNotConfirmed(uint256 changeId) +``` + +### transactionExists + +```solidity +modifier transactionExists(uint256 transactionIndex) +``` + +### transactionNotExecuted + +```solidity +modifier transactionNotExecuted(uint256 transactionIndex) +``` + +### transactionNotConfirmed + +```solidity +modifier transactionNotConfirmed(uint256 transactionIndex) +``` + +### constructor + +```solidity +constructor(address[] _owners, uint256 _numConfirmationsRequired) public +``` + +### receive + +```solidity +receive() external payable +``` + +### submitOwnerChange + +```solidity +function submitOwnerChange(address owner, bool add) public +``` + +### confirmOwnerChange + +```solidity +function confirmOwnerChange(uint256 changeId) public +``` + +### executeOwnerChange + +```solidity +function executeOwnerChange(uint256 changeId) public +``` + +### revokeOwnerChangeConfirmation + +```solidity +function revokeOwnerChangeConfirmation(uint256 changeId) public +``` + +### submitTransaction + +```solidity +function submitTransaction(address to, uint256 value, bytes data) public +``` + +### confirmTransaction + +```solidity +function confirmTransaction(uint256 transactionIndex) public +``` + +### executeTransaction + +```solidity +function executeTransaction(uint256 transactionIndex) public +``` + +### revokeTransactionConfirmation + +```solidity +function revokeTransactionConfirmation(uint256 transactionIndex) public +``` + +### getOwners + +```solidity +function getOwners() public view returns (address[]) +``` + +### getOwnerChangeCount + +```solidity +function getOwnerChangeCount() public view returns (uint256) +``` + +### getOwnerChange + +```solidity +function getOwnerChange(uint256 changeId) public view returns (address owner, bool add, bool executed, uint256 numConfirmations) +``` + +### getTransactionCount + +```solidity +function getTransactionCount() public view returns (uint256) +``` + +### getTransaction + +```solidity +function getTransaction(uint256 transactionIndex) public view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) +``` + ## CasimirManager ### finalizableCompletedExits @@ -866,27 +1042,13 @@ Register an operator with the set | ---- | ---- | ----------- | | operatorId | uint64 | The operator ID | -### requestOperatorDeregistration - -```solidity -function requestOperatorDeregistration(uint64 operatorId) external -``` - -Request to deregister an operator from the set - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | - -### deregisterOperator +### depositCollateral ```solidity -function deregisterOperator(uint64 operatorId) external +function depositCollateral(uint64 operatorId) external payable ``` -Deregister an operator from the set +Deposit collateral for an operator #### Parameters @@ -894,19 +1056,20 @@ Deregister an operator from the set | ---- | ---- | ----------- | | operatorId | uint64 | The operator ID | -### depositCollateral +### withdrawCollateral ```solidity -function depositCollateral(uint64 operatorId) external payable +function withdrawCollateral(uint64 operatorId, uint256 amount) external ``` -Deposit collateral for an operator +Withdraw collateral for an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | | operatorId | uint64 | The operator ID | +| amount | uint256 | The amount to withdraw | ### addActivePool @@ -1166,6 +1329,169 @@ Fulfill the request for testing | response | bytes | Aggregated response from the user code | | err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | +## ICasimirDAO + +### Deposit + +```solidity +event Deposit(address sender, uint256 amount, uint256 balance) +``` + +### SubmitOwnerChange + +```solidity +event SubmitOwnerChange(address owner, uint256 changeId, bool add) +``` + +### ConfirmOwnerChange + +```solidity +event ConfirmOwnerChange(address owner, uint256 changeId) +``` + +### RevokeOwnerChangeConfirmation + +```solidity +event RevokeOwnerChangeConfirmation(address owner, uint256 changeId) +``` + +### ExecuteOwnerChange + +```solidity +event ExecuteOwnerChange(address owner, uint256 changeId) +``` + +### SubmitTransaction + +```solidity +event SubmitTransaction(address owner, uint256 txIndex, address to, uint256 value, bytes data) +``` + +### ConfirmTransaction + +```solidity +event ConfirmTransaction(address owner, uint256 txIndex) +``` + +### RevokeTransactionConfirmation + +```solidity +event RevokeTransactionConfirmation(address owner, uint256 txIndex) +``` + +### ExecuteTransaction + +```solidity +event ExecuteTransaction(address owner, uint256 txIndex) +``` + +### OwnerChange + +```solidity +struct OwnerChange { + address owner; + bool add; + bool executed; + uint256 numConfirmations; +} +``` + +### Transaction + +```solidity +struct Transaction { + address to; + uint256 value; + bytes data; + bool executed; + uint256 numConfirmations; +} +``` + +### receive + +```solidity +receive() external payable +``` + +### submitOwnerChange + +```solidity +function submitOwnerChange(address owner, bool add) external +``` + +### confirmOwnerChange + +```solidity +function confirmOwnerChange(uint256 changeId) external +``` + +### executeOwnerChange + +```solidity +function executeOwnerChange(uint256 changeId) external +``` + +### revokeOwnerChangeConfirmation + +```solidity +function revokeOwnerChangeConfirmation(uint256 changeId) external +``` + +### submitTransaction + +```solidity +function submitTransaction(address to, uint256 value, bytes data) external +``` + +### confirmTransaction + +```solidity +function confirmTransaction(uint256 transactionIndex) external +``` + +### executeTransaction + +```solidity +function executeTransaction(uint256 transactionIndex) external +``` + +### revokeTransactionConfirmation + +```solidity +function revokeTransactionConfirmation(uint256 transactionIndex) external +``` + +### getOwners + +```solidity +function getOwners() external view returns (address[]) +``` + +### getOwnerChangeCount + +```solidity +function getOwnerChangeCount() external view returns (uint256) +``` + +### getOwnerChange + +```solidity +function getOwnerChange(uint256 changeId) external view returns (address owner, bool add, bool executed, uint256 numConfirmations) +``` + +### getTransactionCount + +```solidity +function getTransactionCount() external view returns (uint256) +``` + +### getTransaction + +```solidity +function getTransaction(uint256 transactionIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) +``` + ## ICasimirManager ### Token @@ -1662,22 +1988,16 @@ struct Operator { function registerOperator(uint64 operatorId) external payable ``` -### requestOperatorDeregistration - -```solidity -function requestOperatorDeregistration(uint64 operatorId) external -``` - -### deregisterOperator +### depositCollateral ```solidity -function deregisterOperator(uint64 operatorId) external +function depositCollateral(uint64 operatorId) external payable ``` -### depositCollateral +### withdrawCollateral ```solidity -function depositCollateral(uint64 operatorId) external payable +function withdrawCollateral(uint64 operatorId, uint256 amount) external ``` ### addActivePool @@ -2002,205 +2322,3 @@ Sends a request (encoded as data) using the provided subscriptionId | ---- | ---- | ----------- | | requestId | bytes32 | A unique request identifier (unique per DON) | -## CasimirDAO - -### owners - -```solidity -address[] owners -``` - -### isOwner - -```solidity -mapping(address => bool) isOwner -``` - -### numConfirmationsRequired - -```solidity -uint256 numConfirmationsRequired -``` - -### isConfirmed - -```solidity -mapping(uint256 => mapping(address => bool)) isConfirmed -``` - -### transactions - -```solidity -struct ICasimirDAO.Transaction[] transactions -``` - -### onlyOwner - -```solidity -modifier onlyOwner() -``` - -### txExists - -```solidity -modifier txExists(uint256 _txIndex) -``` - -### notExecuted - -```solidity -modifier notExecuted(uint256 _txIndex) -``` - -### notConfirmed - -```solidity -modifier notConfirmed(uint256 _txIndex) -``` - -### constructor - -```solidity -constructor(address[] _owners, uint256 _numConfirmationsRequired) public -``` - -### receive - -```solidity -receive() external payable -``` - -### submitTransaction - -```solidity -function submitTransaction(address _to, uint256 _value, bytes _data) public -``` - -### confirmTransaction - -```solidity -function confirmTransaction(uint256 _txIndex) public -``` - -### executeTransaction - -```solidity -function executeTransaction(uint256 _txIndex) public -``` - -### revokeConfirmation - -```solidity -function revokeConfirmation(uint256 _txIndex) public -``` - -### getOwners - -```solidity -function getOwners() public view returns (address[]) -``` - -### getTransactionCount - -```solidity -function getTransactionCount() public view returns (uint256) -``` - -### getTransaction - -```solidity -function getTransaction(uint256 _txIndex) public view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) -``` - -## ICasimirDAO - -### Deposit - -```solidity -event Deposit(address sender, uint256 amount, uint256 balance) -``` - -### SubmitTransaction - -```solidity -event SubmitTransaction(address owner, uint256 txIndex, address to, uint256 value, bytes data) -``` - -### ConfirmTransaction - -```solidity -event ConfirmTransaction(address owner, uint256 txIndex) -``` - -### RevokeConfirmation - -```solidity -event RevokeConfirmation(address owner, uint256 txIndex) -``` - -### ExecuteTransaction - -```solidity -event ExecuteTransaction(address owner, uint256 txIndex) -``` - -### Transaction - -```solidity -struct Transaction { - address to; - uint256 value; - bytes data; - bool executed; - uint256 numConfirmations; -} -``` - -### receive - -```solidity -receive() external payable -``` - -### submitTransaction - -```solidity -function submitTransaction(address _to, uint256 _value, bytes _data) external -``` - -### confirmTransaction - -```solidity -function confirmTransaction(uint256 _txIndex) external -``` - -### executeTransaction - -```solidity -function executeTransaction(uint256 _txIndex) external -``` - -### revokeConfirmation - -```solidity -function revokeConfirmation(uint256 _txIndex) external -``` - -### getOwners - -```solidity -function getOwners() external view returns (address[]) -``` - -### getTransactionCount - -```solidity -function getTransactionCount() external view returns (uint256) -``` - -### getTransaction - -```solidity -function getTransaction(uint256 _txIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) -``` - diff --git a/contracts/ethereum/hardhat.config.ts b/contracts/ethereum/hardhat.config.ts index ad2150a5f..0d1608fdf 100644 --- a/contracts/ethereum/hardhat.config.ts +++ b/contracts/ethereum/hardhat.config.ts @@ -27,8 +27,9 @@ const externalEnv = { mainnet: { ORACLE_ADDRESS: '0x0000000000000000000000000000000000000000', BEACON_DEPOSIT_ADDRESS: '0x00000000219ab540356cBB839Cbe05303d7705Fa', - FUNCTIONS_ADDRESS: '0x0000000000000000000000000000000000000000', - FUNCTIONS_SUBSCRIPTION_ID: '1', + LINK_FUNCTIONS_ADDRESS: '0x0000000000000000000000000000000000000000', + LINK_REGISTRAR_ADDRESS: '0xE16Df59B887e3Caa439E0b29B42bA2e7976FD8b2', + LINK_SUBSCRIPTION_ID: '1', LINK_TOKEN_ADDRESS: '0x514910771AF9Ca656af840dff83E8264EcF986CA', SSV_NETWORK_ADDRESS: '0xAfdb141Dd99b5a101065f40e3D7636262dce65b3', SSV_NETWORK_VIEWS_ADDRESS: '0x8dB45282d7C4559fd093C26f677B3837a5598914', @@ -40,8 +41,9 @@ const externalEnv = { goerli: { ORACLE_ADDRESS: '0x0000000000000000000000000000000000000000', BEACON_DEPOSIT_ADDRESS: '0x07b39F4fDE4A38bACe212b546dAc87C58DfE3fDC', - FUNCTIONS_ADDRESS: '0x3de1bE9407645533CD0CbeCf88dFE5297E7125e6', - FUNCTIONS_SUBSCRIPTION_ID: '1', + LINK_FUNCTIONS_ADDRESS: '0x3de1bE9407645533CD0CbeCf88dFE5297E7125e6', + LINK_REGISTRAR_ADDRESS: '0xE16Df59B887e3Caa439E0b29B42bA2e7976FD8b2', + LINK_SUBSCRIPTION_ID: '1', LINK_TOKEN_ADDRESS: '0x326C977E6efc84E512bB9C30f76E30c160eD06FB', SSV_NETWORK_ADDRESS: '0xAfdb141Dd99b5a101065f40e3D7636262dce65b3', SSV_NETWORK_VIEWS_ADDRESS: '0x8dB45282d7C4559fd093C26f677B3837a5598914', diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 56d7b4dd1..3775bfba2 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -17,8 +17,9 @@ void async function () { args: { oracleAddress: oracle.address || process.env.ORACLE_ADDRESS, beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, - functionsAddress: process.env.FUNCTIONS_ADDRESS, - functionsSubscriptionId: process.env.FUNCTIONS_SUBSCRIPTION_ID, + linkFunctionsAddress: process.env.LINK_FUNCTIONS_ADDRESS, + linkRegistryAddress: process.env.LINK_REGISTRY_ADDRESS, + linkSubscriptionId: process.env.LINK_SUBSCRIPTION_ID, linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, ssvNetworkViewsAddress: process.env.SSV_NETWORK_VIEWS_ADDRESS, @@ -50,7 +51,7 @@ void async function () { /** Link mock external contracts to Casimir */ if (name === 'CasimirManager') { - (config[name as keyof typeof config] as ContractConfig).args.functionsAddress = config.MockFunctionsOracle?.address + (config[name as keyof typeof config] as ContractConfig).args.linkFunctionsAddress = config.MockFunctionsOracle?.address } const { args, options, proxy } = config[name as keyof typeof config] as ContractConfig diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index 08e2800fa..9b28f594f 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -216,8 +216,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Constructor * @param _oracleAddress The manager oracle address * @param beaconDepositAddress The Beacon deposit address - * @param functionsAddress The Chainlink functions oracle address - * @param functionsSubscriptionId The Chainlink functions subscription ID + * @param linkFunctionsAddress The Chainlink functions oracle address + * @param linkRegistrarAddress The Chainlink keeper registrar address + * @param linkSubscriptionId The Chainlink functions subscription ID * @param linkTokenAddress The Chainlink token address * @param ssvNetworkAddress The SSV network address * @param ssvNetworkViewsAddress The SSV network views address @@ -229,8 +230,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { constructor( address _oracleAddress, address beaconDepositAddress, - address functionsAddress, - uint32 functionsSubscriptionId, + address linkFunctionsAddress, + address linkRegistrarAddress, + uint32 linkSubscriptionId, address linkTokenAddress, address ssvNetworkAddress, address ssvNetworkViewsAddress, @@ -251,7 +253,12 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { tokenAddresses[Token.WETH] = wethTokenAddress; registry = new CasimirRegistry(ssvNetworkViewsAddress); - upkeep = new CasimirUpkeep(functionsAddress, functionsSubscriptionId); + upkeep = new CasimirUpkeep( + linkFunctionsAddress, + linkRegistrarAddress, + linkSubscriptionId, + linkTokenAddress + ); } /** diff --git a/contracts/ethereum/src/CasimirUpkeep.sol b/contracts/ethereum/src/CasimirUpkeep.sol index c7f11a84c..2aab7d4a9 100644 --- a/contracts/ethereum/src/CasimirUpkeep.sol +++ b/contracts/ethereum/src/CasimirUpkeep.sol @@ -3,7 +3,9 @@ pragma solidity 0.8.18; import "./interfaces/ICasimirUpkeep.sol"; import "./interfaces/ICasimirManager.sol"; +import "./vendor/interfaces/KeeperRegistrarInterface.sol"; import {Functions, FunctionsClient} from "@chainlink/contracts/src/v0.8/dev/functions/FunctionsClient.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; // Dev-only imports @@ -34,11 +36,17 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /** Manager contract */ ICasimirManager private immutable manager; + /** Keeper registrar contract */ + KeeperRegistrarInterface private immutable linkRegistrar; + /** LINK ERC-20 token contract */ + IERC20 private immutable linkToken; /********************/ /* Dynamic State */ /********************/ + /** Upkeep ID */ + uint256 private upkeepId; /** Current report status */ ReportStatus private reportStatus; /** Current report period */ @@ -74,7 +82,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /** Fulfillment gas limit */ uint32 fulfillGasLimit; /** Functions subscription ID */ - uint64 private functionsSubscriptionId; + uint64 private linkSubscriptionId; /***************/ /* Constructor */ @@ -82,15 +90,31 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /** * Constructor - * @param functionsOracleAddress The functions oracle contract address - * @param _functionsSubscriptionId The functions subscription ID + * @param linkFunctionsAddress The functions oracle contract address + * @param linkRegistrarAddress The keeper registrar address + * @param _linkSubscriptionId The functions subscription ID + * @param linkTokenAddress The LINK token address */ constructor( - address functionsOracleAddress, - uint64 _functionsSubscriptionId - ) FunctionsClient(functionsOracleAddress) { + address linkFunctionsAddress, + address linkRegistrarAddress, + uint64 _linkSubscriptionId, + address linkTokenAddress + ) FunctionsClient(linkFunctionsAddress) { manager = ICasimirManager(msg.sender); - functionsSubscriptionId = _functionsSubscriptionId; + linkRegistrar = KeeperRegistrarInterface(linkRegistrarAddress); + linkToken = IERC20(linkTokenAddress); + linkSubscriptionId = _linkSubscriptionId; + } + + function registerAndPredictID(KeeperRegistrarInterface.RegistrationParams memory params) public { + // LINK must be approved for transfer - this can be done every time or once + // with an infinite approval + linkToken.approve(address(linkRegistrar), params.amount); + upkeepId = linkRegistrar.registerUpkeep(params); + if (upkeepId == 0) { + revert("Registration failed"); + } } /** @@ -122,16 +146,16 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /** * @notice Set the bytes representing the CBOR-encoded Functions.Request * @param _fulfillGasLimit Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function - * @param _functionsSubscriptionId The functions billing subscription ID used to pay for Functions requests + * @param linkSubscriptionId The functions billing subscription ID used to pay for Functions requests * @param _requestCBOR Bytes representing the CBOR-encoded Functions.Request */ function setRequest( uint32 _fulfillGasLimit, - uint64 _functionsSubscriptionId, + uint64 linkSubscriptionId, bytes calldata _requestCBOR ) external onlyOwner { fulfillGasLimit = _fulfillGasLimit; - functionsSubscriptionId = _functionsSubscriptionId; + linkSubscriptionId = linkSubscriptionId; requestCBOR = _requestCBOR; } @@ -174,7 +198,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { Functions.Request memory req; reportRemainingRequests = 2; for (uint256 i = 0; i < reportRemainingRequests; i++) { - bytes32 requestId = sendRequest(req, functionsSubscriptionId, fulfillGasLimit); + bytes32 requestId = sendRequest(req, linkSubscriptionId, fulfillGasLimit); reportRequests[requestId] = RequestType(i + 1); } } else { diff --git a/contracts/ethereum/src/vendor/interfaces/KeeperRegistrarInterface.sol b/contracts/ethereum/src/vendor/interfaces/KeeperRegistrarInterface.sol new file mode 100644 index 000000000..3ee63ca9d --- /dev/null +++ b/contracts/ethereum/src/vendor/interfaces/KeeperRegistrarInterface.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; + +interface KeeperRegistrarInterface { + /***********/ + /* Structs */ + /***********/ + + struct RegistrationParams { + string name; + bytes encryptedEmail; + address upkeepContract; + uint32 gasLimit; + address adminAddress; + bytes checkData; + bytes offchainConfig; + uint96 amount; + } + + /*************/ + /* Functions */ + /*************/ + + function registerUpkeep( + RegistrationParams calldata requestParams + ) external returns (uint256); +} \ No newline at end of file diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 649c87b9f..1be582749 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -17,8 +17,9 @@ export async function deploymentFixture() { args: { oracleAddress: oracle.address || process.env.ORACLE_ADDRESS, beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, - functionsAddress: process.env.FUNCTIONS_ADDRESS, - functionsSubscriptionId: process.env.FUNCTIONS_SUBSCRIPTION_ID, + linkFunctionsAddress: process.env.LINK_FUNCTIONS_ADDRESS, + linkRegistryAddress: process.env.LINK_REGISTRY_ADDRESS, + linkSubscriptionId: process.env.LINK_SUBSCRIPTION_ID, linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, ssvNetworkViewsAddress: process.env.SSV_NETWORK_VIEWS_ADDRESS, @@ -50,7 +51,7 @@ export async function deploymentFixture() { /** Link mock external contracts to Casimir */ if (name === 'CasimirManager') { - (config[name as keyof typeof config] as ContractConfig).args.functionsAddress = config.MockFunctionsOracle?.address + (config[name as keyof typeof config] as ContractConfig).args.linkFunctionsAddress = config.MockFunctionsOracle?.address } const { args, options, proxy } = config[name as keyof typeof config] as ContractConfig From 56d0df4c96a352b72269c5ebe3d433335529ce85 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Mon, 5 Jun 2023 00:25:41 -0400 Subject: [PATCH 48/78] Fix deploy input args --- contracts/ethereum/docs/index.md | 808 +++++++++++---------- contracts/ethereum/scripts/dev.ts | 2 +- contracts/ethereum/src/CasimirUpkeep.sol | 4 +- contracts/ethereum/test/fixtures/shared.ts | 2 +- 4 files changed, 423 insertions(+), 393 deletions(-) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 6710a42db..bf749e339 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -1,181 +1,5 @@ # Solidity API -## CasimirDAO - -### owners - -```solidity -address[] owners -``` - -### isOwner - -```solidity -mapping(address => bool) isOwner -``` - -### numConfirmationsRequired - -```solidity -uint256 numConfirmationsRequired -``` - -### isOwnerChangeConfirmed - -```solidity -mapping(uint256 => mapping(address => bool)) isOwnerChangeConfirmed -``` - -### isTransactionConfirmed - -```solidity -mapping(uint256 => mapping(address => bool)) isTransactionConfirmed -``` - -### ownerChanges - -```solidity -struct ICasimirDAO.OwnerChange[] ownerChanges -``` - -### transactions - -```solidity -struct ICasimirDAO.Transaction[] transactions -``` - -### onlyOwner - -```solidity -modifier onlyOwner() -``` - -### ownerChangeExists - -```solidity -modifier ownerChangeExists(uint256 changeId) -``` - -### ownerChangeNotExecuted - -```solidity -modifier ownerChangeNotExecuted(uint256 changeId) -``` - -### ownerChangeNotConfirmed - -```solidity -modifier ownerChangeNotConfirmed(uint256 changeId) -``` - -### transactionExists - -```solidity -modifier transactionExists(uint256 transactionIndex) -``` - -### transactionNotExecuted - -```solidity -modifier transactionNotExecuted(uint256 transactionIndex) -``` - -### transactionNotConfirmed - -```solidity -modifier transactionNotConfirmed(uint256 transactionIndex) -``` - -### constructor - -```solidity -constructor(address[] _owners, uint256 _numConfirmationsRequired) public -``` - -### receive - -```solidity -receive() external payable -``` - -### submitOwnerChange - -```solidity -function submitOwnerChange(address owner, bool add) public -``` - -### confirmOwnerChange - -```solidity -function confirmOwnerChange(uint256 changeId) public -``` - -### executeOwnerChange - -```solidity -function executeOwnerChange(uint256 changeId) public -``` - -### revokeOwnerChangeConfirmation - -```solidity -function revokeOwnerChangeConfirmation(uint256 changeId) public -``` - -### submitTransaction - -```solidity -function submitTransaction(address to, uint256 value, bytes data) public -``` - -### confirmTransaction - -```solidity -function confirmTransaction(uint256 transactionIndex) public -``` - -### executeTransaction - -```solidity -function executeTransaction(uint256 transactionIndex) public -``` - -### revokeTransactionConfirmation - -```solidity -function revokeTransactionConfirmation(uint256 transactionIndex) public -``` - -### getOwners - -```solidity -function getOwners() public view returns (address[]) -``` - -### getOwnerChangeCount - -```solidity -function getOwnerChangeCount() public view returns (uint256) -``` - -### getOwnerChange - -```solidity -function getOwnerChange(uint256 changeId) public view returns (address owner, bool add, bool executed, uint256 numConfirmations) -``` - -### getTransactionCount - -```solidity -function getTransactionCount() public view returns (uint256) -``` - -### getTransaction - -```solidity -function getTransaction(uint256 transactionIndex) public view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) -``` - ## CasimirManager ### finalizableCompletedExits @@ -251,7 +75,7 @@ _Validate a distribution_ ### constructor ```solidity -constructor(address _oracleAddress, address beaconDepositAddress, address functionsAddress, uint32 functionsSubscriptionId, address linkTokenAddress, address ssvNetworkAddress, address ssvNetworkViewsAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public +constructor(address _oracleAddress, address beaconDepositAddress, address linkFunctionsAddress, address linkRegistrarAddress, uint32 linkSubscriptionId, address linkTokenAddress, address ssvNetworkAddress, address ssvNetworkViewsAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public ``` Constructor @@ -262,8 +86,9 @@ Constructor | ---- | ---- | ----------- | | _oracleAddress | address | The manager oracle address | | beaconDepositAddress | address | The Beacon deposit address | -| functionsAddress | address | The Chainlink functions oracle address | -| functionsSubscriptionId | uint32 | The Chainlink functions subscription ID | +| linkFunctionsAddress | address | The Chainlink functions oracle address | +| linkRegistrarAddress | address | The Chainlink keeper registrar address | +| linkSubscriptionId | uint32 | The Chainlink functions subscription ID | | linkTokenAddress | address | The Chainlink token address | | ssvNetworkAddress | address | The SSV network address | | ssvNetworkViewsAddress | address | The SSV network views address | @@ -1199,7 +1024,7 @@ Fulfillment gas limit ### constructor ```solidity -constructor(address functionsOracleAddress, uint64 _functionsSubscriptionId) public +constructor(address linkFunctionsAddress, address linkRegistrarAddress, uint64 _linkSubscriptionId, address linkTokenAddress) public ``` Constructor @@ -1208,8 +1033,16 @@ Constructor | Name | Type | Description | | ---- | ---- | ----------- | -| functionsOracleAddress | address | The functions oracle contract address | -| _functionsSubscriptionId | uint64 | The functions subscription ID | +| linkFunctionsAddress | address | The functions oracle contract address | +| linkRegistrarAddress | address | The keeper registrar address | +| _linkSubscriptionId | uint64 | The functions subscription ID | +| linkTokenAddress | address | The LINK token address | + +### registerAndPredictID + +```solidity +function registerAndPredictID(struct KeeperRegistrarInterface.RegistrationParams params) public +``` ### generateRequest @@ -1230,7 +1063,7 @@ Generate a new Functions.Request(off-chain, saving gas) ### setRequest ```solidity -function setRequest(uint32 _fulfillGasLimit, uint64 _functionsSubscriptionId, bytes _requestCBOR) external +function setRequest(uint32 _fulfillGasLimit, uint64 linkSubscriptionId, bytes _requestCBOR) external ``` Set the bytes representing the CBOR-encoded Functions.Request @@ -1240,7 +1073,7 @@ Set the bytes representing the CBOR-encoded Functions.Request | Name | Type | Description | | ---- | ---- | ----------- | | _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | -| _functionsSubscriptionId | uint64 | The functions billing subscription ID used to pay for Functions requests | +| linkSubscriptionId | uint64 | The functions billing subscription ID used to pay for Functions requests | | _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | ### checkUpkeep @@ -1329,255 +1162,92 @@ Fulfill the request for testing | response | bytes | Aggregated response from the user code | | err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | -## ICasimirDAO +## ICasimirManager -### Deposit +### Token ```solidity -event Deposit(address sender, uint256 amount, uint256 balance) +enum Token { + LINK, + SSV, + WETH +} ``` -### SubmitOwnerChange +### PoolDetails ```solidity -event SubmitOwnerChange(address owner, uint256 changeId, bool add) +struct PoolDetails { + uint32 id; + uint256 balance; + bytes publicKey; + uint64[] operatorIds; + enum ICasimirPool.PoolStatus status; +} ``` -### ConfirmOwnerChange +### User ```solidity -event ConfirmOwnerChange(address owner, uint256 changeId) +struct User { + uint256 stake0; + uint256 stakeRatioSum0; +} ``` -### RevokeOwnerChangeConfirmation +### Withdrawal ```solidity -event RevokeOwnerChangeConfirmation(address owner, uint256 changeId) +struct Withdrawal { + address user; + uint256 amount; + uint256 period; +} ``` -### ExecuteOwnerChange +### DepositRequested ```solidity -event ExecuteOwnerChange(address owner, uint256 changeId) +event DepositRequested(uint32 poolId) ``` -### SubmitTransaction +### DepositInitiated ```solidity -event SubmitTransaction(address owner, uint256 txIndex, address to, uint256 value, bytes data) +event DepositInitiated(uint32 poolId) ``` -### ConfirmTransaction +### DepositActivated ```solidity -event ConfirmTransaction(address owner, uint256 txIndex) +event DepositActivated(uint32 poolId) ``` -### RevokeTransactionConfirmation +### ReshareRequested ```solidity -event RevokeTransactionConfirmation(address owner, uint256 txIndex) +event ReshareRequested(uint32 poolId) ``` -### ExecuteTransaction +### ReshareCompleted ```solidity -event ExecuteTransaction(address owner, uint256 txIndex) +event ReshareCompleted(uint32 poolId) ``` -### OwnerChange +### ExitRequested ```solidity -struct OwnerChange { - address owner; - bool add; - bool executed; - uint256 numConfirmations; -} +event ExitRequested(uint32 poolId) ``` -### Transaction +### ForcedExitReportsRequested ```solidity -struct Transaction { - address to; - uint256 value; - bytes data; - bool executed; - uint256 numConfirmations; -} +event ForcedExitReportsRequested(uint256 count) ``` -### receive - -```solidity -receive() external payable -``` - -### submitOwnerChange - -```solidity -function submitOwnerChange(address owner, bool add) external -``` - -### confirmOwnerChange - -```solidity -function confirmOwnerChange(uint256 changeId) external -``` - -### executeOwnerChange - -```solidity -function executeOwnerChange(uint256 changeId) external -``` - -### revokeOwnerChangeConfirmation - -```solidity -function revokeOwnerChangeConfirmation(uint256 changeId) external -``` - -### submitTransaction - -```solidity -function submitTransaction(address to, uint256 value, bytes data) external -``` - -### confirmTransaction - -```solidity -function confirmTransaction(uint256 transactionIndex) external -``` - -### executeTransaction - -```solidity -function executeTransaction(uint256 transactionIndex) external -``` - -### revokeTransactionConfirmation - -```solidity -function revokeTransactionConfirmation(uint256 transactionIndex) external -``` - -### getOwners - -```solidity -function getOwners() external view returns (address[]) -``` - -### getOwnerChangeCount - -```solidity -function getOwnerChangeCount() external view returns (uint256) -``` - -### getOwnerChange - -```solidity -function getOwnerChange(uint256 changeId) external view returns (address owner, bool add, bool executed, uint256 numConfirmations) -``` - -### getTransactionCount - -```solidity -function getTransactionCount() external view returns (uint256) -``` - -### getTransaction - -```solidity -function getTransaction(uint256 transactionIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) -``` - -## ICasimirManager - -### Token - -```solidity -enum Token { - LINK, - SSV, - WETH -} -``` - -### PoolDetails - -```solidity -struct PoolDetails { - uint32 id; - uint256 balance; - bytes publicKey; - uint64[] operatorIds; - enum ICasimirPool.PoolStatus status; -} -``` - -### User - -```solidity -struct User { - uint256 stake0; - uint256 stakeRatioSum0; -} -``` - -### Withdrawal - -```solidity -struct Withdrawal { - address user; - uint256 amount; - uint256 period; -} -``` - -### DepositRequested - -```solidity -event DepositRequested(uint32 poolId) -``` - -### DepositInitiated - -```solidity -event DepositInitiated(uint32 poolId) -``` - -### DepositActivated - -```solidity -event DepositActivated(uint32 poolId) -``` - -### ReshareRequested - -```solidity -event ReshareRequested(uint32 poolId) -``` - -### ReshareCompleted - -```solidity -event ReshareCompleted(uint32 poolId) -``` - -### ExitRequested - -```solidity -event ExitRequested(uint32 poolId) -``` - -### ForcedExitReportsRequested - -```solidity -event ForcedExitReportsRequested(uint256 count) -``` - -### SlashedExitReportsRequested +### SlashedExitReportsRequested ```solidity event SlashedExitReportsRequested(uint256 count) @@ -2256,6 +1926,368 @@ function withdraw(uint256) external Withdraw wrapped ether to get ether +## KeeperRegistrarInterface + +### RegistrationParams + +```solidity +struct RegistrationParams { + string name; + bytes encryptedEmail; + address upkeepContract; + uint32 gasLimit; + address adminAddress; + bytes checkData; + bytes offchainConfig; + uint96 amount; +} +``` + +### registerUpkeep + +```solidity +function registerUpkeep(struct KeeperRegistrarInterface.RegistrationParams requestParams) external returns (uint256) +``` + +## CasimirDAO + +### owners + +```solidity +address[] owners +``` + +### isOwner + +```solidity +mapping(address => bool) isOwner +``` + +### numConfirmationsRequired + +```solidity +uint256 numConfirmationsRequired +``` + +### isOwnerChangeConfirmed + +```solidity +mapping(uint256 => mapping(address => bool)) isOwnerChangeConfirmed +``` + +### isTransactionConfirmed + +```solidity +mapping(uint256 => mapping(address => bool)) isTransactionConfirmed +``` + +### ownerChanges + +```solidity +struct ICasimirDAO.OwnerChange[] ownerChanges +``` + +### transactions + +```solidity +struct ICasimirDAO.Transaction[] transactions +``` + +### onlyOwner + +```solidity +modifier onlyOwner() +``` + +### ownerChangeExists + +```solidity +modifier ownerChangeExists(uint256 changeId) +``` + +### ownerChangeNotExecuted + +```solidity +modifier ownerChangeNotExecuted(uint256 changeId) +``` + +### ownerChangeNotConfirmed + +```solidity +modifier ownerChangeNotConfirmed(uint256 changeId) +``` + +### transactionExists + +```solidity +modifier transactionExists(uint256 transactionIndex) +``` + +### transactionNotExecuted + +```solidity +modifier transactionNotExecuted(uint256 transactionIndex) +``` + +### transactionNotConfirmed + +```solidity +modifier transactionNotConfirmed(uint256 transactionIndex) +``` + +### constructor + +```solidity +constructor(address[] _owners, uint256 _numConfirmationsRequired) public +``` + +### receive + +```solidity +receive() external payable +``` + +### submitOwnerChange + +```solidity +function submitOwnerChange(address owner, bool add) public +``` + +### confirmOwnerChange + +```solidity +function confirmOwnerChange(uint256 changeId) public +``` + +### executeOwnerChange + +```solidity +function executeOwnerChange(uint256 changeId) public +``` + +### revokeOwnerChangeConfirmation + +```solidity +function revokeOwnerChangeConfirmation(uint256 changeId) public +``` + +### submitTransaction + +```solidity +function submitTransaction(address to, uint256 value, bytes data) public +``` + +### confirmTransaction + +```solidity +function confirmTransaction(uint256 transactionIndex) public +``` + +### executeTransaction + +```solidity +function executeTransaction(uint256 transactionIndex) public +``` + +### revokeTransactionConfirmation + +```solidity +function revokeTransactionConfirmation(uint256 transactionIndex) public +``` + +### getOwners + +```solidity +function getOwners() public view returns (address[]) +``` + +### getOwnerChangeCount + +```solidity +function getOwnerChangeCount() public view returns (uint256) +``` + +### getOwnerChange + +```solidity +function getOwnerChange(uint256 changeId) public view returns (address owner, bool add, bool executed, uint256 numConfirmations) +``` + +### getTransactionCount + +```solidity +function getTransactionCount() public view returns (uint256) +``` + +### getTransaction + +```solidity +function getTransaction(uint256 transactionIndex) public view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) +``` + +## ICasimirDAO + +### Deposit + +```solidity +event Deposit(address sender, uint256 amount, uint256 balance) +``` + +### SubmitOwnerChange + +```solidity +event SubmitOwnerChange(address owner, uint256 changeId, bool add) +``` + +### ConfirmOwnerChange + +```solidity +event ConfirmOwnerChange(address owner, uint256 changeId) +``` + +### RevokeOwnerChangeConfirmation + +```solidity +event RevokeOwnerChangeConfirmation(address owner, uint256 changeId) +``` + +### ExecuteOwnerChange + +```solidity +event ExecuteOwnerChange(address owner, uint256 changeId) +``` + +### SubmitTransaction + +```solidity +event SubmitTransaction(address owner, uint256 txIndex, address to, uint256 value, bytes data) +``` + +### ConfirmTransaction + +```solidity +event ConfirmTransaction(address owner, uint256 txIndex) +``` + +### RevokeTransactionConfirmation + +```solidity +event RevokeTransactionConfirmation(address owner, uint256 txIndex) +``` + +### ExecuteTransaction + +```solidity +event ExecuteTransaction(address owner, uint256 txIndex) +``` + +### OwnerChange + +```solidity +struct OwnerChange { + address owner; + bool add; + bool executed; + uint256 numConfirmations; +} +``` + +### Transaction + +```solidity +struct Transaction { + address to; + uint256 value; + bytes data; + bool executed; + uint256 numConfirmations; +} +``` + +### receive + +```solidity +receive() external payable +``` + +### submitOwnerChange + +```solidity +function submitOwnerChange(address owner, bool add) external +``` + +### confirmOwnerChange + +```solidity +function confirmOwnerChange(uint256 changeId) external +``` + +### executeOwnerChange + +```solidity +function executeOwnerChange(uint256 changeId) external +``` + +### revokeOwnerChangeConfirmation + +```solidity +function revokeOwnerChangeConfirmation(uint256 changeId) external +``` + +### submitTransaction + +```solidity +function submitTransaction(address to, uint256 value, bytes data) external +``` + +### confirmTransaction + +```solidity +function confirmTransaction(uint256 transactionIndex) external +``` + +### executeTransaction + +```solidity +function executeTransaction(uint256 transactionIndex) external +``` + +### revokeTransactionConfirmation + +```solidity +function revokeTransactionConfirmation(uint256 transactionIndex) external +``` + +### getOwners + +```solidity +function getOwners() external view returns (address[]) +``` + +### getOwnerChangeCount + +```solidity +function getOwnerChangeCount() external view returns (uint256) +``` + +### getOwnerChange + +```solidity +function getOwnerChange(uint256 changeId) external view returns (address owner, bool add, bool executed, uint256 numConfirmations) +``` + +### getTransactionCount + +```solidity +function getTransactionCount() external view returns (uint256) +``` + +### getTransaction + +```solidity +function getTransaction(uint256 transactionIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) +``` + ## CasimirRecipient ### manager diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 3775bfba2..adefb0e0f 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -18,7 +18,7 @@ void async function () { oracleAddress: oracle.address || process.env.ORACLE_ADDRESS, beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, linkFunctionsAddress: process.env.LINK_FUNCTIONS_ADDRESS, - linkRegistryAddress: process.env.LINK_REGISTRY_ADDRESS, + linkRegistrarAddress: process.env.LINK_REGISTRAR_ADDRESS, linkSubscriptionId: process.env.LINK_SUBSCRIPTION_ID, linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, diff --git a/contracts/ethereum/src/CasimirUpkeep.sol b/contracts/ethereum/src/CasimirUpkeep.sol index 2aab7d4a9..4a1deaab0 100644 --- a/contracts/ethereum/src/CasimirUpkeep.sol +++ b/contracts/ethereum/src/CasimirUpkeep.sol @@ -107,9 +107,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { linkSubscriptionId = _linkSubscriptionId; } - function registerAndPredictID(KeeperRegistrarInterface.RegistrationParams memory params) public { - // LINK must be approved for transfer - this can be done every time or once - // with an infinite approval + function registerUpkeep(KeeperRegistrarInterface.RegistrationParams memory params) public { linkToken.approve(address(linkRegistrar), params.amount); upkeepId = linkRegistrar.registerUpkeep(params); if (upkeepId == 0) { diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 1be582749..cf959b2b1 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -18,7 +18,7 @@ export async function deploymentFixture() { oracleAddress: oracle.address || process.env.ORACLE_ADDRESS, beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, linkFunctionsAddress: process.env.LINK_FUNCTIONS_ADDRESS, - linkRegistryAddress: process.env.LINK_REGISTRY_ADDRESS, + linkRegistrarAddress: process.env.LINK_REGISTRAR_ADDRESS, linkSubscriptionId: process.env.LINK_SUBSCRIPTION_ID, linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, From 995f7d83e4e57a421b045a4c2fc52e33df527a17 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Mon, 5 Jun 2023 12:11:55 -0400 Subject: [PATCH 49/78] Verify pool withdrawal credentials --- common/data/src/mock/validator.store.json | 222 +++++++----------- contracts/ethereum/docs/index.md | 4 +- contracts/ethereum/helpers/oracle.ts | 14 +- contracts/ethereum/scripts/dev.ts | 4 +- contracts/ethereum/scripts/test.ts | 2 +- contracts/ethereum/src/CasimirManager.sol | 33 ++- contracts/ethereum/src/CasimirPool.sol | 2 +- contracts/ethereum/src/CasimirRegistry.sol | 20 +- .../src/interfaces/ICasimirManager.sol | 55 +---- .../src/interfaces/ICasimirRegistry.sol | 11 +- contracts/ethereum/test/fixtures/shared.ts | 11 +- services/oracle/src/index.ts | 7 +- .../oracle/src/interfaces/HandlerInput.ts | 4 +- services/oracle/src/providers/handlers.ts | 12 +- 14 files changed, 160 insertions(+), 241 deletions(-) diff --git a/common/data/src/mock/validator.store.json b/common/data/src/mock/validator.store.json index 7834341b1..655491777 100644 --- a/common/data/src/mock/validator.store.json +++ b/common/data/src/mock/validator.store.json @@ -1,222 +1,158 @@ { - "1684509224373": { - "depositDataRoot": "0x229bd3661012d438aaa2ab03b2091cae4ddc68554c7ef14c97f59a1514df0eb4", - "publicKey": "0xafa0e91b0c37c7e94c347fab9b08d0812067a09f7796a0329ce6060a847b4ce3be43684932e1b98dad1286ee8b4a6147", + "1685978890313": { + "depositDataRoot": "0xfefefcd19178e5c4bd4161d393037ba020a8c233cded6f56e030054f223ed0a3", + "publicKey": "0x8bf8bdcf37057e0d87f84df4f2516a9f2a9b1ce159b6473d66a55514a44c02b0997bffe0a2c7f9130d227c3603b36c39", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c0839973c79a95ceb6aa08cc3520583b96b8b0ccfcd419aad053904dbf6b8f4b655bdaf742a41e087b732623ef279bfa968b7fa56ab6e498f1b12c3968ee43e0813c6631389d15d39a1eb24b84d72d9a7726e33fe1be227994bc26f52340c74d45ab82dcf81da9ca0f81750b0f6c68d9971631b733c36d6bee654fd1a35e6d1719a68d656d4db5269765514a49a0c7a936a9566392aa7cb9632c6d22b985f87563c6397820b1d0fbb6c598c78dfad31bf8cbc43ccc80dd6aa303d7cceaf2e91e68ddde37f7df7769fe3479d7fad75d9e6ddf7ad7befb7b8735d38dbd7fbe3773a71ce75e3dd9a6fc75b7f6f5adf4d3d79cf74775ebcf1fd39ebb73477cdb8eb4f77dda77cd5fef86f6ef5f3a79fd3ae77d7ae1f737f7ae1d75deb7df8d9cdfbf5fe78e7a69ef79e7473bdfadf9f5a6de73b7b7d9c6b66b7d5e7fc777f3ce7d75dd1cd79eb4e9f7b5df76b7737e1c75ed1f7fdf5de3669b69ef5f69b7f57bad3bebc79aefb6b4ddddf9f7ae1adf57f5d77d77e34df8d3be7c7bdf1fd9dedb7f771cf5b7fb7b7ddee7b73c6f56df7777dbe3cd7b73c6b871f6b5eb8e3669f71adbd6f9edd75adb9eb669de76f5c7dfd3ad1b69a7bc6f9eb66bad5e77adbb73c6bae9de796fc75ce766f6d5be9bf35edc735d1c6dad37d5cdfae9fedde79e7b7b46fc6daf5f69f7fbe7ce9d71ad79f5aef4f35e9bf347dc73bd9ae776ddd78d7df35df573dd1cdb9d756da6dadf9df96f67ba7386ded1e69de77dfa774efbddf7bae77d7af5cd376fc71f7377fae1e7dc7fae3675a7f4d376bae3ad5e6b7e786ba6dddb8736f5dd1de1f7f4f3ae9e75e7df774e1b6b971c6b5f7bdb5dfde7771e6bcdb5f37d1defdf3cf3beda6bd71eef56bbef9edb6fcf36f1b6f9e7d6f973beb7efad1fe7c79cdf869b6b76ded7dd3cf3b6fde3875c7b5d9bf3d6fc6da75be5f79a6fdf7b71fd5fd386f569ae7b7bcf377baedf776f3971cefbdf4f75eddf7573a736dbae7c6dad34e3cf3bd34d1dd5af36d9a774d38ebaf7b7f7df8d5aebdf5b7b5ddb6fbf37dfa75cf5b71adf5d75eb873bd9cf746b6dbdf35f3cd5c6b5e9c79de3bedc71b736df47dde1de9debbedef36efcddfef5df77dbf38f37d9d79fe7d7da7776f8e3969be1fe3c6f6e5f77bf367b4e1fdf4f5f7fde5e7faddbf1ee1de397dfe9f7b479e6b6edb6b9e78ddb79bdfaddbf3dd9fd1b71f7b4f7ce5a71e73bdf8e77d1bedcf7ae9e7b46fadb9f5b77df3c736f3b7fd75adf5df8dbddda79ef38e347f579edbbd9dd5ae5cedeebcd5fe76f74eb7d3ae3671fd38e3deb6d9d7b7db67bd734edad77d9fd3a7dbe5ce3a73ae9b73be75eb96b7db5ef66fa7f5e34e7bef8f5b73d79c77b6dcd9c7f675c79fef9dbc71bdf9d35df8db8e1ee9deb4d9cdbde3dd1fe36e7defd7796b9ddcf1e7b969f7b8df5d5ee38e77779f5ad36dfc736d77f5fd9cddbd3adfb6b573ad7479fdf6db4778f79db7f1c6fde78f3adfdedbe5b69eedddb4ef4efde3677def4e5e7bcf1d6f8ebd739d36dbdd7d779e9a735e1a79df5fd9be36e77ebddddddbf1bdf8dfbd1b79bd9def67b67ba7b6edaddcf7beddd3cf7deb57b8f3a6dad3bf777bc7f8edfd9dd75e3b71c7dfe34d3bf766f87b87f4d757397f67dc6dbebbe5d6f47f9d5a6baf747bb6deef6df9f36f76e9bf5d6b5f1def4d76f1d7757f7d77f35d5bd9f71a7b6ddef1cd75e5bf3969df36e1a7dcd9ef3bd36d7871ff5cd9f7f5edff37d367b7f1c7dcd1af7cf7ad5b73573971edbc6b7dfdf5b6b675e77b71e7b4db4e1e7ba6fde79f39efc7daf1de7869feddd9cd9d7766f57f8d79df8d3677573dedcd5cd3df3ae9d73d734e3b7da7f4f1d79c75ad35ef971bdb4f5f7bbe5ceddd5e69fd7679eeda77769e7b4ef9d1de5ee1bd5f7377fc7fcdf66bbdddefdd5de1f71e6b6f76d75f5ce38df8774f5c7776dbe79ddf6fbedeedee7d7b7f1cf1fd7bd9fd7dd79d1e7dad5f6b9eb4edd6f6e3dddee9ce7b6b66b9dbcd7b73b79b71ef7ddb777af77df8eb7f74ebce1fdfcddcf78e3ce7769addef5ef3af7a6deedf7f469bf1cdb777cdbc7dddf7e35d9aefdef6e9edf8d37f1e7777bb6dfe9f7f8d356bbe3b7dff7cd1f75d75ff7debbddfd9fd1ddb56f6db7f1d6bcef7e9befcdb971f7b47746baf1af3cd757f6eb9eb6f38d5ee9e7dfd36edf7b5776e9e77dd5eddbd7775e75ee35e747dd75bdb76b6ddde3cf78ef76dd75ed7dd7dddad5ad9ff77ebce36d3cdbbeb8d367dbd37d9ad1be3473779ee746baef6d1a7b8d5d7dd79dd3c75ae3ae7c6f57fdd75dfd73d77bf7d77c7dee9de5fddad5e71f6fce74f1ddbaedfd7b6fbf7be5cddeedad7c75de1beba71af77f1cf1c7bd73a73473dd7b7dadfcebcdbcf1b71fefc7f76b7df7dbd75cf7defad7ad78d3de35dba71ddb679a79e69cddfe35f1bebbe5ad1de75e79", - "cluster": { - "validatorCount": 0, - "networkFeeIndex": 0, - "index": 0, - "balance": 0, - "active": true - }, - "signature": "0x8c8c903b56917a6f08d8070edc7db7f8babbb25a7f053d99c83a5cb714a2072090d38c133d467a0e23c13e946348c9010a49965812b4bee59d9ba07449f5c76542b3cbd975907b4d2cf192a5ab05f9bee2bc1932ee95040d2bd2a4880b33c872", - "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + "shares": "0x00c0af4b1240c1975674a8c736b2cb9ca8618d3a1b36323d7dc6d0bef51ca5f4c8b9a2069afb3f54942da779b2d8ce1f2394928dcf96c3f84aa286a353d07893c265dbfa212f44db803753191344f908dd258b01e8c8f41a01226377b83682c1b6b8ae2bfde50a2d66256c1a125deeff2fb274b84881fee14ebf85495b4142f81a9387342c435152bc860af46332a4da767db6b749955d15d2720b6d352ff7e40434375ca7f3f01f4251f7ec6a2d1ae74af0aea4f86deaa9804abdf1c614272a2d6ce757b9e74d3ceb9df7735d1cebaef9dbdd796fbe3bf7ae9f75bd9b7b5d3cebae7d7bbe1d75fd1d79b6b977869e7396fa6dcebaedadfb79cdfceb6f39eb4d757f7f376dee9ee5beb9db5e367b6f746f77f5f1b6b5f37df9f1a7f8df87da6b47bdf3a7dbebae386f97b8f78e36ddfe3bd5cd5aedae77eb779bede6f8dbcf3af5feb96f57da75cf1ef36d3b73a69b7bc7da6bce377dae78db879ae5f6dbedeef9d38f7cdb9f3de1d7fcd78efcddfd9ae1a79af7ddb9f387dad1eeb569b6bdd3de7df5aeb7e1ce1d77bd7cd9edf8ef5dfce5b734ef8d7975fefce3a736f757746bad9ff5cf79efcf3b7b8d39f3ae9edf5f37df66bd7bcd3bebcefdddeeb6efbd5d7f577477cd1c738d9cef7e5adf779cf5edfd779edae78f3aef97db6f5e1d7b4d5ff3ae5df5ae1cd9ddf67bb6b5e1cef6d1aebdefdf1fd1ff376f5efa7dbd37734d36efcf3bd1c69ddbce7cedf77469fddb7396f8db77bdddc6f6d9c6f9dbb77c77ddf9e38d1c6f6dbdddc69fd74f7c775eb6f77e9af5dd767dae3671cdf6777f34df5e1ee757dfefcd9be1ee747f6d5eedcebbd1c6b77dbd9bd9f6baeddf1ad7df5e77cf3b69cf5cf1defaf3debcdb57bdf1dd9cf747bce5ae3a79aef4e36eb97dc73df5ff5ceb86fb6dbeb5ef7d7bedcedb75aedd7b9f1c7b8e9c7f56f7d9be5def873bd9cf3a777e7de3df7cf1d6f779fdbbe9c7b97fc7b5f3de7a7f5777e7bef56db69d6f671fe9a6f8e5b7dd737d5fd34df9dfce3adfbe7cd5d77bdf9db6d7cf7af35edcf3971ad767dff5e77b69fdb76de75fedbd3b77ad78edc7ddd7b75ff766b77b6e76e7b69cddcdbce747bbd1c7fae7a7fde9b73aedad38eb76f4ebdd747b67dd6f7d9e7b46dae5e6b7dfbdbaf3c7f97f4d3a79dd37f1df3bef6d367bbd77e35776d777b46dfd7af3a77ad1bd9f7f977d69af7be3b7b7ddb7dbddef776b77dbf5b6b8e7875d7356b875a77769b77adda774e3579b6dbe346f9df9779f3577be9c6f7d1be3ae1f75aef469debbd3a7f4db56de7df7fa75ff787dbf76f75f5bd377df7ba735e76774d37eb9e74ef677a6ddefaf1bd9e7f7d3cf1ad7dd78df673c73de1f6f6e1ed1cd9d6dee7aef8ef4775e3a71de3ceda7fae1f75c6f575ad5fe7deb7f7475c7767b869bf1aeb4f77db979ee9cf1e7bcf36d5e6dcd757bddf5f1b7f86b573defdd796f6f1ed77d7469c77bebce3bd35d7a6b4ebddb6f3c7f5d9feb8d5fdde734f3de7ae796b66dae7aebcf7473dd9fedae1a7f6e3df7ad1cf3bebce39efa7bd6fc71d7f9e36f5dd1a7dfedbe5ddf4d1c6db7fa7377366bc75c71be3671deb76df7766b8e347de77477aededdedb56fb6bcf3cedce9ae9deb97f6eb777b71ed9dd1ed1ee5d7b6736df9f7471ee776bc7397dbd5e7fb79ff3879d75c775d5e7de77d6f973b6bde1ddb5d38d746dc69de3cd35dfce5fe77db86def5ad78f76ebd6f67f97796f8e3ae3b7fad76d5af376fcdfad9befbdf8ef971a79f7b5d1ae5bf5d77769d75be1a7b4e5bd36ef7735d9f6f5735e5cdb779ef5a7b46b6d7c69a7ded3877ae5fd9de3de38d5b71bf75e35edbd34e9debb734edcf78dfad1ee5ed7a6dbe5de3b7dc7b4d5bd777387ba7f6ebad1fd75db875edf6e35e9eedbefa7b8ef4f1fd1d7fdf76d3de79e7d7b971bd5ee5eedce7679af3bdbc79a75a79ef1a7fad7cf1a6fdef473df7679ddf96b675d77d7f9e34d397376fbeb47bdf77d3475be9deb77b979fe9ddf57daef87f57f4f7873b71cd7ce7df3cf5cdbcf3ae3beb4f36e9f75d71b79d6bd6bdf3de1dd776b4e7bdfddb67797b569af38dfce78ede7f4d76df5d37dfa7fbf5df1fedde75739dbdf396dd71ce1e7bde9ee79f7bef8d75e7b7f5e367fa7f7d5defdf5ef767de7fbe5fe34e3d7f4e7cf1ed3cdfb77df7b6fc775df5dfce3bf1fe9adf7df66b4dfad1ae3be1af7c6b5d7cd9d7b57dce38f78e3b6f4f1d71c79ef79ef8db7e76f7677869f6fcd37f1be37f5f79f6baddbdb7dded9bd787b9d1de37e3b69bf7ad77d7ce386bd69df7c6b773ad5e778efd7dc7dce79d1cd38d35e36d5ce1dedc7deeb4f1de1deb9dfa7b4738e1fdb7efc7357fde35e7869b6bae5af37d3be7bddbd3bd5b69dd37d5d73877a7fd6b8d5ddb8e9eedc777e1be9f7bd79fddae79d1f7baf77738d5bf3b69d6dd", + "signature": "0x9497a0052bc62e70f565de96ba6648aae77c0e49d4d0d8a88462645c27ed5dfc0fa4efbd6c437f3ec635c64b33a35e1f0955278b70980f874ac06b124cd196f455427ce077e5a5ec00da6d0c66ed705e5a1a3cab71f117e56cca704d4f853b13", + "withdrawalCredentials": "0x010000000000000000000000ef74988aDeBcf6ddc5a7B359761a2BE62c77ca8b" }, - "1684509253158": { - "depositDataRoot": "0x6aa44799022e541c3efd9dc29da2f4e3de2449b8e31c064099a0fc6bee4302af", - "publicKey": "0x898e8a3508f8f2fda73cc57bdb03e1fa957d1507700caedf5dcde6933c282b2585ba0e9fdfcd957ee89caa83309aada4", + "1685978948757": { + "depositDataRoot": "0x2c41a275432c006749c658804645a92e59688b7f3356453650e1de80ff59e9ce", + "publicKey": "0x81f9fb0dfe33bdcf5628ab27cd408cb162749c4bc12f22f69b3011c05e2ba963deb5797df007fff2b2a356ff0e556d19", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c0811bcbe8200ba25f4e2ceb0b5e0820c718ef3ce5b8e1d8aa2535e07f255224eafb87c4b3200e808305a222da21c94ea198ee871e7c02ad940cb8a3e4b66423eb8d74f055939e0828fbc60c0105d130bdf64d246225b4b8680fc354ea5ff7bf9db94822974d99c03369b756f37803549f0431d8899c574b1593fa1cd8562b3cedee3293c080e2db5d7806cfef4fea14aeb8dbfd7d68d22c4c4ee13bb99e557e9502ba9537963a64db79ff41db9e8d9d9f94d8864d850874948881490e7797a7fcd7b73cebce1b69af1ce776b4d1bddddb66fb73a777e74e5c7dae3dd9cd9de7973d7fbe5d6fb73d7f9ddf6b5f5be1adfbe5cf3bdb97f875f7b773b775e7ae9f79ae74df975d6fce9cd7ce1be5bddad1e734db8d9defa73671adf6db675ddb9d757ddefad35dbbf7d79ff1f6f5f78ebb776d75d7973cd1ce7a7dfe7b77873b7f869b7b5f5ad346b475ff3af786f4dbdd5cdfc69ee3b6b7e7b7f97ba73bdb5d5ef5e79befcd797daeba7b86bc69cefbe3471aef6f1ff5edb9e1eef4df7e7c73ae34eb47bd7f66b96faedddf6d1ef1ed376f8d9fe797bdf5cf7adba7b7e7871f7b9dbc79ef3475ff387dee1ff3cd7c777e3a7dcefcdb5d9e7bce1fef76de77aef4df8d9cd3b7b8ebce5be3cf76dbaf387b67f5e7ae75db6f3469ad1a73be7ae3469ee5ff5cf5ce9adb8f7bd1e7b86baf5bdbc6de6b8e3d6f76fbd39df4dbc6db7dbe9ed36df869b71d71cdf7f74736edadf9774ef97bdf5f79bf5b7dff74d3b6de6bae78f36e7de5e75cd377f6d9c7b7e5cf74e5e7ded9ae79d7df1f71ef1f6f7eda6b675ef3bd9cd9c737e9a778d5f7397bdd3cedbf3aefddbbd9bebce1df5de7673ddbd79fd77e3bf7879ce5d69bd5a73b7f87de6bbe5a7f7f796da7f67346fbd38dfbe5cebbd5ef7cdbb7b5d9f7b9e3769bf3671f6fbe36d9c6f9e747396f9d9cd7469fdbb6b5d7b7fbe9bd1e6fddfa7b97dff1d71c6b7d7dd5f7f5dbcdda6b4f1cf5df5f75d77ae9b77975df5c6dfdb77767f5d1e6b6f1c79cd7dd5d7db75ae34f5aeb4e9cef9ddce77e7bd1bf746b97b8db86fd6f7e3bef5e5ed1ae35eb4e1f75de5bd74efcdf7779dbc71f739f3af5e6bae36d77735f5ce3bef76dfe777f5dfa71fd1eef6f3cf3d73bd1bdf9e3ad9de78f7873cd5a736edfdf6dbde7a7f571e7dae77d1fd76edadbde5ef75db8edcd9cf347b7df5efdf1e7daf7675c779f7b79fe74e38ef4f5ee5c7fcddae7cf1fd1fdfc79df1c6b8dbaf3defd75d75d7dce7b75b7dbdb4d77eb7e79f5e79a69fd1be1a6f5edfe5ae1cddb69ef75d7d75deb7db5f3c7ddf37ebcd1aef66dbd1bf7a75d778d39e757f5d3dedee5cdbdf7bdb8ebb69d79fd74e9fd1c77df37dded5bedddb4eb5ddb7fb6faebd7deebaf78edc6fcd9ef78f77df7f1ed5f71e6b57f5d76d5be1ee9cf38e39d3779dd79efcd357fcd5be3cf1dd1cd9de1fdb77dfd5ed9fd777f477ceb9f38d7975a79f71e738d36e1d6dfd9bd7d77addeefbdf86dbedcebdefde5feb4df971ef7d77a77ddbbe75e76df9e7bf36efbeb8e5ff3aeb9e9a7fdd357b9e3de75dbc69bdddeb46b87b56ded34778e3ddbd77469f734d5fd5f6fae79f7d777e3cd37e34778e1addcefdd35ef87796fcf797dc75ef38d3b6f6f3dd7a7baf3669f7bcd5deb775c7b7d3beb6d1c7f777adb5d3bef9f3d774d1f77979adf67bce3a6dc6f569fedd7f977c69d7fd6dae387377f6d1de9bd5eef87f9dba69dd39d78f7d77475fe5f6b97b4d7a7bae76f7775df5e73ce1cddd6f9ddcedee1ad3b69d6f57b7f79df47dadbc6f77f66f771fdb7f5e6b8e757f5e7869b7b669b776d7bdda73d7f5f7cd3ce77e7cd1fe747dc79bf1f6dbf7669c79e736f1bf3673c71fd1d7fcd386df6dfeb6db77bcf38e1d69addfe3ae1ed79d5b774dfcf346de7397bc6b6df9f7873ad9f6b777ad76d5de39db8d35d5ee9af3cd1bf37db57f5db8e1bd7cedfd9edf7eb96fbe7ad5e7bb6b4d756f57ddd1ee1bebdd9ae74ef4d5ad9fddbd9c79ddbcdfbddaf5cd7c6b5d9b7f571e77bddae5ff5e6fd7db7dad9af3d738d1de5ce9cef8d5fd3ae1f7fde77e36d9c6b6f34f3dd7779cdbad5b6ddd74d5d6fbe5b775e346b5735e5bddddfde756dc73ae7a6dbe7cd37ef97ded9fd767bb69a69e7746b77f9d5fd1fef7f34eddedd7b6e3ad1bd36e7ae39e7de9ddf4d5e71a6dd6f8d39d5cf7bd9d7357f4e756fc77af7471bf77e787f5d5edbbebd73d79edb46f76fadb9efbd1ae5ed3d6f5738774d37776d7873cd5ce9de757b8db6e1b735e9a6f67b56fbdf97badbb778d1fefddbdf3b7f4ef67bbd9cf3c71ce5dedd6f8774f5dd1ef1e7376da7bde3ad1af7b7bae1bf5e7bce5f7f66f9ef6ebde75eb5e5f7dc69d7dbe5fd38edaeb469febae3b69aef7d1f7fbeb9e9eedcd796f96b8778f1ed3addde3b7fc6bbf5c7ba", - "cluster": { - "validatorCount": 0, - "networkFeeIndex": 0, - "index": 0, - "balance": 0, - "active": true - }, - "signature": "0x9538f13d3a51611cf73b32854027dafa7d999c53355b94aadb117502e635fdfcda1275c0dc50a9afd229b11e07085301020af941ea0b61d2597c0fef2ccda8d6cd6288970d3705f24d9c76e505a384302299829f817c759e8cf03f6c73c86b0a", - "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + "shares": "0x00c0b7cb3dcaca287852ea7e531eb7206d129017771386212c476aff3e3ce35b63c10c6d1695fdfe9f9eea0a2c1e92dffe6da5cc9b433b9c624af2f17e500e51adcd0fcc23dc60a0c3163090f7731d6af64aea1af60651d935954998b8719b5497d1ac3a7c56555dbbc6703d1039689dd206dc609b08bccd9c54cb7c4a207af951b88a327065603e8f234d810de028ff0af3846a44e89430b902ee845249cce586331bed72724dd7b0243ab3dcc384493aa9e3635f7689e97dcc0f48f08de8828450d1d75dd9c7dfd5cef4dfd71cef87b9d1fe397776f6df77fdf776b8edbf74e9a6b5eb6d7ae34d7a77bf1a6b4f7cd5ddbcd7971f71d736f3a7b6eb9d78e3d7dc69cf7be796f5f75d37d77edd79f7b56b5d5bf3ce1a71c7767f6e346b8e9fe76dfb6f4d9adfde7a6fb75bf34f3ce397b96fcd3875df35f7c7fd6dbd5a7ddd3be9cddae7aef77bcd75f39ef5e1f77bedd73c6b86fdd37f7d6f5dfcd78e7dd9bf3cefbf77edae5ae7571be5de786fbf7d7fad767f77dedbcebde3877d69a69ed35e76ebdf76f1cdfcdf569cdb4edad1fefa75c6f6d5cdf4737db46f96fa79e71ee5a7fa7b56df735e9d79a75de7b7f6ef9df7df47dad1cf3bd75df7edef38e5e7df6b56fad9f6fa736eddf7df1a73d6fbd77db87b97daf1ed1dd5e71adf57776b86f471ae356db6dfe77e1d735efdf38e3ad5fddcf74df7f767b46b777be5ce5cd38e1fe5ee356bbdf4f79e1a79e7de75ed9ee356b9d9addbe5ee7af1a6b669eefae5aeb87f7f76e9d7bdf1fd7d69ad3d71b7f77377db7fa7bdf7af397f973be5ef7ad796b46f7f7c7df69ed74ddfd3a6f8d5ee9ee1e69e75de38e35e78efbef6f75edae1ed38e76db7ef5f1bf5c71d778dbcd366faf5b6f6d3adb975bef5df5f5eedadf5db4d9ce1f79cd9ce1ee5fdf7efdef9dfb69cf3b7f67b9d5cedd776f7bd5a6f4f3ae9a7346bd7f76ded1ce7ce1fdf4e75edbdfddf5ebd6dcdbbf3adf97b9d35d7df7ce386dbd1a75fd77ddd7f7e1ed1d6fd776e7777c6b7e5ef1c73677be9c7b4e3475adfce5ae78db7d3c6dae1de3cf3ad3969ef76edb6bddbde1ad5e75b6fbef5d76f3df7469cd3c6f46b46bc75be3de3469ad1e77af7bebbd5a7f869adb7eb769b71bd39d1f7b5e1cd3d69de776f8df4df9e76e39e5e77a6f67b96b9edfedcd79d5f6de79aedd79ed1bd7adfad3b79ff747ba73c7f677de7b6f471ee9c774ef4f3c7fc75f77bd1ed9be3779b7f4776d5f7da79e69f73a75bd36ef5f777b9d1f7dd77779af3c73a69ff77d5f6bde5bd77dbc7bc6db7fa7fde5adf8d7b7f877d778eb66bd6bbdb575bf1ff3c73cd5ed9a778774e5e79fd75db875c77ae5b6fcef66b4ebaeb5eb57bb7df739e1ff5ad7c77b6b679a7f969bd34e1fdfbf1bf1cf75d9d73ddbcd3dd377bc7b5f37e3bddcedcd78d9df79eb77f96fdd9d6dde5af7bf5e73befc6fce1ee1b69e79ee1addeebce38736d1cedcef8e9dd1b7f67baef9edef7571ddbdd3bf35d1c7f6e5de9e6f4df8e3be5fdba6b8f1ae1d6fb69dddd7def35d75e1e737d3bd9af387bad1c6bbf5cefdeb4e5a71d79a6f87f8edbe3cd9ee1ef7aefc7b8ebdef77fbe3ad1a735df4d797396b7f357776dc7db7fbd5dd5b7fdd9d7bbd35735f78f37df47dfd5ef787f6efbf36efaddce1ee74db9d1ad747b57fad9dd1dddcddc7f5d36dde7baefaf777da79a7396f8ddcd5eedadf87df7fbe9a7b4e7bf36ddee1fd5adb9efae37ef6f3979ee7a6fd73d71f6f96fad777f7e77e777f479fe5ed78f35e9f73d79a79ddb8775e9ee9d776e74eb6ddbe1f6dff757b4d3473a69cf797f4734ef677671d71a73bebc75dddbf376baf78df5d5c77aebad5ce1d6dcdbc6daeb6e38f78edf7bb6dddddd1d774edd7f5d367b87fbd1cd7bddfe35edfd76dfaf5f73469edf6d36d34e386fbf5fd787f97dcd5f7fbe7af397dde376b47df6f5d1c7fb69df1ff77ebbdbbf7a75b7bc7f871ee9bd7c6dddf4f1f71ad1ceddd3cebb73c7b675bdfbddff3ce7beb771ae7be76d39ebd7dc79bedd6daf5af3a7f9dfcdbc7f8d9f79d6b8eb679a77ad1ceb8f347dcd78738e5b71bebce7a739d1ed9be5d6f7dddd1be1b69aeb4ebae9e73a7df7bc75f71bdf973debddddd3adf7ebdd5ae756f671adfde5c6dc6bbdb46dc6da6fad3469d75edb871eedd7356f9f7bd5e7bd69e7dae5f739f5c7b8e7de5ee397777baeb7eb57bbd7b69a7fbe7977a77c7bc6b46dbddb6b5d9ad5de7cdb6f5a6b66b6d9ce9ad3adf475c73a71ed1ff7b6bb6f5e1fe79d3adb76ba7b5e5cd7869b79fe3ad7be7779d77469ff1e77cdb8e3bdde736f7c6f47f9f5de7ae1bd1ce7575dedbf38f1c71fd7c79f7ba77de747f67faf5d7f97db71fe76e1f6f8d36edef7aefcd1ae9ee9fd776df75edb6db87f4e3669af5ee1f6dae7c6f869ad5a71b75f7b9d1ddfb7de", + "signature": "0x9843a39cb294dbb83137562f9803354bfd39b8bd194b5442c3aa04e7dc990776acf5c944d670ab58240e524bb40cea190756404c1994cec0ad3221344d447da6fdeb4c8ff9ce0816557d049bf8d7c91d702a99270aae5af843e1f82607c60636", + "withdrawalCredentials": "0x010000000000000000000000CFA1dDd1b603446b5D58ef2fdF7caF243a745671" }, - "1684509268115": { - "depositDataRoot": "0xe6d9327fb55c33ea1c0d14240e89d1f09aceca759a6e5cd75859f23a485bf35c", - "publicKey": "0x95a57ffe410d67e281df9b64ef58ee6dfc8813932042e9d7be09b2e6ac316182f352c56b033acbe192722002278dbeac", + "1685979074293": { + "depositDataRoot": "0x7bff1b1291e0b62cab5eaf6b714c4df02f77bc2d0dc8c6579579b813e255331c", + "publicKey": "0xae08b937daa2fcddb0d39416e00353f19671a3f40c4280e955b5fce5554e6cc97af00e2cc66c804f413285db2645db02", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c096e7b88e81aba5ac3ce38cd593a49686c21b526525178c52d490b3c8c0cdf79176b37c2e51fe3164ee520a85eb9658189074fc1dc57ddcbd2ca68aa2b44fe549855f64c0e5fab9327921d7ed53e0fc932610960dd8f45d4b25b62166202c3a65ad993702bbb7b573adf6b0936837cbd282b89f8e82ba4766a41b38d3e9c6be84905f0c691db8b79ec1c521321b5474a4946b2ffe57b5027d7c5fc6e1194c2452935351d1057db98ff3c6196eda1c55bc18bb25846f353bb8cfdd72f1c6bae184dfd7fbe9b6fd6deeb873c7b6f78734e5edbc6b5e9eebbf5ee5edfae74f1b7f8d7dd37735d3de5ff3de3d71df1beb9d36d3bef7dfce5ceb5779d1dedaeb8e5fefad7d6ddef679ddfaeda7faf1e7dc7dfeb6eb4777e7d7b8d1dd9bd1d69ed397b9edf6dc6da6dff1e77bd1dd1bf77dfdd9bdfc73de1cedfe5ff3cdbaf1f75e79e75c77adf7735e5e77777b71fe7cd39f7defa75e7fc6dde36f1df1af797db6b5d7771b6fd7f9dde7f7ebd6fbd5e7f8ef5f39ef6ddef1bd39df577cd796bbe5ad1ed7aefb7fbd1cd76d1e7dcedef1cd3cf1d79de9cedfdbddf5e3cd3c6b6efaf39e7bd78d3b69f6dcf38e5ad5b75df1f69b73b7dde746faef4e35d35738efbdfa7bde1a6f67dd7fad1b7bbe3d7bd71ce36d77e7669eedee5ee7b71a6bcd9df5fe1ef35f1fdbddf5e1a6dfd78d1ae9ee35e5d7b6f3975cf1bef4f3c777d9e77a7dff347777b571de9def7f5e7db6dce78e39f7cefc774e5a7ba7fdeda73c69ad1a6b5d9d7fb77cdb7dfd73d79dd9fd76dda69ee7a71ce1e69defcdda6bbebaf5deb8d37db769fedfdfdddfd77db6e5ce757dcd78db8735e5d6fae78d7a7dff76db67f4e3c73cdf973ad38738d7a6fcdb5e3bdf5734d9b7dc7dc7ded5ef5ed74eb56fa734d34737d9ff34f1aedcdf9d9d6fb7b9ebdd7bd1ef3bd9f7da6b9d7adf5e356fc7f4e3b7776f97b9e1bdfaf77dbb7f66b47def36db6ef56fd75cdbdf3971fd1defbf77f38e5cf35d1a6bcefddf66daefc69ee5cddd79fe9be3b7f6e9af77ef7734e3dd3de7ce5d6dbe357b877cf1cf3775b7f96fd69bf39d1edf4eb7ef47fcef87b475addf77a71e69af5cd5cf386f875d6bbeb47f879be77d5ee37d5ad7bf5bf757f9e7dd1a7fd77dd9be77edbf777766f773673defb6f4e36f3675b69c73c7fc734f7ce1e7bc77d77df5ee38e9be3de7a7ddf34efaef6f3ad3de9addf779e38ef677679fd7a7fb6f5e36e36e9fe746dce5bd5cebd7fc75f6fd6dbd377baf1ae9dd38db7739db9774e1df79f5d69e734edae9ed9de9c7b9f74e7cdb9d9e6f9f5e6ba71b735dbc69ed5b6f873975fe37f3575e7dff3b776f1a7fad78d1e7fde3cd9ae5b7bc7b8e9ce7adf5f7979c69b6bbef469edf6d39e746df7b5d34e3deb9e5bd1ae3bd9e6bae36dfce5be1ce9ff3ad39e7ae78e3be3af5b75d7366fd6b56b9ef96f46f6efd7f9efd7ba71d6fce3a7f4f5ef75e9ed74eb6ef46faf5c7fc6bddfaf1bd5fedf7387dedf979e6b769cedcd5de346b7d5ed37ddbf5d7ddd9ae347f671fdfc6b6e9adf9d1be5be5fe7cd3475d75d7dc79df3b73a6bde7aedb777f3adf4e5befdeb9f7ce37d9f71e73bd5d6f67ded9c75a7dce3969bf7cd3471c6f47baef5d3cd5f6faf767746f9e3c7bbedbd1fddeddcd3df79d78e5cdb77bbdf9d1fd5edded3869dd3a736df971dd75eb8df479cdbd7dddf8eb5e5d7ba77bdfce9a6f56b7d357b4dfde3c6b9e34f756fbdbbd3571ee3be1e6f777bd7cf5e7dfe5de38f7979aeb6ddce7aeddd9a7db6fb79a6fbe9ef3ae7971a79aef6f5defdeda7797776f5f3b6da6f87da7dbd5feded5adb6dbcd9a71de1fd1d75beb4eb877ce76ede69b7ddf5c7f4f5c7dceb67dc6b5ef7e9ce9e7f4dfa6dfdfbd7af34f78e9fd7defa6ddd34ebdf1b7fbf5d7b46b7df6f39d9def87fadf97f47f7edc7f4df5776db7e5eedcdf66b9e1fd35f5d776e79d3d6f4db6d9de1fe5cddde1e7dcd5bd3975b6f7f5fef6d7df757347bbdb5d376bd6f47dbdb76f6e1f7b4edc6bb79fedfe1ee9deb7e5dede7b6d9a7b4f37db5d36d1ff37ef5e79e1de7b6dddf777ad9a6dff1ee7bef6e7bef9ef6d39eb47fbf36dfae5edfd6fbe76eb87f5ddde1be9bf1e7dadb87de7797b7e1bdb4eb67f569ef1ad9e6f87fb79de79f366ba7f6dbce1ae38e9ae7def47f9df47da7bd777d5ed79df873477adddd1ee37f7a6f5f39d78e3975d7bbe1b73471cf1ce3ce5eebdd7aef8735ef57dcf7b7fcd9e79cd1a69aefceb5ef573b7f5d7b71ee1df3ae7a7b6778f1fe756f7ef66da6fce356fcdde7bce9ae1fe1c6b77dfe7af1cefb7b66b4db6e1eefd79a6b47dce5b779f3469a6daefc7b871e71fddddba7f96fce9bf7de1fd767f5e7bd78dbb77b7bcdba779f1e7b86daf39edaf7dd3b79e7f777775c6db79c75adb4d1fddcdb6e35f3bf38df8", - "cluster": { - "validatorCount": 0, - "networkFeeIndex": 0, - "index": 0, - "balance": 0, - "active": true - }, - "signature": "0x8333cd81f27293828ca7e3a29b45f9489befcae41a3afc611ed67bc0636700db1153e38c88a48a9a15e6d4bae193decc0bac5264a29c936211d2212e4086fb92b037b08760a6c6fb4e50b9812116c62923d2f1e85e25afe54e662c96ca55c8e9", - "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + "shares": "0x00c0a6411127d70ea06971083bf7f74cd902585eaf00c00a719ffd6ac77daaa30ec151e4978c348754de0217128fea6e6e92ab80eea247bcca991c4ebc36bc8c8b3599d03cb489941c5528817b47b478f0063396a1dd4055c56267cac839dffc83778b9586f9a9ee601f762a565c7af3de4f3204609ac031d4bdc74d42e5d4700ccf85fdac90b4d5dc0391298b72d9bfa41da2302603ec5879eae8a90c06374449d793ab2b9c39f4962efb97b93058aead66651ad1310e41cdefe59213a44848e065f1d7f9dbce5e6bde3df1fd79eddf39edfdb9dbcd9fe1aedceb5db8d7b6f67ded9fe9ce3b6b9f1fd9c7bc69fdbbedbef6df6e3769b7b9ddfddc77adb66faf5e7fceba6b4d39efcd3ae1af5e75def97f8d37edbef971fe5ef3cf75efb7b8d386b6e3773be36735e1a6b46dbd5c6f56fa77b73d6db6dfd5fefbe39dfadf5d78f7669eddbeb6d39d3875eef8f74e34f3beb6e5af1f6bbeb77b771e735d5ee1ae3df7c79b71c73bdba7bae1b73befb6fad3aefc738e39d1dedd7b97dcdf7f5b7b4e7ddbbdfbddfd7b75aeb5ddd7db79cdb96fb79ff5f7fcefce3779f6fc73dd7cf1f6f76ba7f8e5ae9bedad1e77877477969b71ce7579ddb4eb975ae34d9b7b6e356bbf3bd1bdf675ff5af5e7fa73cf5a7f4df47b7d7ad5bd9dd1b71defcdb4dfdefbe777bc6b8db8f1aef4d9aef4e7769c7b6f75dfbddbf1fd75f37edb6f5ebd69ae38e366fd69a7f4f3a71f7f8f7c71b79def66fbd1dd9e7bc77b6b86b5738d3c6f9f75d5f6f569e79cf3ae38e5ad3dd377db79fd7475fd9c7b6ebce74e7d7bbdbc69bddbeb9d9debaedae3df756b66bcd7ce5eeb4d1ff3a6b7db9f39f1fe1c6f8df579b6f669fe38dfbedcf76f3469e6bd71d7bbf38e7b7fc6f7ef4df9f5de5ddf6e1dd36e1d776dfae5ff75d74e7be7c69f778f5a6b76f8dde778775d7dedeefce5c71deb5f796dbd5ceb7e9ad76d7a6bcd3d7f87b671c69d75aeb475ddb77df71aebaf346ddf1d6b469ae7df3673aefb75de9bd786dfebcd7769a69f6f5eb66b4d38776e3df38d1e7f6ebc6f5db5f7873dedce7d7776fce39f74df9d1ad3bd3a7746b4d9e6f677679eeddef5d39f5fdb6eba7b77f5d5defdef66bcf1a7df6baddfe9ddb9d3ceb47daeb6ef87df7b7f5fdf56f573dd5bdb9f38e9b73d75eedfef8dbd6baefd739dded396dc75bf39e9de3bd9cef7e5ee1c71e6fbebbd7579eeb5f5a7f973c7f8e5f69d6dc71bf7bebdf78d3a7dc7fdd9a7f4df9d1e73cd3ad9eebaebcf36e786b969befd71fdf9734db7f5b75ff387bae77ebddb46deedde5fd3b7dbe39d7779bef9d1d6f57bcd3ce5ee5ef74e9c736f5b7b4f1bdf7737edceb46b57dfe1edf7f74777f1ef7d7b66b4d1c71ad76ef4edb7f469edf8df471eedbd1ff7c71fe746b9d9ce9ed34d7bf35d76e76d5e6fbdfcd3975adf4ef5f35d1bddcf7b71ddfcf3777a738e767746f869e71be3ce347dcd796f6f3d7b7f74edfeb67396fce9a739e9e79cf5eeb8d1dd7c6b6d7cf76d3673ad1df1ed7ae77f1feb971c69b7b5d9a69cd5cd1ce35e9bd5c69ed5cd356fad1c7b9f39d3a6da6b5ebae1a6ddd7d7f871cd347ded76e5cdf6e1d79bef8d3bf1be34ef8ef971fedceda79a73d6fce78f3aefc6b56ded5e7dee787fadba7787fcdb66f76f9eb5f1e71bf7ae7df1bf3ddfbeb8d7b79c71b6b9f37e3dd3c6b4dfcdddd7d69a7bcf5ae3b75fef7e1ce5bf5d73875fe1eeddedeefc69beb8efb6f9e1e7b4d7af1be347fae1e7dde5d73d6fce5ef7a6f975f6b4d1ef5ef7d7dadf477bebd734f34734e9cdba7b9f39df479dd9af1bf75f74ddeefbeb8d3875ef34ebaf7c6dadb5eb7e3dd9bef773df1c7f87747bc7dd75bd7bf1f7f4ddaf3ce1c6dae787f4f367dfd5d7fcd9ee5feb66fc6daf35f75e75f786fbdb9d3873cf1fd3defb7bc7787dadb87f5e786f5d5e7dc77df79df5f5b7f6d9adb86fd7f5e76df7d3b71f71f6dfefddf87f6737dfc7b4ededb6df4e7aeb77fc7bde9ed9ff78d796dff39f76f1b7b87dcd376df7f4d3d79edf5dfb6fdf7d73bd3a7b57dfd9eef4dfbf38f3cdfde7cd1cdbddb86f4e34f3ae9e6dce9de1ce3b69de75f3873677a73beda7ddd7cd39e1fdb5e5e75cd767fdf35df8d9af5de3ad1af76eb471ed1b6dfd78e7cd1a7b97b8eb86b577b6f86f86b4f3a734db7f5a6f973ad1fe9dd78ef4e1cdb4d9adf7efd7f77b5d3cd1a71ee7cf5cdbcf5fe7bdf9e9fe3be3cf36e7df7569ee76735e5defae9af1ed1ad37e7ad1de3c7b675ee5e7dc7de7b7e3b75ad776f6e78f367b97fbdded38d38f1aeb969feda77dd1b71cefde5af3ceb6ebbdb7dfbef879ff74d1d7ddefaf396f6e3ae9ad7cf3969edfc7dceb97b9e1ed5ae7a73d776eb7e74df6e34ef96f6f7469cedd75a7b9eda7daf5eef4edcf37e5f7de6f6e39e9cf79d9ce366daf1edb5f79", + "signature": "0xb6844cd11cb9dc190a35cc5434062cedc1fb3cec35525effdf782ee9c1d44e8d226e88a929fc961650e003422f25afde0f507bb2cf1bc4eaa6acf555edc8425026e0fe7ba87707a083f4967e9d013aa58a8779aedd84a5e0da6fab949385a71f", + "withdrawalCredentials": "0x010000000000000000000000ef74988aDeBcf6ddc5a7B359761a2BE62c77ca8b" }, - "1684509291313": { - "depositDataRoot": "0xc51ea3a91b77186b53429d907eedf8a00a94606c9536e8a49ec6cf46216d78fd", - "publicKey": "0xb539b00532b0ec5475290e1144441463803476e136ed1fc2988cca5687623ca9fee42efd4043f009e9765fd266297497", + "1685979133978": { + "depositDataRoot": "0x93841f0a472da3567dbfb58259b6796f4809a6e890610d36ed1c3b854ae507ab", + "publicKey": "0x9602c77ea719f9c545d6cf431ed4dd16839736f974a573852aa11b227d0c72ebdafe29e12d0b519aa751b8dd07c1605a", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c088d3e2dfaf24b91a8e9053e9ffe21997daccabbbb675aaabfe6e8f3380b7bf8707f90857dba6fb4fd44fbff510b71999a819d88d70390b6d9a185514019a55b6be28aef717aa96eb1a0add499b3b6b097f1b05fc816d5dcdc9b234d9c8bf6f368a7e2d9a229169cce07bd605f055375798197b8266911054b336f5e5cea9fff9b3838b54e915955240515eade4e589b2a4336829629280e901f279108aebdf3bec26e5426c95b920716c9c9c0a1e82f076ecda96c831a43b64b2c735de8ebcbdf5c73bdfde3c7bbf5a7dd69cd1deb46de75df5d7f877df78ddfe357db6df7bce796f4e1ae38d7be5d71ef3c79f7dff79eb869f6b879bebd71edddf5a7b5e1ae39d7777bdb9d1a71c7bbd357bbd37778778f7dd3b6db79df3ad1ae3c735d9cd35e796bd77ceb9d766fbe1ddf4ef7ef6dbd79f71b7bc71e71fe1bf38ebc71ae1e77cf5fdfce3df5d6dee9c75fd1cd36f3befcef6efc736f7a7db7fbf7a7f97766f5eb96f6e74d5bd376f97db7b66dfdba7b7f397f4edaf74f36dded3571f69ee1a6b7e9b7b97766f97da7b8eb6774ddeebae34f1ce746b6e74f38d1deba6fde9a69cebcd1e6b4d1d77c7b5e9a69e71bf75e1dd7b6dff7be78df877cf346bb6b76b4f7bddbd9c69fefdd5fdf7f5ef5ee5df1ad77f3777bdb9e3777577469bf5cf3adde69be78db8db9d9c736ebdd79f1fe1dd9b7f6e74734d5f69cebde35df8d9dd9cd3dd3bd5b6deddae37ef8f3475ae5df5cebd73cd9eeb4efc6f4d7969a77addd6b47777b5d35d5e7dd6f7d35d36f5eeb56da7f8d1ef35f1f79ed7cedc6f6d376fb79ae3cd7a6dff7a75f6da735777774f34e357fa79b6b47ddd36ebdd7bf78e3a73aebaedae7977ddf969ed767b877c7b777869f69a75fe74778ddd7f8f747bbf7df5d6ba79fedf79c7dbd5ee9e777ef5f76f1fd77d34f75df6db66da71ddf8d38d5b69a7b5d3d6bb6fdedaef5f78e36d9ff1bd757dcdfbe38ddae5a6ba7fce9cdb6e7dd9f6ba6fc71e7dc6b973d69a7b6f1f73a7f8edfd7d7fbedb69bd3de3bf5ed7bdb4737774ddad7cd34d7dd7479e73d777dbbd387dbefbf3ae74f5adbb6b5dfd7dc7f77fb71a79f75a6b4734ebd7dbf7475ae9ae36eb4f75d35778d767fd69bd7c73bd34e5de9ad1af5f7bddb775a6f4d7dd3adbb6b67fdebbd7bd1b69c7fbdfbe7de3b6db6fde1bd7a69ee5af76d5c6f8eb57dadf4f79e3cf37f746bb6fc7bdd35d1ae3a77c77d7dbe75ef6d7ce9de1bddbeb5d3b735eb6d9bd1fefbd3771bd35e1bedc71ee1f7bcd3dd35f1af5de9a7f7dfbd35eba7f5ef9e1e7dbdfd77779b7f9d5c69df787f4779e9de3b75ae1cd35ddddb9d78779dfadbc69ed36db4efbdb4e3d79be9ae1af1a7bce3969ae3575feb9d76ebde1c75ed9c77ddde7747f97bc75ddf5d9d7b86fadf6f79eb571d7b76dee1df3a69df5af35edf71f77c7faf367f979af35d5ce7bf7cf5fef671beb9d7b71ad1be757b5734e34f5adbdebb775eb7f1ddbb77b73bdfceb4edfd75e3d7b4f7ce37d9cdb7e7d6b4f75eddf38d1cdda7faef469a7ded9ed7aeb7dba75bf5befbd38774d797fbd1e7b87baf7c7fa77569f79af7cd786b6f3779b73bf35736f5ddf9f3d75ee3df3ce9ff7a7f47bde5dd3575adfdd1de1df3577871c7b9d3adbcd9ef34d3cddd779d1ce9d6f46f5f1af1adb7f7be34efbd9ee9f7f4d7b6b7f7cf377dce75d1cd7b6f67b6e1bef8dbaef7f79738d76df5d3a69ce757da735f1af3b69af5a69edf87366dedf8d9cdb4df873569d75ad7a75f6b5737eb8f5df7cef6e356dae3ae9e6faede6dfd7769edfd71c77969f7fc7b9778ebcf39df7eb7ede75cf3beb5d1bdf96da6dff37e37d5e7796ddf1cd1bf5e7b9dfd6f4d5d77aedbd5f6f977de7dddcef87b76deddad3ceb573ce39e9e775d1ae1b7db71fe1cd76f1dd9ce76dbd71b71d6bae5bdfcf7af3be1eedbdb8e74dddf5ed76dde7def1fd7979c73bd9df1b6ddf36e5bddcedf75e6f9d7be9a7dfdf97f5f3d6fbd9d69d71fdf47dbdbc6bb6fcd1fe9ed3cd1f77cdf8e79774f3a73c6dc6b56b4e38dbd6dff5fe9dd9cebbd1f6f4f1cd776fcd7675bede6badb57b8f1ed78df57b7eb8e76d5c6daeb7d76d5ddfb7bd77bededba735ebbdb5e76f1bd9d6bde7b6f5db7e3de1e7f569bedbedbd38eba7f4d7d79ce39dfde1bd5fdfc71c7bcdf8dfbef4d39e397b6e76e39db76f76f6df67b5f3df786df7f5dddeb9d3c6f77f56fcebaf7975e73cebd71de1ee3b6bdf3bd1bf1be7879ad9eebb734ebc7f8d3ce1a79d7366db7bb6bae76efad3679b6f4d5af5ce5edb4e1fefce3975be5b79f77bf34e1ddb6d9b75d75d776f1cf7b73875ed36f786dfddfe9ddb96f4738f79e35edad7ae74f39edb75ae1de9a6dbf3d75a779e1bd9fd1beb6e5ce9fddbedfeb4f3875ed77e5adf7e797ba75be5be1cd3ae9cf1c71b", - "cluster": { - "validatorCount": 0, - "networkFeeIndex": 0, - "index": 0, - "balance": 0, - "active": true - }, - "signature": "0xaf89192dfb733d0ce75d2f9dbf899dcb181cd4f082b78b16d6827761583ad8afba8e4dd964de6dc72562b0811e700e2c042f8b8bd9c94e8bf3c64852509221fda6fb6d63b41bbd755b87b66cc8d27f6d2119443665b267cd9a2411bb31e1b7d1", - "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + "shares": "0x00c0b2a15e2a79ee323ce2056a0ebdb3726ce16e8d700677ee6e21a58250eb8a6f1a5cb06baff121a79d0a679e9b16307c3eb521b85fb876a8f9e3a938bd25a4c6e1a66109dcffdde4d0d28fdf82111858c73455a1c6e4a934163c4731fede98f0a4abefd55a34d04446ed5e0cf71a304d16c398193cf0dbe658096bdcac34bd5f9d07316214ed91c061d06826b3a6931368b89273b3c154462729e5769d534b23187ae5944b6d741d3553a2309520884d2e2ab474fc95942bdfd93b14f4850fa722f796bbd3ddfcd5ed39f7dd5d7f7f7c71b736f386dce7973be1fdf7e5bd5f6dd75beddf1b75ce3c6f877771be366fc6de7fdef76b9e797747f7efde747ddf7ae9ddbae5def5d377ddeb47dbefbd1d77bef5d3a73a7fdeb8d1ad7ceb57ddf74e7be7af3bd5ad7cddff5cf7a71b6fb7bdef575b75ce74f7b71fe5a6b5d9ce3d6bb6f8ef8d5dd1a7397f7d76d35f5e7dadfcf5be9f6fc77de7defbf7df39e3cd5f73c71be1deba6f5ebce3c6dae37ddddf7e747dedfdddd6fbd1af5e71fe3c7dde5e6b669befd7f5e3df5ff5ed9cebbe7be76e9f71bdb7df8d1fd77d9c71d71b6f7d7ae1eefbddc6db79ad77dde69b75ee3b6bb7376bce9bdfb73b6b9db8f397dbe396f8ddaeb57df73979df39e1ddf671adfa79d6f6f7c69cddcdf7e7be1b7b6e5ddbc79bf3cef57bae347bdef46b4eb6e7a738eb5f37d35d1def679b79dd79dbbd9c75eedc6f4db8ebbeba6fad78d9bf7b7dedf6ef77f47b977773ce75f7c7ba7da6fbe5e779ebd77ce7ce7de3bef9e5ddf7df8eb8f34edb79fdbc7766b57b471ad7ce35e1df1aef771c7dbdf6f7b7bae5ff1c77577ad1bd3cd5a77a6f5f1edbadfd73a77dd36d77e3b79ce5ddb86b87797fcebbe9a7ddef86fdd39e1f7b7d5b7f7d9bebddbae5bf5be3c71be38f746fce37e36d34e7ce77d3a79ed3befbe5bdb6774e5fefb7b7ef5dfcf7dd36dbb7b875de5b7b47f6e5f6ba7fcf3deb4f1c7f7dbce367367dfe7dd34d1bd1ae9a71eef8e757f57387da7daeb7777edf71be9ce5f7f46bbe7ce356b671af1ae7d73a73ddf87fb71a77969df34e7a6db7b6e387fcd1ff78e5fe5dd7af34d7ad39d5d6daefb6b5f7d7fbd3cd7a7dfd767dae37d1b7f5e7d7bbf1e738dfa7dfe9c71edf5dba6fbf1e73ddb4f5dddeddbf7775cd9c7df7b47b7d3d69bd366f8ef5d39e75e9cf376b6dfd7b5d35d78f1be1ae3de78df46b56b8d5d778ddc6b573df38dded9e79fdbbe37f7bd9af1a7f6ddc7fdf1a738d7df3df7af3ad9a6f7e9ce1e7ddd1defbd1cd9e71ed7979e7f9f7779df777fde7c75edb76dad7df74f5b6dc73dd3af1d7da7dee9ce1dd5fdf7edbf1cf5cedc738d1e75c6f9f756fbf75d1debcefbf3dedc69ff78eda69eedff3971ee5f7f9f5de5ae3669ff5ed3cf3cd3bd7c6baf7973cd39ef47367f9f1bdbc7bcdbbf7b7f7db87bc7de69c7dbef57356f7e1be5e7fadb4f5ed9ff3ce35f747dff3a71a69c734e5ff36d79d74ebd77beba7fad9bf36efae9cf1ed5cf7cd1cf5ed5cdfddb6e7cd5b73c7b6ef7e3df35ef975bf1ee7c7f5d5ce76f1ce75738d5ae5f73def473addf6f673de5cd1fd37f357fdf75e3ae3be3af5def6ebcf76d77d36f7b73673b7da6db6bd7f6db5e76ebc75f6fc73677d774eb8d75f1a79df5e6b9f1eebd6b5d9e77869ad5e6f4d75eb86b8eb8db9db9db4d78e5d6b4d74779eb969febbe1c71d6f6dfaf38d3de3dededfae36e9de76774e3b7ba75cf1ef79dfcdf7eb4edc75be9fdb8e397faddbddad1ee777f6e9a7b8ddcd7cd1a73a7b86dde1ef3a737e1dd5f6dd6b7d9d6f9e3ad74ddcdfa739d9c6f8e796b86f4d3cdf479f6bbefce3c6bddf76b9e1ed38f5de1e774d3cd7cf7af347f46db6dbf787db6faf1aedc6ded7be5e6bb7b8eb4d9e75a75af5dd7de5bd5fe38e1ad3c79be79e5eddf7b5f1e6db75bd77d9adbc6ddd7adfc7f7ddd71eeb66fde5a736dded79edf77a7df6b56dbdbbedb75dd1d7f7777d37efb75bf39f3beba7f6edce1fd3df757dde5bf7b6bd75be3dd396f6d3d775f767dd6bc75ef7de5d75adba6f775a7ba6f7f3875dddf734efbe9e71ef1cdb8d3b7bb7bae3de1c77a6dc73c7b67def3bf77e77edce3ce7af78dbcddcdfcd9bdf5dbcdfd73b7bdf1ad38df67b5e7be9cefb7f6776e7ad39d7dddc7f6f7b6fc6f57746f4db76b7ddff387b6e9c739d3573b6dee3dd5c6fa73dd1de5f7bdd7adbcdbbebc6f7db475fd377db75be9fe76d5b75ee3af777fb69be37df671de3cedaf79edbe7befdeb4db6d34d757fc73669ed5ee5bd77ebae5ed5af7569edfce7569a7f76bc71ddde7b6dbaedb7357f77fd7bd6f677def6dfb73cdf8f3adf76ddd1c71d736e3def7e7a7b6f7a7dc7df6ddebd7da71ce3471e79f75a7b9dde6fce76e366b77f8e7be5c6dfddfdfc734dbcd3a779efdd9f7356dcf5cdf8", + "signature": "0xa892d33e6f3c90f4bc1a4f473fb0673c63a8a5492d10697a0a6efff0df6856a86b2787535ea3cffc15a3edfb388637e5159efbeaeadd0be91b4fe86a15ee6e769dfa25db8c77801b44560a943c865be9b94e09de866f4941c2fbf65188ebdb97", + "withdrawalCredentials": "0x010000000000000000000000CFA1dDd1b603446b5D58ef2fdF7caF243a745671" }, - "1684509306139": { - "depositDataRoot": "0x3427ad6afb3352f0b7b066b238422301c344c5c3a0387a0c99f9345503ff0a49", - "publicKey": "0xb52c33f4dae58f49acfe760a89d1232db1acf61a70474c1a39fa2826c8c4ab71c61fc0952bfddc3fba665e8c975bfa5b", + "1685979145939": { + "depositDataRoot": "0x745dc1bc2fb264c50c32ab735629c63433edf7bf94cfd78cfbc51e3fd783b9eb", + "publicKey": "0x85cf2556ccc2a815f3c06239c4a8b24f336dd7937421bced4f9b554e18164697a5440fbb857522360a33ed5c3f3db360", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c0ac8d77561564e4b72f7ab129202f71c80f164eb2d4950ed106a441bd371f8274ee35bdb795b859c5b244d578f486fd2192fe9794452e31ed7327d749e628b0b37c768477b0c02692768bc56462e882d6d76cb57efd4ac6b59dd31bd0250d5a4b90112d1e96c0b067e24c2ce7145d334ab1b55486b7330662e74365e29086acad8df1eed3381803b522db303f9f9d3457b5290443d47f727e5f83646d3156dc07569b97b86df6992aab63f5359d7f43433228e6c85ccf3d11e675c53c9b181193dbdeb9d5c69e7b479e6ddf797fcf3def4df9f7bef8f5ef7ce3b7dde3dd1def8d3ae35e1b73a6bad5ae1ad5be5bf3671fe5b6f6778d5ef74d1ef377dcdfaedfd74e9e69bdfcd74d7b79af78df4d7a6dd7fce7673bdfc73669b69b777d38f37f37f5adb4efad7aeb4ef473577971e6b671fdf86bdf3af38e78f34e5ce3af7beb57b76def7a75e7ddd1e7dde5ae7deb673df3ae7b6dddda73dd3bd386f4e9adfddbce1e7b9eb9e5a7de7b9e5d6dde9cf76e9f6fbe5c75af77f75f7d69fe5be1cd5c6b86f9e7bedf6f6f7b775f37e74df46daeb5ede7fce797f975a69d6f9d9c7b5f796de7f4f3adfcf1def4d9e6fae9d7bb75fe9f7bbf1be9be34d5b69a6fbd39ddbdb7eb67fa7f86b7df87b9f34e5eebbebdddbebce1cdda79a71ee1fd5b7fbf5bd1eedae37e3669fd7ad3773dedde77df5d3d6f6d1f738df4f1deb9f1ad7cedd7ded3de7dd5a75eebb6f9f3ce1ad36edad3af5af7aede7bbd39738d5cef777875f73dd74776e9fd75f7cdf7ef4dbcebc71d71e79c73577ae5f7bdf1ee3b6fae9befa6daddddbdf76edd7f6e356bb6f8d5ed396f7f37ebaf76d7d6db79e69a73d75f79d71ad5fddad347346b6e39ef46b9f5af787357f8e9c6bbdf6f3de7d7f6dbcdde69fedb7bad9a79fd7c69bdb5f1be1de39d7bddb6bc79ff3d75ff34f79f5be36ddcdf8e1bdb57bbe36e1e6fcef7dfdd74ddb79ae5e7b679ad7cdb7e9ff5b7dae9bf1dedf7f86dbf1bd3a71be35d9bf7be5ee75f5e69fdb7d1e7357f4f1de3de5ad5ee5ad38edde1b79adf4ebb6bd73569ae5a75d79e775d397baf34e1adf87bcedd79ce1ef3aedbe3df7cd3aefa6f86f86b96b46b96f477773dd5bf79dfdd1fd1ed3cf396f9e1d6bcd3d7f8df9ef4e74e3bf7bedce1adbce3b7f7778e7ae7adfcdbbf3575a79e69df3ce38efaf3777dddfebc7b8d38dfd734db4ddd6b471cedcef4ebce1a79d737ebdd9ee7a776ef4d9ff76edad9a6dee9e737f34d7579e77c6baef4db77f9f3ceb46f769ee7a7fb71cd5bdf475aefbf35d5cf79d5ae1ad9c69c7dcefddf4e3c6f7ebce77f75f39d3ddfc6b9735d3b6b875fdf6f76d1a6b8e7ad5fd1f7faf747b76bbe5d734d5bd5fd39eb9d5ce3b7b9df97dce7df3475c6fb73dd9bedbef669dd9ddb46bde1c79eedce9ee3bdbaf39f5a7ba737d35eb97fde5cf5d7daddcd34eb6f1d7de6dad1dd1e6f8d1b6b7edadbcf3ce5b7357f4739e9f736d3ae5a71b7fdd75d3773d6dfefadf9777e5f7b87f4f5fd1d7bbdbbdb7e9b6f6d3cdf8e9ef7af3bd76f76df8d3cd9b737d5e7367f8f1adf8d1ee776b8f5d7fcf3bef8d3b7f9d36f38dfde77ef77f6d7769dd36dfb7fad757dce7a6f8d9ddded37d5cdfbdfd73af7d71fddaedd7f877d774f5cf7b6da6dd7f5ef977d71ae9ae75d36d1ce5ad9ad9ee9cdfc6ddefa7dee34d7bdfb7b86b7f7b79bf79dbb71bf35f1be5bd7ddb9f5c71cd7cd5ad5c777e3973775ad38d5ae5de74db6e75d796f775bdbd7b46b5e7ad3bd7ad1f75e6f6d9ae7cd5f77579e6bde5bd3d77979e7ded1be9e7366fbedeefb6b5d74f5bdb9dba7b471df5ce5d6b5f78d1bf3c69f7b4dfdef8e38eb673ad7c75af7a7f579af3be9d71c735dbaf5cedae5b6faefb79fef5e1c7bd7b56b57b87366bd6b871cf3bdbdd1c77475cf3ae9bdbc6dc779e7ce5f778e5f6f5eb9f3aebb75eeb4dfaef677bf74edbefddf8d7c777dbaeb4778eba7bdf1d7f4e1c6f9dfcedae5ff756b675c77befc778e9bdb7e9a77beb4d3c77ce34edbe3ad1ddbc7fb6f9df6d78f5a69d75cf3a7faedfe77db76baedd6fa6dfd3a71ef76e1f73677ae79778eda7356b5eb8d5bd1d73aedcdb6d376bdefc79dd38e7d7bdd38db87796f4d1f6fd71cf1bd387f5df86b9dfc79dd1b71ee5bf5b7b9f5c7daefd71c6dbd3b73be7a6fae78edaebb7fc6b5ebbe7cd75f5aeb9e7779d71b7fa73dede79bf37ddf7bdef5d777b76b6e5e73a7b677c75aefcef8edcd757757b4734e3dedfef76b96b8eb57bcdf9d7af39d3be7cf36e9de38dde6b7d3bf1cefa7f773de1ff3bf76dbdef4dfb6f6f3775bf36f1ee5aef9e9edf969e71a7fa6dc6f6db5777f1cf7ddf6f746bb6dbebdf767f8ebcf3979ddb669df36e5ddfa75ce77774d39db7dfcd387bcf746bbddae3b7b6774db7e9dd7bd74e7d71df5ff34", - "cluster": { - "validatorCount": 0, - "networkFeeIndex": 0, - "index": 0, - "balance": 0, - "active": true - }, - "signature": "0x8022c8a7dc07fa36fed97e619651943498b842591b58b1fc4f6374a46c819102061e39cec391b4ad02fd3be6b022c7ec0764721c32fbcb0053f09f0104f1ebf3c14959df77362526d83e65a08ad9f9d9b5b9b27b74ec0d69bea34afb2edbaf9b", - "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + "shares": "0x00c080ffb940a61f31c8f5027f666f88bf838babcf256cd6a07f461b8143d10a372e9fd1a55ee91992f342df3b2c4c9722e08805e85dd4359ae7badc42f3a6a82e5588125eceb86b052b7b692dda1d4d3f38fe12e4da2839bcd4d3f592b0c151d4368e1cad7d67c23472f08b629f979cf7874feaa1284924a007297a9e5832c6dff3764a4b50b4caa8e098cf64f5dcb39aedb4df657ac03f5fe54f375aa164bfe24329ea121835bd71f3bf42980b50d1bf3cf137e604b47c5a8c82f342967861c94eddef7bd3a7b4f35e1cf3477ce5ae5fe74e396bbf7cd1cf1eef8ddceda77dddf7b6f5df367bdd9d6faefd7b9d3569bddd7de7756b8d7b7f4e377366dfebcedbd7b775ddedde7b5d797fb73a73a6f969ee9e73b77cf5aedeedae9e6bbe76d34f1fdf7efc7f7df7ebdf7c6b5ede7bc69b75adbc6b9e35f3cd34d7d79de39d9ed39e7c6dff787bbef7eb5df4d5d79f7b879ce7471cf1edf6e7be346dce9ae37df9f1ce7bef9e9fe5b6f4f39eb46dee7be7a69cdfb75cf1fe9b69be1ef1eeb96f6efb7ddd1bd9cf5ad75d3c6f46b675adb56b5f5e73b75eddde5fe3a7b96bb7fa69ee39ef6d7579e71f79b7fb739edceb9e74e1ae1de5f77ae9ee9e7b57fcd75f3d6ba6df777d5ceb67fbefaeb6ef775edbc79d6bde346b4f36d746f6f1f75b69e7faf1e75ad3be1fd5bd5fe79dbce1c6b87ddeb4dbad9b77773971b79fdf479deb57346f5e36dfaddbdf8f36d7dd5e7db69bd1ee76d78f74dbb7b5f3bdf9e9fe37736df9f7cd5cd7ce79edcedee3dd5cf7479e69d69cf5beb4d1b7777f971bd397fcedfdbae9bf1aedbe35d37f76edcebddf77f4e9e7bb779d36e36df775a79c7fddb57b7d7b73a6dcedcd5ae9f6fbdf6d9fd9f6f4e5ff34e1cdb7e376faf766b6e35d9b69fd5ae9bf3b7bb7b77b679ef7d6b8ebbebbe5f73de3877579ff35d3ad78f5bedc7fc7f87b4f5fdbb75d7bdf387b67fd7f5f5de7b6b971d69d7ddf7deb773de7575c77477bf7adbbe5a7db71ae3c69a71c739ef9d78778f7aedbd37d1a75cf3d6f67bc7faf3a73af3771a7de7746bbe1b6bcd5a75a7de71e69ff1ee9bef9eb6eba7def5cdb46dad7871de9eedbdf7dde75cf35d39edb7b9d7bdf971be1addaeb4e7969ad1bdf4e7577dd1ce5f6dee75d3bedfd7be38ddce1bf35e9c69cd77e1e6f7e1bedc75bdfcdbae377baf757bcebcd3d69bf39d3ce39e9fd3d75f7da7fa6bb71fd5c6b4e1a7b4e5d7fcd7a7b87397ddd9df5fe39f5edfa736f757dbe34d7ce7bd1c69d7b57dd7f9f1ee757db77d7b5739d1be74f5deba6b76f47b97bcf79edee3b69ed77f3469ff75d77dfdef4e1eebcd76eb6f3ae1bf356b97b7edfd7969a7f569ddf5f1e7357fcf7769a69aeb5ddfdf5e35d1b7fcd34e5de36e1f6bd75d6b9f5c79ce77f37df6e9d7fcf3af39f38e746fcefadfd79cdf7edae77db5f1d7f5d76edfddfd386bb7b577569cd5cf3cd39db77da7b4f76efaf5cf1de1ad5b71befb69e776eb6eb7eba73975c7b87dcd9b7ddd9a7fde1fdf76da7ba71bf5ee746dad3ad1a7f879a6fb73be7b73d71a6dc77c7bae39d5b6baf7479fef46b9e387fce3adfcdf97b5df5e7def6f5ad7dddcedfdf4db5ef46dcd5e6dfdddf1bdded3a7fbdf9f38e1de5f7da7b5f36df779e7346f8ef67f4d79e9c7346fd75bebb77adf6f34db8e1f7f46dd6b6f1a7f8ef7e38dbddb8ddc739d3569af397fc73a7dbebdd3469e77869af767b56f7d79ddf7b5f3be3c6da777f7b6f779e77a7ded787b7e5f779f1cdf7d34e76e5bf1af74dfcd5a7dc6bdf37d1fdfaf1d737eba6ded797b5db9d9ff38dbb71d7f6f36f3a738dfddf5db5f38e1fddeebcf5a7b479de79f1c7fae7ae5f69adbcef8e787dceb5e78ede69e7b973bd1a779f7b6f675bd3b737738f5f7f9ef6db6e7bdb5e9f7fde3dedbdf9d3cebbf74f5ae77e3bd1d6b9739efb6f66bdf377bc75d75ae3b6f47f5736efdede6bbebcd74f3df756def356f5e3a777d3de9ddda7b6e366bd79ad7d77dd9dd5d79f6de6f47f97dc79ff3af38f38d78775efbe9df76736e1a6f6e9a71cdddf7a6fad1ed9cedbf38e1bd3be1ad39e7471d7dddfad9f75e6f7df4eb66fc75f7bdd75eb675b7fcf7771b69d75be3c6f96b573571af7a7daddd7f76f57bb6dad1fd5addd6ddd1f6faf1bdb6e1d71e7b7edad7a734e7ad5ff5a6f7d7d7bae7adb67b679cf7be7671dd3ad5e7fdf5a6fbefc7b5eb47dcf37df8dfbeb8f5b7357fbe1b75dd3c7b8ef97376f9f387786b4e76edee7de7ce7a6db71a71ce7ce1b73dd7bf3d73869bf7ae1d6daf36e7d7f66b9d76e1f6ba7fbe77f39d3c6daeb86dbedd6b5e3469d75aef6e34737eb975ae7c6fbd356b469a7b4d1fd7be5fd5b69bdf6db5ef9e5d73b6bc6fb69ae5af78e1b69c77ce1f7fce9aefbf3bd38edbd7ad36e3975c7f8eb76f5ddb6f875feb4", + "signature": "0xab4a1e8451c3cf64a13d2aca34f0dded939d5b50ec2cb62dd980b5cec30aabb59eac5b098b27c5c6583b4992ad0fd05016210f5d877f3635e73bc2d39e02b57b3a6ac367ba61d635013f1e5e536ba4bcafd04c6cdccd293bf3bc6cff18e1e91c", + "withdrawalCredentials": "0x0100000000000000000000009bee67F3890D32cb0c77AEb1a217882eF326f83A" }, - "1684510150493": { - "depositDataRoot": "0x54b8d6089ae41ff84f4c06822d79059840d9189af67013a0d26ca59614dfa64a", - "publicKey": "0xb4eb5f3d63a54af41cbb7d950ff4b24ead3d55246ef18bd526806038479a0606b8492ded433320fe911a3298c8d5fdb4", + "1685979158096": { + "depositDataRoot": "0xf26c2d9d266e21f58558d105ef66c228c6b6a8e5c13849113aa65cf6631aeb9a", + "publicKey": "0xb14c85822748446bd9db9f3e3a463d4d3ebb77c46809292fc1fa98c3453c17d159f7ac626a30bb32735888887731ae07", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c092e11b4523e99534fc2f5fa4ea26b83ba3527312734ee7eb52811d6f614b0c2eb7dcdd983f6113080b7bc08b1e2adfd78230a18189485c387c462ab54d0572008700d6acfaa0ababad372f07aaa37618e1552170fd57d83000c75a0981cae613adf1999c188d1997bb9c78168d85144d6cd45c514d1c94dd7ba2901dd52577a2abeaf10a851eef15a6218b96041be9aca620d5eb87e453383926887b710ee9723bd1fde5e9c49e8857bbef0e6069560fc003277ba93679a67653a0751d70eb5d6dfe9be9aebb6f971be7c7377bd6bd75eeb9f397fb7de7b4f1a71a7776f6e38d7be7df35d9ae38ef97db73ce9e71cddc6f4739f5adba7b5df8d77f7df76f1f6b5e7bd9cdb4d1f6f67f5f77d5d6fad35e5a7dcd9f6f8edaede7fd69ed3bd77e9d77cebcf3bdfa7da6bae1b7f9ef9e5a7dfe77d7dd7df7ad1ed79e5b6b4d1fd367f6f75df46b46fbebaebaf1beb879e6bb737db879ee5f73af5d7b8778db5f5fd76f1f6b6db6f356b671ce37e5a7f9e797f477c6f5d5fd5f7f8f3be3def5d5eddde9be7a7f4f1ce77efcd1be5d6de69fedf79bf7cd396b9d5af38db9d5ce79dfaedef7af5bd756fd7f4f1be1d7f7e5a6dc7fddf775af77ef679fddee9f71cd5a77dd3c75bd3ce79efcd9dddde9aef9eb8f7777ad7777d7767767fcdf7d7aef77db6dfeb5e3a7da6f9f38efae1febc6bbf39d7673af37f79eb4d9de9cef9db9f1de79df873bf7671df7cd77d5e69ddfddb6d1ed386dcededf671fd5c6bbef9e75f3a71e6fa79be1a75e6f9e5cd75d9ddbadb5f74e5defc7b6d5ed1b6dceb47baf35e3769bf377f8e7b6fae9d6b4e1c73addcf356f5f3b7b6e75d1eeddd3c6b66f8d5b7b4ef86b469f6f8df8d9ce3bef977979d73ddf66df71aedfd1cf7679ceb87bce9f7dbe9cd9bf5dd9e7dedf669c73b77beb87f5dfadf4ddb73ce3975fe9de9c7dc7367366f4d1a6f9db7d9fd5e6da7bb75c71ae9fe1f77df5b69f6bad387bc737ebbef569eedddbcf5bdde6f9f1e736738f796b9d9be1c6b9e377f5ef8f75d9e79e7dd6f771ff7ddb8e7bf5f77871e739f74f78f3dd5be77d1cdf675fd7ad3cd9ee7a7b87b8db973de35df6735ebae9a71ce1f73a6b5edaef571ee9ed386fbd5aeb4d3d6bd6dcddd77b7b7d3af7575ed9bef96fbef675adb8d78dfdf7de9cf36edce3c6fde3cdbd7bbd9c6bdd34dfb7f7eb6f377b6ebb6b679cef579e69e75ed1fdb8d9ddba7df69e73cefae9ff5e69cd3971d6dbf5d7346f571eedb7367b9e747f7f78df67fcdf5ef8e3cdb56df79bdb8e1ef3ce7be346bb6bd71b69d71fe77d39eb4e3cf1addc7f4779f5df1fdbbe1f6dcddc75de35ebbe7c79d79a69d73cd1de34eb6ddbf1fd9ef5ddb571beddf7575ee1ee9ee7c775e1cef97b97df79a6dbf5def8eb96fa71adbbd1de1de3a6b7f1edf6735e1ee7d7faf3bf1fddcf1be3c7bae1feb9db5f5c73d71fdbadbbf5cddf7bb6f8e1ee387fc73c79deba75a71ad3773ceb47fd71ff1ceba75fe78ddaf38edadf5edd79feb6ddfef7f1ae3ad5ff5ed756ded79e9af3669df1ed346b873b69dddce7bedfebbe1a6bad38e78f76f7777ad5e75ce75db9734775f7de3c69ddf9df77b8df7efcd366deebdf5d739d7ad9f79ff39e7b7baedc6fceddd3b6f4e5bdbc7fa75ed5ff34f3777769bdbc7f9e5a71ed3cf35d9a71dd74e5bf74d78e3cf36d1c6f9f34d1ff5f6ba7f4f36f3bef9e38e3bddcd9edb779bdb87fa7b9ef8edce3af1adbce767f8f1aef4f77dfa6b9dfa79dd5f778737e9c69f7b46b96db73777679beb46bcefad9bdf6f3575ee1a6f97fcdba69b7bdd36df8f1dd7d6bb77779adb96f679bddaebce3c75d7dd77af3ad3cd5ad9fe38db67fbd357dcf5e7f8d9bf75efbf367b8e78f1ee5b778edcedfe7aefb79edbbf3cd75e39db671cf1bdfa776f3de3bd39f78edce7dd9ff1fe1b739734f5ee1bf1f75f79a7b4eb9ef66f7d1f7b6e1dddbe1fef8d747b57f4e9d735e3def9f1b7b66baef773de9ad5dddad3577473bf1a6dae1d69af1ee786bbefa6dde78f1bf357387787f4f1a79c777f3c75f69ad3469fd1de7875bdfbebd79d7fcddceb4ebc6db79ad5df3d734f7bf1ad3ae5a75b73bef8ebde1af5ee1d7dedbaddd71df7ae3679df3475fe74739d7debceb5ddfeb47f879bd7def77fbf78e1f73879de3971ee1c7f9d34d3c7de6bbd1df7ad37d756f8e5c69df79d75d5b79fddee387fa69ceb67f9db4db6f77db6dbb7dfdfadbde7ce3573b7ddf7669d6fddfb77c7dfdbbf3bef4f1fd3df35ef8edde9e75f75ee37e356fbf74df4edceb8d1cd1ff767fd7f4df5e387faeb6ebcd3cdf4d7d7fd77c7b5d5c6f571a75df5ad9d734d38f7addaf7d6df6faddde9af3c774ddcf79d7677a7b9737df9e7c7bbe1cf1eef9e3ddf7e387fbe37d7473cd76dde6dae7cd1c71fd39f3ce9bf1deb56df7db", - "cluster": { - "validatorCount": 0, - "networkFeeIndex": 0, - "index": 0, - "balance": 0, - "active": true - }, - "signature": "0xa476ca15430a49ac63bc86679eac7c9617c32af2448db31e4353c0bbdfef24c1ad7aa8a981eb834dce58f183bef41654069af0861c188cbb7cbe82790f6a307cefe10da7408f9ca0cdabe27128d3287e75a508d68c7976d61a9ccb0f29dd5ca1", - "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + "shares": "0x00c0acec6d9d9f16afd58ef5887feabaa16b5c89819d92c1e4bce524b202e2bd9d60a06c482a5471a356b2684449ed129daaaea39703ca661404becaddad96cbc61d823f98ffdd8b81012a764f1ee5335d50a943b882eb03d5de071b326fd2f0ab3c96c81f09595dae832364f9e886e4b98b5d1d86aa29ac6e928fdb60ff33ed8d1bb8d698a15fe33b5632945ef4915f754f90086848fb1d311ff1e2c87d4d1293c0a2a10c29ff0a0f3f76c3d1bdb2e185ee9f3ab4d6548121ce247bc59df0a3d33d6dcd39f3dd9a69ce9b776e1fef771b79ce5a7bb7bdd75eb7d9be7879ce9cefdf5bdb66f979d774f5cf3a7bbeb66b8f5b69e7fbf3ceb6dfae74e9befcd76dbd7b7eb475f71b6b7e36f5ff1ee79d74edff3b7f9eb5f3be77df5e1ce7d7fcd9a6f8e7ad5cedbe35e5f6dee79e5e6b8ddddba7dcebde9dd9ad7bd7b7b9d9cef471d6f4efa6bd6bbe9be7af5bdf77f9e77dbdebceb4f786f4dddf5af1b6bbd37f5f739efb6fa6f4db77df7dfd1b7dbebc6dbf5edbd79cdbaf3775ee1df7dd767f7e7a7fc7f5db571ddfad5ddb4d3d7ba6fcf5b7f6df773c6fdd7c7badfd75ef1cd5ef3a7dbe9c6b4e78f5f7dfd7dd1d7b4d3c75cf5d71df7773ce746bd6def3ce1fdb57b6f5e6fcf5c6db7b6eb66df6badda6dc7deeb8e34dddddddf77dc79fdfb7bd7dd6b86b87dae9cef775c7b8ebbdb4e3c7f5edb75c7f479bf75d9fe9d69a7b6d7bd9a71e6fb6bc778f1b777e39e77e3be3dd3ce9ff78779f5df77e3befd737dda6bcdfa739e7cddfedae1f6fae367bdf1be377b86bd6bdf7d6b5d7ce5c73b6dad757fcd9bef969cd9addadbdd3a738d35f1addc7b7f7cebad357f67fae7cd5df5be7c6ddf3cf7671fd3c71fedf77deda7baf1bd7aefa7f9e396b4dbbdb86b5d7bd78f3669c71c6ba7f8d7cefdf1dddb77679bdbcdb6d5ce9d7f5f78f5ef39eb4dfbedbf3dd367db73d6f8e1ad1a6fcd3be5ee3c73969ef38e7a75ddf87397fbe74d9ff7ad1fefbf5deb96da79bddddf7d7ad7c6dad5febc7b769e6fa7756fad1ef396b4eb57bce35e3d71ee77f1bd1cdf6f7977aef7eba73671c7b577b75dd1ee37dfc79ef7df5ae1a7dad7af3c6b5edc7bddf6f76df6d1ae1ed1cedef767dcd9ee1a6df6bae77e1ee7a7f4df873cd1adbc6f67fbef47dc6b4f757b6ef97f77de6f6736db5d5cdb769aefbeb475af78db46fb6faefd73d7bc73679dd9ed78e1bd1ed3be3df77f1adb56dde7d7f9e1de3adfddb5dbbf766dcf1fdfde37df969ce7cdbc7fbe35f3ad36eb96dadb4e1bdb7d756fdd1ef1aef86f7f1d79bf5a7b877cdf5d3bd77d9b6b6d1aeb7f1fe76e74e34eb9d5f6bce5b71eddcf74e1dd1de7b7767f4eb5e3be3ad9df1cf7cf1e7b8d3a69cdf6e9b73aef8f5b6dfd3cd9dd5ae74e1cf1be34edc6dbeda735f38f3af1df3dd7973c69be9f734e5d7daebbeb76b7d79dbae7ad5bd5af1fe747766fcd5a69af796def36d9feb7e5eeb5d3d6fcf7c6f8e35e1e7dc6f571b7b4ef8e5f6f87b4e1f7bc6b477579aeb66b8f5bd5ef3af7a7b57f4d75ede7f4e1adb775e73bf5ed3669f6da7747fddde738dfbe3be7cdfbdfadfbe35f5a6da7f5e5df1df5e7b87396bbe5b69a73ddfd7fddb6f3be9fdbae5de34d5ce1ae5d7346bcf7a6bddf9d7bddcdfad1ee1ce7aeddd35db6f3b79bf7dd7b7b4d1d6f8eb67de6b6d787796f7f75dde77c6b46fdd7ae74f39ef8776e39ef8f7bef6df66f87bbefdd5cd7aedd6f671ef37f35ef777be3d7de7f9735e1fdf6df6ef47b8d76e7a7b9d3469e776e5adb8eb7f78f5c7f87ddd79f7debad77e36e1bf1dd5c7fb6f47f6ddb71ad79e1d75ae7bd3bddbef8d5e6f9e1ff38d5cd3c7bcef8d78d7d69e7fbd3af3ad76eb7737f347b4d9af38d3cd1e6f6d7bf5be79f1cef67777376fd71aeb96b9f7ce9b73de3def46b8f3cebc73cf78e1de39f3a7f5e9a6bbf1d7f9dded3b79b6ba7bbd36eda7f5ddae5cdbb77875de7cf5c73ddb56f8f746f9d1ed1a6f8edae367f8dfbd9ee1bd9b69c69adbaf1a7b869c73871ed7aeded9f6fdeb57fddfc71f735d5e7dde9b6f5d5ad3bd76e7bdb77fcef7d1c69dd1cf1ff387fc71ee35e35778d5c79ff3ae74dbdebbddfedc75adb8ddef1a6dcf5ddbce9a73875fd1e6dd6b4d38df5d1de7ad7adf8f76d76dfbefc71bd377bbd36e1bd5b6b77ba7767dad39dbdd9df5dedb6f7d1e6dfe34e7ae5eebc73575ad797baf77d1fe7dd5bf39d9f77d7f4f1f6b67dd6b4e9c7fbedad78ebaf5f6de69aeb9ef8df76da77d7b9d1bf1adfae9ce9cf3bdb869dd7aede776f76d3df5ef36f3de1c6fd7df734e1d73dd3bdf8db4dfcdf47fa71fe9df3ae9ff1cf3871c6f87b6f5eef7e74eb4db973bdb5f3569be5fef6edad9a7f577677adbceb9efdf1bf396fcf1a7f6eb4efc6b8d3a69b73ad5eeb8e7b7f66f6df4e1be3ae3ad9f735d9f", + "signature": "0x8f7891346a62d3811a08a1746afb0c78875cface6db3d00f9f4141d2435ced664043e10b255ac3eda943f5e9abba31750594df1f9125afa29980c9ab0d44679e0a5bd76b67f4a8a4d02e0138c7e5c080510eb0b2e40171efed14f8f4e502542f", + "withdrawalCredentials": "0x010000000000000000000000a68F49f72d73aDD737CAF08879027b297203A215" }, - "1684510604996": { - "depositDataRoot": "0x9c9aeb5a7a2ec9abbfafb9cfb0be78abb8c05930f44df410180b326dfddca331", - "publicKey": "0xa146cf9f0f80de325b5b158f064580f5d7018507415d87fa34e8819d61e7483d8b38856409f8dc1330edb0d4e2a10eef", + "1685979183480": { + "depositDataRoot": "0x80c231ef5eea03d7c4c450b7bf751ef7184c74a416b5d5a6748d49e3db1d995c", + "publicKey": "0xa3d222b4270b8aca52b260b1cc38d24949b3640ce19b07711add7bb504c5c1a3a93db824b86afbfba61b1c3fed690c9d", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c081caa6c16a272622918886db902f3228073fa00cc4c5e365ec806fa650d4242f42aca8447361e7851e3955edf2746b56ac73b09c2dd726d70ca5b2dbf3474c58a1a5499e59958c3fd65ee77781a7c293cc12446ad257fa0ac1ccd2ed25f1991d8f608071270bb693ba0e8e3185a3a4c61ae98a9db1484e3b3899b0700cc2040662342f65bab01e6d9adcd56df03f2490845f84659648401a4380f99b12c17da050e8ecdfb799040d6b0d1160ad473f62aed8bfe5c9fdc85ff46fb762f373f7d4e7bf5df3be1feb8f3d6bbdb477b7dee7bd3bd35e9bd5ff396daefaf1f7b6d7cd78ddbd9be9eef469dd9ae34db4d1cdb4e3adfad79776776df6d9d6f7f1e7fce9d6dae3c79ed3bddd71d7baf1eeb8f75f5ed7d71fef5d1a6b6e1cf1c7f7d1c7b577c7fbf3775bd5ed9c75c6b7e1cf5eedcd3579cf36e5fe9bf7ddfde77dbde7977af7a6b96dad5bddf69fdb7eb9dfbd3d69c77cd5dd7ad3bddfdfdd9cf1b79f7366ddeb5e3be3bdb8ededf7735f79e77f3de5be5f7db6bdedcd5edbb6db777ebcd5e7b47f873cd79e386b6edbe1bebceb8e9fe7475e71deddf77f75e9de5fd9a736f39e5c7f7e9adb5d3ae3cd9c7b9ebbf76d38ef669cdb8edaf37e7b77ae766fdf5fe1feb9eb8ddd7bd71feb4f76f5b69feb77b673adbc7f5ef8dded9fd9aeb5d7adbdd1cdbb6b471c79bdfdedf7b86fa7377b6edad9f6f5f746fce3bef7f5bf1feb9df9734f5e75febae5d73de7debcede7dc736d7bf5ff766b6db9edd75e7787b9e1b73cd9f71aedbe75e9ef7cdb971d75eeb577875edb875ef5ae5f6bcf3c6f96b4f5fe36f367f9ef6f1ed35f78d5ce7df5b7b67f9d7ad7d7fcd1ae9ad9ce34f1f69fddcd9de38d37edfd7befb79fdf4d38f75736d1fdfb7fde9b75b6db7fd69e6b5d7a69cf36f746f5f1f6fcd36779ebdf78efb7bd73c75dd1a77c6dde776f8eba71d6b6e9a71be75ef575b75ed9be79e366dedb469ad5fef47776dae9d7bb7f8dbb79a73ae5f71b6f5eb4f787f66dfd5a71e69eeb5eddd396fb6dbf347f8f5ee5cf36ef77bceb7e1aef6dbceb9e77f5bd37f1bd36d5b77a6fc6f96de6bce5bd9ef1b7f47f66fd778736d34f5c6b8e3c79ed5e6dcf7471b69e6df6baeb9f5d7f96badb4edf7f56fc75d7f46fcf1d6b9d1bedc6f8d3473971a6dd7bc6de77adb4d1fd9a69f71b73ce9ad79d3b77bdfde5edb5ddfd5e71c737ddeefb7dfe75df56fbf7a69fd75e1dd5b6fb7b9e3cddc7346fcddeebc7b7eb871a79cddaef6f5d75ee5ce357387ddf5cddcd7adf67bbe3bd1cd9cd9e7dc6f8e77d9a777d1ddfc7f5e377f979fefce1d69e6dbf3d6b47dfe9fe1cef97def5cf5ee9ee3c7f9d39e78ddb79ed1ed77edcd7575fe1adfcdb477cd1aedb7b4e7af3adbdd7a69ce35f75775db973d7b6e78734d3479a7bde7af786faf3cdfaf3a7357366f67ba6fadf67f8d1be5ee3ae346f46bbdb5ef97bdddad9ef7cf34ddfd347f4dbcf35f777b4d9bd7d7b575feb9e5ddf57f477cd37d5ad39e746b8e9e6b7efad76dbdddef7bd78e77eb979df34ebbf3473cf37f36ef7f7671ad1d6f9efa71be35d35f3d7b471bef6e7ae7c73df5e734d7dd5c6b4f5ff1cdfd73d73dd5de1ee5ff1cd5eeddeb67777b6d3bf76735ef66b9db5e3d79aefd77d79ed5d73cd39db4d3af346bc7f4e79ef9ef5e797df6fc6f5f1af5b7ded1adfcf79d9a79ef77d9cdbcf1c7fdd37ede6dfe1be1b6b4e3af37e36eb5f367b4edd69b6b7f3bd7ae1ad3be1f7dedf469feb6d7b7b4ede7bde3875ef5aef7d376dedf76ded7be7aede73d6b7e78f767787f86b4d5fef97f7e79ddd69bdb67f673bdfd71a77defc79be9d6ddf3475f6bbeb7d9dd34736d3dd5fe9ef7c6df77bdfcd1de1f7bde9cd1d6f4f1bf3cedc7dcefbd39db9e76d38dfae7cddd6f7edfd3d6f4ef9dfdd3df3bdb6d34f356b6d9bd5df75e7debd7b6f5bf35f5c7de7badb9f7b75dd747f67f4df9df4f1b69debcdfbf7cf3bd9c6fdf7af3ae5ee9ad9d75a7dbd1a75f779779edaef57dc6dbd5af39e5fe9dd1cf77e377f6d3ae35f78f1ee9ee9aef6f787fa77979af37dbde76db66b9d7969ed9fe3dd1dd75f1aebdd9fddc75b6dc7dfdb8e77db5d5d7bbe7ddddf7679edf7efbebb6dfd9d7faeb6db5d1ae9af36f1a75ee5b6b5f7969cdf9f75f1ef77e36ebaf1fd1a6f7ebbd1e6bbe7ce1eeb9d346daef879fd9ad76ef67dde34f1fef7e35ef56fc75be7673adbad76d5bd1f7dfe9fd9bd7b69e7bd71dedbd9de9feb66fb75ff7ae1ae3af3dd7c71cd5ce1d6fd6daf1d6b57dd6b6e74774dbc7f7f5f6bd7f471bd5af35ebc6ddf5a6b673cd3de35e1ee36d1c6bad74f39e7bef9dbcef479cdf4eb67f6ddfddde3775c6b86daf3bdf6d7ce5b7dc738db6775d37ef9e3d6dde79d7c7b87dd6f76b4f7c6b9e39774e79e5cdfbf1fe5aeb97baedd7b77b9", - "cluster": { - "validatorCount": 0, - "networkFeeIndex": 0, - "index": 0, - "balance": 0, - "active": true - }, - "signature": "0x8281218a5eaa9295e8e6ea7f65a6e140067d4490928616ba8b2ad2d3a0cfe9a22fe69295a794e11276bbfb04093d971c0470c01e5aa078c5f0acadd4b9b6da85813bb9fede0498712c0547b425994b8cc1ab36216754daa6b441b170bc792624", - "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + "shares": "0x00c0af3db8c8e7de9f4692df50c8f5e0781cd4f603a03a1daa2a5e58a5e26853ee77fc02d9cb6fc0e7244d83dc57aeb3c8d787dfceaba629e703c3034b9a67ab5ebcd597d2e4603e924a698a0111f97e5de64ce1275178b6562ef0535e2104b3e64ba28860900212b85c4a2b65c726f07cf9158a7eded1a170c00b7a7b06c8837e26ec5afc4ab04a12918e3268c1bf23cddd9403bd75c30cecf4179d08e0d174ee31c5bf3502ae59a5e98a57a9ffad19cdbf2fb06b08726e1fe3cc77528a729c62556b4ef7f747dfe78ddb69fe9fdf6774d1c7f971eeb477be1af3b6fb75bf1fd7b6f771d71ae367de69fd3cf367fc776e1beb8f79e36ddbef56dd6fae34f5c77de5ef78e7be78e75d357b8d75f7a6fb71cdb66faef9f1c77de78df6779e9fdfbf3879a779d3aeb5eb4f366db7dfe5cf78e5b6dc6dfeb5e1cd5b6dddfa69ad3adb7e9addce7bd367396daeb5e7a7da736737e78dbbd5af7771ce1bd396dad1addb6f97da7bd7fcefcdb57f4ef779a6f4f1ee39e9a73c7da69df5ddfce5ddfde346f4f5aef6e5e6fbedfd9cdded1ee3969e7da71fdb575f735d9b7fd73575ed77f5bd9ed7af1fdb4d3ce5fefc7fa75e77ceb6f38dbb75cddfe766fa69ee38d5dedd6fdefbedf77ce5d6dbdba75fd9a7bbe1d7b8e3adde6dcf376fd7bcd3a79aef8d7879be1ef5f77969ce1b6bd7bbef5e777b8df5d9b776ebc7dad79dfc77de39e7adb7dfb7fc7b4e3879ce76f76eb673d777f7579c7fb69a7f7e76d1de7b77af386dce3873def4d7ae7475bf3a79fe3977d7b7e1b6dce5c73ae37f5d6f8f75777df46b5db8e7679ee7cef9e9fe7ad3b73de3ceb9d3be34f74d1cd1d7b4edbef7f1f69b77b73d7dbe5be1c7fc6dd7daebd75d6fcf5ae797daf1b7bcdb8e5ddba73de7573c6bbdb675df1e77b6f67f4f35df5736d1e79c7de6bbedcf5fd78f5b69cefd7da6fc7b675af777f779fdfa7b8f1adf47f4774f5c6dbd3ddf977b7dce75dfaebbf34f1d6fad7b77b7397b669cd5ae5fe78e7be38d7cf5fddbe1ad1c77bf3a737d1f6b977ce5af5e6bbf1be78d74e5df3cd5aebc6dfe39e357f6eb9e5ce3ae7bf7c734f38efaf3b6f577bd3cf3cedd7f67f8db7df573469ff5de1cd1ad9c7366dbe9df36dfde5fd1cedce78d1de9ed747b9eb9df9e1ae7bf38f7a75cf3d6f679d7df6b6d7971fd7dddae9d6f6e747dbd746b9ef7e5be5f7fcedcd7c6f9f1eefa6fb7f66b8f3cddddfdd74d5b7fae9c69cf7bf7cd7cdfddf87b9d34e9f69a738d76f1fd1bdbddfa777ebbd1ce9a7347f6eb8e5a77be1f737f38e5ad76f37f74f5aedbebb79d7bc75c73cd75f35e9dd397f5e1ae5a7f5d74ddef3c7bddf5eb8e74d9ed3869ae9e7fadb8f7bd357fbe766dfedbefa6f9f77ef6d1f7badde6b8efdd3df77f1ce9b77be1ae9fedaf5ed1ae9cf3773dd77ebdd34776dfb6b8e1e777e79e34e34e39d5feb7ebdef5f1fdb8738edad34ddcdbbdf77ddd9fdf7d5be5bf366b6f5ee76db6d7777a7f9d5cdb4df4d367fdebbe5cf3dd3bd1d735e5ed1a6fdeddeb4e9ed5ad9f7bbd5a73c7fd73575c75f7f96dfebce346fd79a75e7ddf3cddce5f6dfedcd5f75bd1a79ee1be3def971bd9ce1deda7de734d9ff396db7ba6b8ddeddde3aefbeb975ae9fdb4eb76dcd1bd1ae3ad74f5e779d5adbbdde7bad5b79cddd7f6f1b77ddfaf74e7b7f8d39735efa6f8edbd387bce5d7b7e5ae3c7baf1adfdd7cdb471e6df75e7b86b9f5cf75f34ddfd9e7fbd39dbde746b96b67367fde39efae1fe78ebdd39df86fc6f76b57de75dddc7776b47bce386dfe7a77aedb6f76fce3c79d7f769e6fcd1c7f5d76dfceb679a7f46da7b56fd75cd1bd7bddc73a79aefdeb87356daf79778e1e79ce757f6f77f346fddbbf79e7673bf5de34d1ef367fc6fa7fde7dd5ad7ae74ef7d9fd1cd35eb9eb5e9fd7cddbd3d79ad76e1af1c779ddfe3df1ad7b6b7d35f3a77df1b7bde79e7bdb87b97dbe1fd7bd9af5d6bbd38dfad3deb4ef56fb6b4e7c6b5db7e3bd38db4e74e35db76b9d1adb7e9edbc71bf1c7fd69af5df5bebc75a6bd776e3a71c778f7aedcdb67df774e74f5c6f675cd1ce7bedbe3cedc75fd7adbad346dd7b7ef5f7bd1cef979df34e75e79d7cf1ae1b6b773c77c6dbf7cdb7e346f7d7c79ed1fd1a69f7ba7ddf79e76d7bf7d6fcedcef971fd357366b8db8dfb736df8d1cdf4df4d9cd1e736f1f6bbf7ae34ef4d36eb96bcf767f6df6739ddc7f6d37ef8dda73ae3c7dae7bef67fd6dbf7cf7df37ef9736e7bef979fe7a73dd5deb9eb9d9ad1b79c77a6bce9de9d7bd6b8ddf6fcf3a7b6edadfbdfbe7cdf96b9e74ddaf347fd6f9d5aebdeb6d7a77775f79ff346da6da6f56b66b8e3673669ed7ad76f78efa6b5d9f77be5c6daf39739776eb5f79e38df57df6bde9adb7d1c71cf3bef46b6d3679f73a79cf397deeba7fbd1b75b", + "signature": "0x8771cbd804c6f332530301f423291e3c232e9da3e503c0f74942b84a368d97eb9007a615c0dd680b96cacaf116f21a8b036807e872ee48461f2d4525069c125bd370bd5f0cbc18ddd893467c0d324052eed8f57c760668434d8c367a3b905b8c", + "withdrawalCredentials": "0x01000000000000000000000020C682387CD4dabf327864f5384E5Fd4DCc37690" }, - "1684510634604": { - "depositDataRoot": "0x88803f1f233c87184b09a2f32b01a45193a024a10ea90ea99c9276190222dab4", - "publicKey": "0x8c4d72f7b4cebaac60cf3ee369a963fc509e6ad902fe206be15faa79e8fc41cfc61aeb6a88cd011de7c67330b917d109", + "1685979194075": { + "depositDataRoot": "0x83dc917e4fd0fc45150d515bf44bf44d40c882dea71c4a8924a34f8050652bbb", + "publicKey": "0x812aa5fdb4c8722b1c75912d0cf8b96a28e15e881bee7f318fde5c9afe71d85ecb71fd3627018a297e1208a445734a8e", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c0a48c399da36abc5e0d3a36eb71c920ac130005c9bfc285ae10e85f77c75d1f8262ab2d152ed98545c2ac1ca8feff27e0a71d4ce6efce1201725f7bead50d7eef1f65be704d967d79ba62349f1cf41550b26211b1a93276d4e0ebeb37131f0b77b229afa84d4122f2656c9af0338150d4bd03e03b6a41947b6c8f7a3361b6276255ee552cfd8ff2a3b7b5793e9b09ba6d82a29fe65eddfb2f0ee28a959f48cbeb4693ff5d188dc48290dfd7e8ae79cd6d4d99498564979fb8d98823eb4c94fbe4dfaf1af1c6b7d7cdf8ef579b7dc6b8f78735d3adb673af5bedaef6f7d6ded9ff35df6df6d9a7b56bdd7bf36e386f77f8eb7e3a79f69ce9adb67bad9ce7677cd9e69ceb9ebde5af5a73be797bbd37dfce1fd3af1e7bde74e5ee9edb76bdd756fce3b7ba6f5e9bd9fd3af7b778df9df8f7969cf3c6fd79c7def7a775d75d3be5d6b4d9d778f5fe5aebcf3cf3d75f778dfbd1ad5b774f34dbbf7875cf746b4dfadfb6db75befc7dbf7ae9c75ae5e7f7d3671bf1cdb6e7671ceb47f7739e9fe7a6b5e5ed5ff5ef5cf1c6bad3d69ae9d75c6f8ebb6bce7dd7cefbe5be1d7b7e7bd387db6bbef9efc69f7b4dbcd1ed347746f86fcf3a7f7e1ceb479ad5fdbae5cf5ef34f5fe3de7de74db8db7f7adbbf7bd9f7b86daddcd1ed9c6deddc6b87756dfdb47bb7f9d7df3a7fcf7aeb46bb69c7f56fa7f9eb4d1be9cdda77bd9adf5d3de9e7bb69ce1b75ed7adbbeb9738e5c69ed3ad9feb7ef5d5f7fc7786f5d1f6fd77d736f5bef56b8e74d9ed35d5d7fad77d3be7bef4e797fa7b4f376fa7bae3cef87dde7a6f577c6bcefc6f973cf5fd36eb9ef875a6dbd7dd1f7f6f1f6f5e7ae79f5cf5ae5ae9b6f979b7dae1cf76d5c71ee7c6bcf7beb66b56fde7dddff1af5c7dbf1a777f78d5deb5ebb6b6d5af5fdfc7faeb46b871edb4f1ef5ed9fdf8d7c79bf7c7fbf7d73a7b6d9fe37db57f8dda736d5eef4dfcd1ddf5f7779ae5dd3adf6779dda77ae9df1ce9f779dfc779e5de37d1eef7f7bd9d75b7f96fc77af376fc77c6dc6f7737d7ceb6dbdef56da6fad1d6b76dce1ddbde7dd5df34f3679ad7869dedcd37dfd73c75bd1de75d35e3b6fadf4d1d69a7b6776f76ebc7f6ddddf87dd6dfe3771b6dcd3af1ae9aebc6b66b6e3deb9dfdf5eedeef469ee1ce5d6bb6ddef4e1a6f5d5ed9adfbd5bdf9ddce9ad9ceb5736d9b6dd737edc776db86f66b9f5f7fa7daddd79fedf7dee9e6b4dbaf3969ee3af77f5a69be78dfaef7df76b7d9fd9dd7aefc79e6f8f1edbbe38ef7f7ad3be7c7ba6b6e3ad39776e3bedcd38df6e3d6b4e39d9df1aef975f6b7e3df3c6bc69aef7df4dfaf34ddb73b7bc71b6bde79d5dedd738d5ad357b7f3ad3477571dd9fd3c7faf5cd1c79c6b4e3defdd7cdb9f7aef8e777df75e79de1d735f1b77cf35e1cf3a7fbd5a738d1c6b7e9be7bef47df6fce7ce7be78ebdf36ef9db9eb9d757db77cf39e7af37ef9efae766dae3a6b6dbbf1af1e7b9dfce1bd35e3c71de3869e6b6e3bdda7f6e3971c73ceda73dedfd75f3adfae7bf7d7f57ba73ce1b73bf1c7b5ef67fbe9ad75edce1cefdd5fe9aeb6e1fe76e9be75d1c7387b5e3bdfb6dd7f575ae5ff34d7ddb9f776b4e5fd3aef8eb8f39e7471ce1e6b6f5bef7e7def5db4e9e7fce9bf5de7475d7b6f3579ad7ce7d69cd3df1fd79e767dfe9d734f5be3de7bdf8edcd386dadf96f873ddf9ef46b5ddae76774d74d9a7786f769dd356dfebde397f5eb47b6f5fe9be5aef7e1ed9bd9aef47dbd9bf75f787fddfa7f6e9cd7cebcef47f8e3c779efdf5af5cdbb79a737e1d736d3ae7c7bb6bd6bdedcdb8d76dbad37f3a75aede6b5df67fdef9e1dd3c73c7fce38e9addf79ce5de7d6de738f7a6bce7c79bdf979de7ad786dbef5d9ce3de1def5ebcebc7b5e5debbf5b75f7bbf3c7df77de7669bebae39ddfd7bdb4f757b77f4dfad77d1ed37edc7badddf7d6b5f7cd77d5df74dda71ef757dedfbd5ce1ae1af1cefb738d36d7469fe9edb6e3be36d1a6fdedbd5af3ce7769df37ddfedee9f7f6e5ff5c7dfd5fd5dd1ed39ddddbdf74db8e3cddfddadf76f4efb6f76f569d6f8edaddeefaf3cd3d75c6b7d38db9e38d76e79e3c777d76f5fedaf7d6dfebce1c69dd3bd3bd5addcd9b75b75a7f97dbf1af7aeb8f3873bdfcf3aebb6b9f39efbe1ed5d6fc79e6dc6daef8e3d6bcefcf78efdd39d34f7bf3aeb77b9d5ddbaf1f75c73a6f9d35e387b6f74735edb6fbf1de9fd35e9df7d79edfcf5c6ddd796f5f74db66f9db7f1d73df35e7be7af3be76d7ceb9777e357bce7869ae5de9c7b573a6db79aef9f3cef6dfddfae1fef679e6f5e9ddf4e34d74ef9f5ae5beb677775cf3579ee796b4ef47f47f471fe7577cd34e3dd397b6f1f77cedeeb47b5e9dd7579be39dde6faf3cedfdddededfb73dd77d7cf39df6e5f7dae34d75edb7ba69a", - "cluster": { - "validatorCount": 0, - "networkFeeIndex": 0, - "index": 0, - "balance": 0, - "active": true - }, - "signature": "0x84b5a44818634ebc523a98acdabfa98ee40acdbfb9d553f33fc9e6cb46158a8ff81383d4d144ec08c2822587c733a866033a5046e4ca6e1dea1f7b7a5c02efea1ce54470aff6e35932a0e2ca68a0c00b279272a66f6181dd18083beab247eb55", - "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + "shares": "0x00c0abca99fa50f5732d1b13a626ac7dfd8ce55c3d641ff64578a073a956ab3cd20207886fe8d815540448cbd0de1a333de1924f7ec1b8e3b29ff4c9eb913b3cb7d1e170a32f2be2d653d144c429257389b58a03a222423ac4ba3dceea64f006cc61a4aaa6bf5e6bc467b15bcb83eb373182bbafceb1177e44632d5b082dcafee69e5265c88226e208998a6d1d4173058ce392a7a45de847fcffc074ebe104438268376e78d90d989f6d4aa3dd19c17c6ca697b98ec1055e1491aa4a457ae4100980d356fb774d7871b7b57b577c77ad74d9a6f475b6b4e9e6dbf3de1b6f46fa6dbf356bc75d7dfe1fe7b7fc79b7bddbb6db75fd9ed1fe9b7366fad39efbefce767fbedbe9fe7df74d796dc75a73dedc7bdebb7f7ef66bd7daef4d7d6dad7ddf6e9c7ded5c7f8f3a6dfdf7ede75fd39eb7d777f4ddaf3577b7fa69cdfc77ce3a7f5ebce76edd73769cf7def6e7cd9ad3bd1b6bd7faeb9e35db9e1c79fe5bdb6f3af3779bdbcf7c6b47b6f75d9d79edfae74f3cd9af366b4e34dbd6ded5ef77e1ee39d7cd3be37d1ce76db6d376ded1debc6f96bbe1c6daebaf74e7475c7dd7dadb6d9ed5ff5ae1be3ae5aefb7b7e79ef971be1b775edae5e73777c71d6f9ebcf1ef39d37edcedfd7de3871bd9debb77c779d7cf3c7b7f75d3aefae77d37ef57b8d37d9df39775d1de9ae7dddf77df75edbf78e9ae37d9f77cedae37ddd79def56bdedf73675ddf9e1ed9e6fa73773871ad78eb5d5bddad38e3cdde6bad3ddf8f1adf56b8e9cdf9d38e5d77ce747ded7571de7bd5be367f6e5cdb4eb6d5f6db7b5e3cd79d76ddad9bebbdf7e5cf3773d6db7f8ef8d7d77777a77ce377b4f38f5df3d73defcd76e3d6b7df47bce9cf34735d37e5c7b67b8e9a6bdf7ddfcf5e75b75df34e7bf767da6b573771cddbebb77ad38d5addc6dbe1c7356f67f77766fc77adbad1f71de786dc7387b6edd7fdf1b7ddd1f7dce1c7b7ddcdda79de796ddf1d6b6e7b77bdb4d1f77d79ee79e5eefbefdd7deb96ba734d7c6f7eb6d5fe3dd5e7f675b73aedbf756de6b57347ddd9fdf5f1d6f973ae5dd76e3ad1edb5df775b6f6d5fd1c6f5d3df1a7fdebae9be1ed1ff76edee9d7f86fc775ddee7af7dd9ddfb6fa7b86dff5cf5d7bc75bf5eefcd36f7de7dd74d3bf796dee5e69bd3cd3969eef9f7b79ed5ed37d1e7776ba79cd5b6dbdf86fdf36d9eef771fd757f8e3cef47fb738edb69fd9a6b973ce9fd34f7b69ce7df1ad3c75ed7cddfd39779f5cdde71ae3defb7dfdf5e35db4f7d6fbedbdf5d346f96fd7b56b86b7f1eeb6d5c7387fb778eb9e75f1bf1bf7bd9c71fd5a739ebcd37d5fdddeb8f7cefbe37dbbd5e79f79cd9bdbbe7c77def4e7b69e75f77bddd7b7db9e7ae797da6b9d3d71bebd79b7b8dfa7bb79d6f4ddbf7c777eda69bd9a6bcf7ae9b7f5d7677de3bef8d7df1ce367797f5f3cebdf3ddf473a735e1ff38e39d36f36777f3df37f5ff7dd5febc734d1d6f86b6f5e69fddbf35e3b7fb7396f77f8f1deb9d3debadbbf37dfae1af367f47bb79bdb9df769cd5ceb5d3571fdfbdbcf376de75b6b5dbaf38e9cf747f8e37d78ddde3573d6fad7c7bc776eb47b6f35e9ee1ce7669cefd79af75d3871e7f4e9cebce7bd3be3af34f3adf769bd7adfbe5c69d6dff5bd7c7dfef76fcdb9f3bedbef9ddcefbd746b5edce75d5a777f5ddb8e7ceb4f1a75bf3771eededf8d76e1bd5aebdd77e3df1eeb86fbef4e9cef5f74df86f5e1e7f47fdefb69befdd5ff757bae5dd5a77bd1de35eb7d35e386b7f1ee1c7f7f37d5b736f7cf3d7396b8e3ae3a71f7dc7b5edf735f38edf7bcebd6fa69cdb7e38ddef39f3c6f67ba6bce5fe1a6ba71f7dc7f4edae35e9c6bbe7ceb969c73d73be9f6f5d1b75c6bbdf9e797dfd37736736ddae5d7b5df4f1c75eddd75ff3d69c7dc7bde747db6b7e3c7fc79b71fef76f66b771ff36d9af35e3d75dd38e1df7d779d7cf5ee78e3cdf475ae356b66def5be7af7cd3ce5ae1c7b7edddf7edcd9ff3be3dd1ddf8e7c7b4eb47787bbe77e7d735e7b71c73577dd9c7b7d3a75b777e367f8e78d9eef4edddf8e7c738e77ef669de36f1dedfd5ce3d69dd3ae776f5df5e3b7bde9fdbc7dbf767b8d1ad1f6dde5ceb8efad9ae9aef8d746f979aebad3cdf9d74d5beb7d5ed5cd387b46fd77ce3cd1bf7d75fe5d77bd7773ad756bdd5dd7b7f9db4dba69bdb4ef7e9bd1e75ed3577ad7869dd5ce1bf1bddcf386b4f386fcdb4d5eeb5e3aefd7387fbf1d7b47b9f3de5be5ed1ae1be38776e1c7df6f4d9ae78ebdef973af75edad1bedf77673b69be7ce9bd3de74d39e34ddb6fde1ae1ce3869fd1ee5cd74d39d5c7376f96da7bcd9edb8f5b7b7ebb6fad7bedcd9d69f73deb7d9cd1d7f6dfcefcd5c77ce5e6f57de6bbd76d5fe77efcd3479eeb8d9f7fbd1c73969b7dde7ad39ebdd5ad78d3b6fd", + "signature": "0xa8293b6196c96cdd096730a15a157c9492e48ce04ad597db6b5a766144d28dd5f8a5044bab3c74dda080b715c85b628b0d16477c87c5d3c2b7e21ed0470ecf42dbd888afc542b9e01ba77a20f7c246e5e813e7d4fe9298898a9a3d70d07fec7c", + "withdrawalCredentials": "0x01000000000000000000000061C321F64d86c19d3b83d5190DD608031525AcAe" }, - "1684510649301": { - "depositDataRoot": "0xf4727f35ffe865e0eeca09b10673f9d15ca03e500490dd12fbf7c3dc4bf3e7e2", - "publicKey": "0x850c2153238347e5ee23f28676f1508a097f8e78d3e576391c5d9afeabd0cf4cb678dc299cdf91938f939724760db6af", + "1685979205993": { + "depositDataRoot": "0x2427c14732947eaef7c73fac43638234db2e474a212f817e672d47d48ee50b92", + "publicKey": "0x956dbe849164bc77efc01644943cedfc184ffac151465da2ddff68edbc4f14e6af2e3413a1ee9e75de4bf3daaea37c53", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c08ce94cbefd894f2458feea399f12015802acec015ad10ca80e8c9238fdb0a014d0d2a69d7a31cdb6a7e4cf4b4f66e064afeab85efebcff66dcc2720d6d3357061253111790e0ea8ae6c33a9667b7d0b41c0e1e601fd9899de640b5a4d5900816a615fdb5827a54903a3aba58f6dd52c25965100de37637f1d631dfbd114b6f63a3aedee619bbf821d590dea0bf1cdc6a993db680ef96cf8772a82654ba1af3e43f4acbb35382bdf44f7e891593b13580f7d9b0728f2c74afedf2f0a113bebd79edee1b6fd79ed7d79ed1be5adf47f4d3471e6deddb77979bdf971ff3873bedce3beba6bce9d77befd7b96fcf5e77769ff7d6b56df7f769cd34d5c6dcef6ddee9a75b7b6f7c7dfdb971f6baf7d7bd69ff36ef5f5bf1cd1e71f7f96bd7baf797dc6dc79e6bc69bd76d9ed9e7fb7347fa75f73defc7387fcd5af1c7fad7df34ef569dd7873469d7fce796f4e5ef5cdbad5fd75df7e3c7dd6f56bc7f4f1befdf5dedcd5b7fd7f4eb97386fb6f4e747dd6dce786de6fbf7879e7b777cd1be9ed367fdeb5d9a6ba6f4dfbdb669f77ce9ae7ae9bedb77bdde6f7d1b7fc7f86ba7f5f377357b7f7ce5fd7cdb77b46b8e1cf1cef77347f9f7de5eef8e74d38e1e6fc7da6de777ddce3bd3deb67fcd77db9e9ef78f5f73cddef34d34eb67f969de346bddfae3569fd9bd9dd77d37edcd5d6b8ddb77cd1ceb7eded7ce5a77cf3bd5d77be38f5ee9fd7dd79e1fdbddfbdbc6bd77c6b96f5e5bdb5f5fe1ddbce5d7fc7ba79b6f9ddb6dfef5d1dd5eddb79ad3673cdb7d3aeddf757387f9e5eddb6b9d3cdbd7dad797fa7787dd7f6778dbad7ae34dfbf3cddfe35f3c71f774739db4ef9ef671fe9cebbf5fd1a737df675bdb475e71dd3a69ddfae5a6db6bb77ae9be9d7b8f3def6efae7a7f5e3479bdfcdf9e5af5a739734f3ad1a75cf5ee5de7cf7ae3475a7f7ebde7877dd74f1e75dd74e76f5cd9c6f97f5d79ddfdfbf75d79f1be1bd34f7b7deefaedc7f76fde3d73bd74ebd69a6fbe7679defb77dd7ce3873aedfd35d9de36e7479c7bd6f9d777786f57b5e7a6f6d1c737f79df6777d3479dd36f74d9ce5bd75d7bdfae36ddae5a75fe1f7f9f5c7deeb56dfd37d9cf3d7386faf5f69f79c777f39edd6b9f1ae1b7faf3bef477d7dcd75776d1fdfddf969d71be75d5cd1ff34e9e7dd69e6f8739f3de3dd1ad1def96fde3dd1ed1ff3ceddd347f77bd7dde9ad9d69fdbd71c739f38e9cefae1c734eb9d5af3a7db7357b87f7f1cf5fdde77de38d77e366fad5d69aefaf767b9d9ad9feb96ddeb6d35e3b6f6e5f7dde9d6fd6f7e9ef5af777bcd9b77473cd1e734d78edbd74d9fe9f6b6e3af3ae9bd7cd7a77cef5f3cd3a77b7b7d1feb86f5eb769c69bd1cebbe38df9d77f37d5fe3a7f76f86daf34f5bef6f78e7ddb6e1ddb7f346fb777dda75d79d69cd3addbf3675ff35e75d5ff36e76e9befde5e7bd7b87f5d7877c73ae5f6bdd5aeb97fa71fd3975ff1fdb4d3bdb47fcd77e3469b6dfd1e75ee5edf46df75de9ed3beb5db77f5db67b77b9ebbe75735ebce77d5ce3bedde9b7b5e387da7b9d5c7776f8ebcf3b7ddf1de78e9de5c73569c77b6fb7b4e5cd75d9adb4d9ee1ad37d76739d34db57bae5c6fa7db7bc7f86fbeb76f57f57f6db76fa7b9ef6db7eb4f1de7bdf87f9d5f7dcd77e9bd1eedde76e9eeb5d5df7bdb8d7b79af3cdfdd1dddad5b77aef4d7dd5ef1e71ff1adf7eb4f76e9cd1aebc71e69cd1ff78db577d6df6f87bcdba7f5779d1f79ae9ff5e6b9f34f1fd9bf1c7787f4f5ed39d7673beb77f877677be1fdbbdb56f8f7479f69df3c6fdef86ded7de5ae3c73ad7ad9ad7de77db8f7d71bd5def5f76df8efc6fad5f6fae9d6f5e37e7ceb6d3dedb6fae39dded1d6de6fad76777e1ee37dddd1bf5b7bcd5fe5ff3ae1ce9bf38f77e9ef5de5fdb6d5bf75774d9ce5a7fd7bbdb86b7e9edfb69a7b56dfe3b6bdd79d5d7db73b7f7df5ebce5b6f6f76d39f3bdf7eb86bce3cf1ef38edd6daefaf79f39eb6f5fd9ddb5f1dd756f4d1aeb5737f77efd71ceb471eedcdfbeb8e3d7dcdb97b6eb5738f1c774f5fd5a75edfbf78e1ad1e738db66b5f3ce9ef5fe3bedfe7d79fdb9df4d77f76e9a735e1edddd74f5a778774ef7d9df78d1de9ce1b6f4ef8eb9edf77bf1b7bde1eeb5e3d7dd7b569d776ef7d7c735ebcddd7786dfd9f79d7797b473ae39d38eddd7675bedbe35d5f6f677469e6b7eded5fd797dbdfb79a6dd6bcefa6b9e1d77d737ddd6b6e9adb6e3ae3d6b4efaf7b6b4db86fbe75eb479ff5feb469cef9e78e9a7376fad5b6fddf97b57db71a71ce3ce5de34ddbd74d7ce3be386f76f7dfae5b75af777b6f5c7dff1ae9a734dddedb737f5fd1ddf675fe3b7dfef87da77ce1cef56deddc6fde9fe5fd1cd9ee1de7bef9ddae5ae77db6f38efc75cf34efdf7af3c6dddb76ddd5a6b7", - "cluster": { - "validatorCount": 0, - "networkFeeIndex": 0, - "index": 0, - "balance": 0, - "active": true - }, - "signature": "0xacea71d27d0d06f377a068546622342923263002a631f94137138370259da0f540ebf62d1f28b7eb5885fad2faa6cf201535cf37b5d81cd35c6edcecb6401fd8a1857f46429643afd77c6dac261ec95dbec9dc3ab94adf8c17d695e7f212fbd5", - "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + "shares": "0x00c08cf4add1bc79a733de08f33e3e5128c6018516ed253c6114b2feff77fda1b49d8778855d703aa12227d02d72d767268c92dbfb8d6d8852c0ed0786c5ceceb62f60b4adbb4a3c141953cea531c12b1bcb13f28c369e57994a86ee1b4faffc75a8a1c0a90c4446832d9566fc3c47d37db1fa72e141a86ebb56f6f102ea00b4308fc243165d47202c7e90db20291bc6129d8263b847ec060a7d7ca76cf8cf3c157969556f9e94c189ce5e6e9d20a88b87b3c697f39c4b7049063725bd4514d2da78d5df7c6bbd7ce3a71af5bd1c77b6bc6dde1a778d75eddd3bd5c6def76d3cf79dfa71ef74f756b4f76e9ddbbf3cdb7e74e9e6b5d9f777dbaf757f8e5fdb6e5af7dddb7dfeb5d1d79b738e1bd5c75dedddb677adf9e35e1d7b7f5ff5d6dfe3be1ad1be74774e5fe1cddfdb96f46b5d76f7be7c7fcebaddbeb76dfdfbd9cd1a6dc7b5eb4e5d69a6dee5dd7c6fae7bef7dfbf37d5ce77e9adb6dbdf79ef4e9bd79734f39dbbf1ed1b6bae7bf37e36d9be5edb5e3bd34e3ddf4eded38dfbf3671ad39d35d5fe5df79e9aeb8e39d356f7efde5cef873c7b8ddc75c6fa7747fbf3c6ba736d5fef4f3de3ce1a75b6fae5b6fb7b96b875b735f3bf3ad76d9a7bbe7d77bd3dd5ae3475ce9c6b6ef7db971fd37d366dc75a7b5eb469de5bf5af7aedff3d79ff3d73dd7cf5ce5f7b4e75df9df9d3a75de77dfcf3bf1e737d7473ddbcf5f6bd71cdfad3b6da6bd7f9ebdd74db677ddfd776f1e6f7f76e5bef8777d5e7f5d38d75d9fdb9d7773dd9cedb7db7de7346f9eb7d7871fd9eeb6dfa7b6f3df5ceb76b96deddaf37dbae9edb6f756bc7fb75bef9e5ed5cd5ad787f471a69cd3d75fdb4d9ddb8f3be9b7ddd77e1e7b7d1b7b7e74e7c75eeb973d7dbd1b7bce3df7d71b6f873b779ddff1c75d71a7f9e1bd3b69ed397b575d69e75bd3c6f5d34f34d9d77af38779eb4f5c75e6dcd5b71ee1ef7be5d774e5ef5fd77d7cf3aef9dfce1e7baf5ef39dfa6f4d74734e3a736eb571d6b5f5ff5cdb4df4ddf7da7dee756ddedfdbaef9dfae7c6fbd9c71edb5f777377f96ba71bd777faf3cf79e3ad75d7c6b6d9d7dadbaebde5cd3c7bcdb6774e5ddf5f1b77de1af76f77f1ee1a69ad75d7ae766ddf3c7dbdb8d9adb571ed74e7be7979bef86bcf3aebadf575a79bdba6bbd3deb6d3a6bbf37e78dba6f47b475def7e796f875ad1c7b769cd39e1bd7579ddda6b97b5f7aef7f1af7adbbdf8dbb6da7daeb6d1ef7a6b6df9e1be5d69d71c6b6f7af1def86f769ce1cd346dfebde3571b71cdf6f747f4dbaefb7fb6f86bd7fae7df76e397b9f1d71cdf7f3879c6dddde735f1e73cd9deb8775f7769ff5ed3bf5b6fddf56b8dddef8ef87f7e5d6fb69edf8734e7d6ddef86dee1ed5fedb774f767f6e777baef4e7cf3a7dc6b7f7cdfa6f4e9bdb4d5a77575c6bd77669a79cf5ff1b73ad9dedfe9d7ded3df37e777b4736d7cd9ce5edfa7fcef6e7df7af76ef869fe7c7faedbe1cd7cddbedf75bf3cf36efddfd77a774ddb6baeb4e3ce76ddd6f57bbe3671de9cf34f5bebb6dbedbf5ae1b75d6f77b77f4edaeb4ef5dbd6db73b7fb6bd75ce7df34e7cf78f7a737738e76eddd1cf1ce5cd7c75ae74f776fbf3b7ddf5f73b7f4edfe1c6bcd387b87fae37e5bd3773ae5d6b9e357f56dee1f6f677aedbedcdba69c75de9dd1f7fde7b7b87db6bcedf6f4d5df74e397f6f7a7f4f5bdb9ef5f3cedb734d9eefcd34d1fd5c6dfe3d7fcd7879fd1bd387bb6b8dbad3a77ce3875b6fad1e71af7c775d9f7fc6b5ebbd1a6fde3475a774e1f75ce1a6b4e387dc6fc776f3b7bd75ae74e5aebc7bcebae5aefc77c737f3ce7d7b577c775eb579dd1ad7ce7de35e7c79df79ede6f9dfd6f7eddd7c69ae78f5ad7cef8f39736f5ce9dedde75735f74f5d7dc776e5f6b469fe1e77addbf1f6f7d1d6faedf738d5e79e79de3b6bae7bf79f3ae77e396b969adf9d1ad1c6fceba7f96b6dfb6fc7db77df7969bdfcddc6fbefcf5eefa71b79d7db69cd9c7bbd9be7b75e6bcddbf75f7c7b7eb6dbb6bdf1e6f569a71ce3cf1a69a75cd9cd9adfaddad74e9a75ff36d5f6f7d9ff5ee74e3b73addbf1d7f46f4e3adf5f5a7f9d1c69c7f8d7bf1dedf6f6ebb6f9f1fd3cf39dfb6dcdbce5bdfb6dbedf735d7be1adf777ddb775c7b9e78d5fdf8e1c7f4d5b6b8f3de397b8e38f1fd5dd5f79a7dfebdd1ae7be1edb9e5c7b9efa6b677d6f5e5c6deddadf873cd7adb4efdd9df7b7786df69d778e1ff35eb4eb8dbbe3471be7779b7bd71ddfd75d69fe1ee1df5de37db9d75dbb77a75cd3c7f7edeeb5dfa7b7d5e774db671df78e9dd34dbbe36d1ee1ddbd7b76f5ebddb76de6b7ddae79efdf3c7dbe5c6b9d3de5b6dcf7869e7de7b9e7b6bd738f7569f7796f479d79e6da77d6ddefa7b769c75fd1bedc7397f677a71ce5ae78e9b6fce3d6badb9", + "signature": "0x90a149cebd9eba88673c69fc8a52cdb42e7f2ee64ac9a73cb8f51455df94a7e2e25905cdf91aa29a50acb58bd176d336190cd0af24ad4703d1ddaed13fea8243e867eda4c9f0d6c56ef43848b689b218fd973c7fe67931eebbd9188b69a6ecd5", + "withdrawalCredentials": "0x010000000000000000000000E9Ace0C139e59a44cd2F2c8fB7006528ebED3Af4" }, - "1684510672675": { - "depositDataRoot": "0x79aec076c2202b3193d166ed2e12e6d30a13059e695374b3fda7c25afa7e2192", - "publicKey": "0xb54899b76e74e0188d14f43d9cb67efdf941dc97334d6689071cb0bc903b2c57421067e5a7c1edb47f4d8039e71421d3", + "1685979217952": { + "depositDataRoot": "0x512aa0c8dbe55a02bda9050a2740dd30cfcafc79526a25de07013eab9ea19605", + "publicKey": "0x877c2c5a00a57e0328ccf9cbd5614f320eeacd330edee7beee19301b33c95e662b4889a51bfd201ea1956d51713dbbfa", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c09063ce2dd7b555ca5560e58d2735d7c36c049bcdc2cb778f7ea9c2e351c0907f44039853ea8451d4051f37c7914b95eaaee84a2c92a623a3ba1d1562fa12a627d18eaca481491006f7e37ac31016938ea3df9383bdb1fa6400a02c3560b187a0894311db0f300f01b34e8258b9a222d0cf57aa2b337ee9c8c7aad172db9534b0f5c0e65bd7076e8bea6f4001373e420cb94ce9e8d98e26c778264e7f06b3dd67457ff39f414922336544ba11ad289f11195d600bc77526c8bab07ec56a0d4ab6e1dd3ddb6eda7b96fcf79f3bd36db77fc6f6d75ddb69ddbad7c73c6ba6f6d1a7fa79fe9bd3969c739f1bdb56fceb6ddad1de9ad75d77e9bebad78e35d9fe7b7f9ef8d3ce5e6dc6db73a77871d6b8777f5cf3af76e757fdf1d79eefcd1edfd7faddf6b6e7bdfa71bdbb79af76e1b7bb75aef8e1ad78df8f35d36e1a6bd6f86b6f79df66dde3af1bd79d5eeb5776d3d7377fd7b76b96b769ff5a77969ff386b673a71adbd6f7d79ebbefa75fd35f5dd5aedf6bae1a7fb79bf377b7e3c6f6f1feb96b5774ddbd7a739efcd3bdde7fd6f77fd6b46ddd1f7f573a77771c7b7dfbe9de9b6baeb869edf7eb86df71eeb975f7376dfdbcd5f6fd6b5ddae9bf39f7875aeb87fd6fc69def87b6e7c6f7e1a7fcefddb4f37f5c7bbf1addee9cd3973573d737eddebdedcd35efad7bedbe38e9c6bbe5de3aedcf75df97b7d9dd9a7b9e7df7b69d71d75d79f6b87757bbd9bf7c75e6ba7bde9a69bf7adf9d9ce9d77c738e7ad36778dfa6da6b7d9f7bd69e7fdd1ad36ddf7fcf5e71b7f67bb73a75ed35f75d3df7dd1a7faf37e77e1eefd6fbe3773b7fbe35db769a79de5dddf79b69bf5d71d7bbdbce1c7f6db6e5d71fd3ad37e7bdbcdbb6f87fdf1de3d7b5775d77d3a6ddedcd37ef9ef4dbbe3ae786da7f87df73969bf5cd777f4f3de5c737f37e797ddf78d38777edae9f75df376f96dd7797ded7ce1e6f8d347fb7fa69c7dbdbae3de37d3dd34ef87b97f7db7736d387fc7f7e9fdfc777e9bd796b9d1ae9eef679ddbc7b7e76f75f1b7b66f8e9f7396b6dda6ddd3aefd735d5c69dd34e9edb9d9be7a7fce3bedd7f7f7a69edbc6fbebae74f1f774f1c7796f87b5d9cf5f6f4d3673d779739db47f46b97f9e7873beb46bbf5def8e5fe9f735d3a6ba69fdde71ddf4ebcd5af74d5e75be39d1ce38d3ce5e6dcef8db8d39f35f1ed7bd74eb7e9adfddbbf1ad1c6fce5df35ef8d3bf36d1deb96fb7bbd1ef1d77adf77dce9f7357f8edaebaf78d9ee77f38734eb8efb71f774d38efdd5ee3b7f4f1cf3d69bedbe3b7f8e37d78f5ff1af7bd9f79ad5cf7cd74d39e1e779d1befa7b9ebde787ddede73b7bae5be1be1af346f8efb6b77777bde9dd766dcd3d7b7e7a75bf5c79ff3bd1e75de1e75ee3ad5cef47b96f96f7f1cefa7fa69bdfa7dde5fe7dd3dedd6f7d9b75a73ce74e36dfbe9a7b979a77d73bd1cd5cedde74d7675de1cd7b7dcd1fe5fe79d5d6fd6b4efc6b7e75d39ef7e5deb4e1f71f73a6dadddd3bf1d7bbf7cf1de776fb7f779ee1c736f3c6da73be1cefdd3adb8d1ef5ee5be36e9ed3c7f9d1fef5eb4d3cdf6d5ceb7d1be3cdddd9b79c6fb736d7b7f673a77ad7cdb8776dfd75ff3ad9c69a6ba7dbe5eeb6dfa6db69feb76f6f5cf5ee9c7bbdbcd36f397b4f39f1e73a736df9d78d1c69d7b8d7ad1eebddf4d3cd1eedb77773d735e38e3573b7b6e75d3cebc774f1bf1eefd6db7f56fc6f7f786f879b6b67dfeb4d5af79f39ef8db673c7dfef7e9e7b66bbd3ddfdd38ef5e3adf57357387bae35df46f6d5c7df75fddadf9d9edb87bce7b79cdf77bc7dcdb669de386dedbb7b5d5ee5ce777f571a6fce7cf3d7dae74dbdeb4d77df9db4d3ceda73af3d6f671bd36d3adbbe5b6def1f69f73d7376bde3a7f7f3c7b977879ceb4df9d7df35ef5f1adfdf787dc7f7e396b9e3479def96f57bc6fd79a737efbeded76df9eda776f7b7dd69cdf5f36ef56b5d9b6f5d1bd77d75e7ce7aeb5df5dfadfb6b6dfcedfd5ed767baef5eb9edfe5fdfbdb9f1a77579d7dcdf6f7ceb5e3ceb7db9f78f5dd797b6f7a79a79febcf37737d1b734eb8f3977cdb5d5c7b775b7fce7deb56f67346b9d5e6b4d39ebaf34eb9d74ddee5b71ceda7397b4d5ee74e1ed7c79edbcdde7bcf38f39e7c71af7de34f7bddae9bef5d5a7f6d1debcdbb71b6deefae1e7df79a71de5b79fe74d5d7df75af5d6bbe75f1ce3ae1de37e7be3d71d7da737d5f7ddf79d1fe37776f79d5bedf79cf5ae37d36db8ef975cf79e1c77b6b9f5ddba737eb479fdf8e3ce75f74edf75bd7b79feb5efc77ae3cf7cd78d9df1c6f575f6fd6b4ddcf797dd71d77af3bebdf7d69af1bf37e1cef87df7b7df471feb87fd6fad36f7673def8d5d71ef3c79ad1de366f4f38f5f7dad35ef4d5befbf1a71de7cd1f7f6d3ddb771be1ce5f7b9f1f73b", - "cluster": { - "validatorCount": 0, - "networkFeeIndex": 0, - "index": 0, - "balance": 0, - "active": true - }, - "signature": "0xab0160e83c3d90ece97764030663b595fee1b1128a113f89268a631745c336042f30a7d2eeaa807e968fc2e863d55be80d9c080c503896b7126ef4a2a875f7a210b79339e3072d256b1cf357de593cdd09a7a5cc8c49d64a83bbcd9a87d5be02", - "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + "shares": "0x00c095d5f1438a6ad54c7f71c7e23328edc129b99faacb04b78889c7ea2751f6c7b4ad1538b1ed578399dd90df1b9eca98edb7fa6ab027163fa998636343bd517460dbfc2676a6cd9e029a61639ebb55edb895fa8206804761e76b0957532b965d34a87124d2c1311ad18e02648016e2b64cbc0fd4ffc9b54b0235644f8e5ae809dd12b81dec8d6fc75d72b2509c7ef31eb2869df4795de72501ba2afe4c5fc9c35f0242322fb21b77d962033e33506991a7584ffab2bce8e417da6e031bdbb0629ae7be5c6b4d78edef7d6f6d9f69af7d7b77f4f7d7fcf34e367346f67f6e75d5d71fdf56fa75d7f77f5f1ee9f7f5f5c69a7b4ef9eb56f46bd6dadbae5bdbbdde77cd1cddbebbe74e1e77573d77b73a7dc73af7c6b5e3873af7cef7f796bc7b7e756fcdb6f1ee7973677adbde9bd35ef579ef1bdfbeb5df9df6d1ae9c7b9e5ed75f387df6fb69fe3cf7d7da79fe5af5a6fa71de3be5b77d7f6db675fedf7df7b46b4e7b73de9fd766faf1bf7677a7bce3c79d71b6b87b86fb79de5adda734efa6f96b575de5c69ce5aeb9f77f3beb571edb96f5db7d7ceb5ebadfc7db79ee75e1cd5c7bdd7de76e5ff1c79aeb9e9fd1cd377dfd78f1cdfb7f9dbd6b4e34ef6df875af5d6ddf77d77f34df87fbd5a6f96dee9ee39e76efdf5cd7d7b57daf3779b7f6d5cf1ae36e7af36f3969a75bd3b6f4779f5dd75f1b7fb6f76da69dd1ff3577df5df75e5ef1aef46daefc79fe5fe1e6f7e76dfce1ed7a71cf74ebdd79dbb6b6d77f7975af76ef6f7ce34ef5d3c7f9db9d37f39e7ae76db979ed9ff747fd71e6dde3a75cdf7eba75b7776b7dfdd1bd9a7dae5ed36d36d7c79cf5ad1ce3b6dae1bd76e79f39e9aef8df575cf77d3dedc6b6d9ff3bdfdd7b69ce3b7fde7b77af74d37ef8e9aeb97fdf76eb5edfd5beb66b9d3cdbd6f971c7fdddbf75dbd79be1bddfd9ee38d74dfddf7e786dcedfd3bd1d69bf76775f36eb96f6ddcebcd9aeba7f6efbd376fbdf5e5d7bcf76f35d1be9d7f6735e76d1a69c69be5c6bb79b75c7fc77cd1e7f8f1d69cf3be76e77edff5ad36ef7e3be7479d7b675aeb9f7bf5fd7aef56dfe5bd9d69f7b6774ebdedbddd7f4e7be797f9e1edbbe1b6f9db5736d74ddff5edb5738d38d1ed1a75de9ce35e34d76f39eb9d37eb57fbef5f1bdf6f7ae9e7f5e5c69e7396fb6f469bf3a6f6e5c6dcdb7e5cd9ff35edaf7d778f34eb6f796bbe3d73cdbaef7df4d3ad35ddfdf6ddcf7a71af1ce36d76d1de9ad35e7c7b6d9bf3be7a7377346fbdb979b6fcdf7e39e79efbf5df1c73d69bd78f1ee3c6b57b7e1fdbcdbdf3869b7bae7cd1bdfad5cdddeba77775beb8df5f387faf3ae7ad7b73cefcef9d37d3bdb779aebc6dedfdf7679bd1f734efa6dbebcedbebd7dc7f9e7671a7b8f78d377f469b735dbce3b73bf74d5ee7a6b4d777bc75c6b47fad376f7ef46bc7b5f37df8edc6baebd7b9f3b6f5d37e5cef8d5d75ff77f367f9efa73aebbe7ddb46dcdfcebdedd6bd77a7bbeb96dcd7bf79e7be347b575b737e3dd7cdbcefd6fa6b76bc774e5d7b9db6d5b7397347b7eb671fd5eefc7df7f6d34db9f5c7bcf36eb8735f3c7797da6f975defc6ba73d6f4e7df5ef766bcf1cdf6f5ae37edaf1cf37734e9ae7ae7c69be78e1fd78dfbd376b46f8ef971cf1fdda7f56f86b87f9ef9e7873c6de775d35d5c77777be9ed3dd36dfd7dae9d7b475cd3ceb769bdf9734734f78d78d7bdbdf36dda75e69fe7a6f86dee7d779e3675fe5eeb8e5ad9e73b77aefc79beb7774ef57fb6b7d9fe79ddfdb67b76b9f1af7cd5f739778e3dedcdfcdb669be5ee5af1ed787fbf796dbdba7f8f1ef5b7fd6bdddce5cd347b56b5d5ce7aebb7faeb9d7bd1fefb7b6e5c7fc73d6db6b669d6b9d74d5af7d6db79cf397deebaf78f77f5cdf6e3c75dd78e34df9778d9ff5ef5ee3771d6df71e69d71fe3d71e73ce7b7fc77877d7f6f7a75b7b77da6fcdb9d37e34e3b7bdd9e6bdef8ef47f6db4dfcdb9eba77671fef8e3ddb7d3af5ff1ee3c6fddbbdfddf8ebd73be3dd36f3a75debadf86dfef5d35e9ef7be5f73de9cd3c7b6eb5ebadfdd5ed776b7f77e366dc69befc77be1debcdf6eb879e75bf38df9d78d74efa6fcd3adfcd34f77775e75d9d73977aeb46bce5cdf77fbd1af5ddf4ddcf37f79e9f774dbb6f7f5e6fbf3cf1cd1be35db7eb47b9f38db6f36f386f8e5af79738e37dbb75d7776fcedcf38e7675dd9cf7d69c6f5efbd1d71fdb473d774776e7de3af74edfd5ee1f7f9f38ddb69df78dfbf3bebc7b57b4f34e7c6bae9b71fd7875cf1cdb6e5ed746dfd3775f79ff3af1be1dd3b77b71ff5de3ad1b7397dce3a71df7af3aeba79aebad79ef5f1f6b5d74d5ed1c75d7bb79adbd6df69e6bceb771cf1cd5e7f8df777de1be1ce74d7569b7f76fc7b7e1c6dc71aebaebcefad3cf1ff5edb6f3975bf3d", + "signature": "0x94b5bda9c381ad11680cb92f403891caff3bb10fc78ec487a447c6ced22edaafe3cfc0d1b92f18a25c6dfbf31724a8fa0838a9dcaefffe843a4004cc644749a9409b45990b2d95227cd99fdc64ff2063e7d6e20a83988cb48a7080534b6e9070", + "withdrawalCredentials": "0x01000000000000000000000043aE2DEDA8a64BfFfE37bd6E777fe2fadd639271" }, - "1684510685568": { - "depositDataRoot": "0x1cc49d12998c588270c0a4bb4310be0434c1591b97091e4aa202c581fe323541", - "publicKey": "0x88daef1daa709b61f5ad138625ffca5b749c679b35314712eb4d6d78cf95be26be64a9af1d5de8528ba062929da135c5", + "1685979230025": { + "depositDataRoot": "0x322f9f5e900fbcbfb798c770965181ddce2220a4148561a522c5a9c4b6c3468a", + "publicKey": "0x87c6c58ce197a5e51a46c8f1db9f04fbc6878b67ce9baa8ea9fb738b6821e764842c958cbfa5b25afe32caa743f36ebc", "operatorIds": [ 1, 2, 3, 4 ], - "shares": "0x00c0a79e38b0bdf57fd776177d08538ba5715e1c826906f776d38b5cc7f7e6b78d0bed1a385fe363ddbd5c870b2f914e63129325005d22886ad587f4f93a07fc2ebc93a72f77e622dfd3da824888db216cb68e1020f1569412201b6b4c5988c0db1fafa9a2eaf581380d7b421caf963995de8514335ce6cc265f90994d557baafb7a7cf1458bacdfd8d18b4248e4e93a2f1aaab3168118add9472ff8da3020c7415a04f8564104d4f68f96ffcbdbceadfa5e31b44f73325828fa308b7b7c613be7bedf7d35ef5df4f5bd757396f9f3a77adb471a7bcf1af3b6dceba7de6f7e7bd76e1fd3c6bde797fd79ad5ad74e5ce7d73c6b76dadfaebce3671be77d35d78d36ef8e1c7dcf1ff3b6f4e5c73ce76f1ce9c7b969f7397bcd34d9bef76f4d7c7b7ef471c71fdbce1fdf977adf4f5eedc735739777e3bef5ddfdfce5aedb7b5d7a7757dcf5ad5cef97dee7adbbf7cdfad7a7b47b479bf1ee5def9f5b77af1ae38d75d9b736778e3ce9af35eba7b975f6b9776e7d6dd6bdd79e76f7669ee9f775d78777df9d7ae5e71e79ce5fe5ddfc69de347dfe5f69d6fcefbf796dc73473c7def77f5f6fc73471bdb87b97fc777e9f71af37db87f6e5de79d1ee3c7b5efc736d9f75de5d79cf38db8f7d7b46daebde77d1ef356fae9ee9a6bae7b77cd7de357bc73b71fef4f1dd9ed7469be79e5e6b96fae3577573dedae376b7e5bef9d9cf7471ed5ef1bef579adbddf677bebbebd6dbd5fd38d7b75c7fc6fb7bae3bdb6f74ef7d5b6fc69ad5b7fdf7be5fdf9734e79ddae1fe5fd7deb5dbaf7779f7dedda6f779ee9fdf6f36dfbe9cf3771adf9736738f39e387f7e1ff1bd9ef35d7cf77e7c7faf1edbbf35e7b6b5d9f69e735d1fe5ef1f6b7d36f1e7dfd7adbcf5fdb8777d5d6f66bdd366bcd9ed5dd1ff1de77d5e7bdd5f73cd5d7ba7dbef9f5e79f7de6b7e3de78f3be1df34df7e7a6f4e1ee5e6dd7dc69a7b87b56b6d7677c7f475bdbb6f9db4d7ad9adb97bbf5ae3471d6bdf78e1cf34dba7b67796ba77bd7af7ae9ae5cdb569ee1b6f6e377387fb6fce5ff357f8e5d6b66fd69c69f7756f6efcf3df79dbb735e3cdf47dae5aeb9f5a736d1af1d7dadb8e797ddf797b8ef671ee347b7e1defc75ee9f79b69deb5e5ed5bd74f3bd5a71ee5ef3adfcdfbf37e3af78f1debc69ce5fdb775ddfdf5a6bd7b779fe34f7dd7ce35e1cf5e775f7bebbedc73d7f771bd9c7f579b6b8f766f5e7cf36d1af74e347376f669c7dff1c7ddedce34e75dfcebb69eefc7fadbbe36eb67b6dbcf7675c7f6ef8e377b977469a7f6d9c6f975de75d1e6b7d1df5f71df36edf6bcf376b4edd79bd78e77e36e9f69a75ee9f7f4ddde3be5edb8e747bc7f5ef9efc69f7fdd7d75a75bf1edfde3df1ad7b69ce5eef8e756bdebc779734ef8f7cd5ae1a6f575ae76e3a77d7fcedc6bdedd7f475ce5bef9d7cd1bddae777dfe757dadfbf3b6fdd9ee1a7f8d76d3ad75efd75bd5bedfdf6ef8edaebcf36d376f8d5fddb6bd7bdf3b7dcebcdfa77b6bcddd79ef76f376fbd3879df1ad37ebbd34e3cf74e5be75f3bd9ae76e9bdbc7dbe7a75fd5cef8e9c75bd9a69a7dbe9d6bdd356fcd9e7b969cf3de38db7d7d79cedde3ce1b69e69ed37e9e776e76db469ae3ce5ce35d5e6fadb4ef6739df4d34f75f5f7bd75d6dae9ef3adbbf1d7ba75e75cdbcd1a7b8e1bd3a69e776e7c7f5f5cd356f9f396dde79d79e1ed3d79f77de5beb8d1df7b6da7bbd5f79def969d6b76bdd3479c6da7dc77af35d9e7f67bb6b7dfbf756f9f5a6b8f3dd3971b6bce5ad367f66da69e79d79ef1cd9ae797bad5fe3d7df7b6f5c71dd75e5bef9efa79f7db735eb96f9dbae1f75cd756f7e34d5cef4f3cf5d6dd69de9bf1cd78e5f77ce7d69d6deef977669dd5a6f96da7f97dde1cf3de5fe3b73dd36f5e71ae34d1ff5ae37ef6e9e6f8e1deddedd7fddb5eb8d9adb873d75cedef3df7adbcd5f6de7dadf7d9f6dcefaefdd9e6dd7da7b6e1a6f575c73879cd34eb971beb5e34d1c77af1f738ef7e7df3c7b4e9e6bbd9be76f7475adb8d9cf1af79d77f1eedf6fde3bd5cf5ee5fd7af74f7dd5e6f77f47dc69cd37eb7e3571aedee5b7b575fe5a75fef6dbdd36777d3775d79de37d1be9e79de1e71f75d7f57f9d9a6dd71e69cf1d75de35e74f1be7cd7575c69bf5aedcd9b77ae367b86f87f47bce37eb5df7e38eb4734ef479d6f77dd75a75fe76e1bef7d3a7756f8d1ddf471ae1df3469de5cd3a6fdf3cf75f1bd9a734735e7975de3cd79efbebce9beb86db7b7eb57b57f96f9f1bd3475d7f7e7a7b57dbedeef5df87f9ef96dfdba71df3d7fdd1e6fd75c7bcf79778db86bae3b7fddba75aeb771bd5feb575fe367fcd7b69fdf6ef77b877b6deef6d1aedbd5ad3bd5ee746f96bae39ddef75e9d739e1ee9f75ee9f6fc6dfe5def7e35f74f3b6b56bdf77db5", - "cluster": { - "validatorCount": 0, - "networkFeeIndex": 0, - "index": 0, - "balance": 0, - "active": true - }, - "signature": "0xad3cd22e20a0e4d6a12afcaa176fc238ee3105d1a056945363d386d749f535b633349a2d2d0709bf74c39fb14ed33f26147f8e583a53974648b64154a96e9ea6bbbaaa855f1a6b3d19f1a8c17d8be989390ccfd897fb84679349f14609026a41", - "withdrawalCredentials": "0x01000000000000000000000007E05700CB4E946BA50244e27f01805354cD8eF0" + "shares": "0x00c0afab1f7b92d0ae5b2098215fd06a1f009467974c02ace8cc5ba23415394626329427a0f253615b972acec6e6da6372ad85d59ba7048f962cdcbc89d780ea4233f77389d6484bf446fc63781f892d1035a15c074c55e8ceccd6d17ead5d81f94d8555f9d2cf79dc7859e8cff272bb285ed73232e7976ff39c46cb34bcd9036cd2083f12ba71461db51142261f151c84128c18921e266f27c12ff5f3d6cbbe0bc21d97f07f75bc799ad797b4d0289c90b9113790d9a2ab2b33a0ef908c1df351c4e36d9f6f9d9de3c7b6d1dd36e1df3ce9adbbe5fd1ceb569bddd774f37f77db57f76dfe1ae797f8df5e1f7ddedcd7be1ef74db871ee1ce79d3577d71e7baef4eba7367dde5af3af5e73cf387dfe7dedd6dd7fb77dedc79e71f75bdbce74db7e1be38e1ae9f775d3adbdd9b738d79f5d7bae7d79ddf9f7b6dc75d75ce5ad79d9d7dad5be74f35e3de9f7db7f9e9ce1f69ad39f3dd3d7bde5cf35ebbeb56f979bdf9f1ce1de1e6dcf5adbbdfd73be9fdf5f5edb9eb4dba6bcebbddd73bf38d5cefa7b8e5adfb6bddbdf1aeb6dfa7767f8e3577cf37d5a75de5ff3b6b7f1bdb8f76efdf376b96fc6b7edfe7de1bf3cf1ee9a7dcd3cd7cedbe36e5e7bd69a7fa6faef67796badb7d5f79e778d1cf3d6bb7b7e9ed3c79c6fdeb6d1cf38e3d77c778d9e73769df36e777b66dd7fa735edfede79dd767b46f76b573dedbdfaf36d9bef6df973deda7bc7bce1b79e7dfe75e3d6fad77d7df5ad39d346dfe1a73bd1c6f679cf1ed767f6db9f76e7969fdb9e5d7f9d7b774dfbdb5e7c69ee376f7eb96f4d5d6f8e1fddcdfbebb7da7b7d1a6b7f7cd7d7b5734777d5be37d5b7347f5df67b9738736d78e7af7877adfdd38eb4dbd7da7bdd9a7daf37efc7786ba75ddf7d36d1b7df6bd779d5e7bae5a6bc79bd3a7f7738e3b75ae1fe5af7471ed7dede7dbe786f6d78d77f5c6f9f7a776e77f1c6dbddf6fcdfddbcdfcddc71be3575ae5ad1cd7ad9aef5d3de9cedee1fd3bebbd9ee1c779d7ddf9e7a7dbf1fe9be757fa79ddde7786b6e1b71fd7d77777773669c77871f71ed5ce5fe3577cf76e34d7c6dd73b7f7df477bdf5d7573ae7adb96dd6bb778d3cedc6bcd37dfbf3a735f1d6b5ddde37ebb79c776f3bddd69cdbae9d73ce1addee35eb9db76dc75ae76d3473ad5df386f86fd6fd7bbf5e77bf5cf5cdf5e1ce37d3d7fd734d396b7ebc6fde74d7a6b4e9eedc75f7f6e9f7b8735f5ef1ce7df357b8f78d1edf5e366fbd5aebd6f6ebd7df75ef75d3c7f475fe35e1cdf8e1addf6ddf7a71c79d7f571a6f4e5defde3d735f5a75ef5bd5cd38ef9f36eb8734edcf356f5f3d7bd6bbf3a79aeddd34db56de6dfe1aef9e387ddd1eefcddc75ae777fc79cedbf38ddfe76db67bad9c7bad1ef3ae1fdf46f86ddefa73a7f9f38f1f6fa77d7f677a7dce7d77deb7f5fe36d1dddce5fe34efddbae1adf5f74eb77f4ef9ebcd7df35779e1cf1af5bedfe3775e6fcdfcdf9f1bd7be1ce9cf35e79df66bbdbadb5d367f9d5c7b5e7c73cddd7db75bdf9f776b46dd6da6b6e7ae367b473d77677473cf7c77d6f6d9cf5dd9ff7ce1a75df1be1ff7873ae9e71ee38e3579cef7778f5dd7dd1b75ee39d9e77d6f86b7eb7d77db877c6dbdf67da6fc69d7376b8f78e1edf86f6f3c7397f7db9e3ce79d7b7fb6fa71de7a6dcddce9a735779778df8f3de787b8d79dbb6b8d78f1be5d735df77396dcd3debaeb9736e5e7bcefa7f76f5ebde3de36e7b6b9e9af5f77a7b6e7ce3cdf7ddedf87346b86bdd7c71bd7af34d78df8e75db6f7def6f35e7cf79d7be3a7bae78df5ddb79ef3c7fceb7735e9f6dcd75f37734db9f1c7396dfeda69f6b773ae3a73ad9d7dcd1f73473addd6b7dbae38f766b47dfe7bd7cf7469e77bf79f5d69c6dd7bbe5fe1cd9ae75d5ce5be7af79df8ef8eba79dd5eedaeb9e7ddb671edbad1a7fcdf5df87b4f7c69bd9dd747fa73df5d7de6baedcf1b7b9ef7db8d1e6ba7fbe1c737e7bdfce1be1fd5e7bad3b7fcd7977879ef38eb5e1be3773473a734efae7ae5ddf56bbd3a79d69fd3be1de1e7f6d3bdf6ef5dbbf1dd39f1d6dfd9af3dd36f3d69af7d7dbeb6d9e7df71cefc7dcf7af1cf39db7db76f6db86fcd9f75beddef5e1bddfdbcd3473a7bdedd71f79af5de376dcd5cf36d9d775d75f78e9ff7aedb7bbd367797daef8d37f1dd3ce5cd1bf3871aedddf6f39dbaeddf346fd734d3bf35f3a6f6f35db9f5be767f86f9e3be9fdb8f77e3569ce76dbbdb57dadb8e1b7baf357377ba7fb6fcd9ff3bf5ff7af3ae34df677ae3bf5e736f75dbc77de7ce77e9eeba6dcf7979b7f6d77ebddbc6bbefae7aeb479dd3d79f77bedc79e7b7eb47f873cd35db8d74d9bf5cd3df3677c79bf7b7796db73cdb4e1d7b877bd3ae76db6d9c7dbdb7d9a7db735e7bdb9d1ad38d36dde6b87fd79ae9fe9de9f", + "signature": "0x8ae2dedca5f74829a9f051f6e1ec4f332935ef95cf7edb04bc78c1d3adaa5d0dcd9cec4f63d089a65074f7984a603fe915bb6d1f054875d31d309aaa9b5c17c6beb907795aae7e49c057fedfc94df422f6ab045f6af24e225be68bcf64934447", + "withdrawalCredentials": "0x0100000000000000000000004924655De95B84ea7c65f371f4608E3a0792fB21" + }, + "1685979242888": { + "depositDataRoot": "0x9640eaa64dc3dd41ba35e6cde60e5387fac76009686c1224095fb79ff1b762cf", + "publicKey": "0x85b74949834da901340a07346bc8f45c24c148203b3489cc0dfa7bee50e41af54d7e500b337029d16f8df3430748e62f", + "operatorIds": [ + 1, + 2, + 3, + 4 + ], + "shares": "0x00c098bfe49da7500f611d0a56869a5e40366561a3e06219a85f82b557d02a3809448dc9af4799e76608241a7c17ef2f6471a9181a0fc892032c5a37216a723bbb9c6e758c5ab8dd8f197a9c717f06828dd6bc5e3c085bf656a0db31505ed65fba95aaff04c78c8ff1fe21a97cf8e9c9e90c389c7f64b23296d37b71a310b6429a4d8c8a35e2eadb58ecdd4eff86ca9261eeb6f6bfea67d9d085085f0e51a298336cfe0def0bdcfb26e6d37c0b9003e11b6c252ecf6170eb9a35d8af485da296f627eb47356f6d1ce7a79c7b67f66b8e3cf3be5d6fde7cdfc6bde5ef36efce1df777b6e36f5ceddefbf3dd7befbf5eefb6f6db6dde7757def7875ddf5d9b6f4d79d3ae34e1f6fa7df73befcdb9f1a6fad5bdb77f77f4e5feb9d7aef6d34f3cedd77df3979f77a6fd75aedee39f367badb769adb6ebcd9de7a735735e5be5f734e3469b73cf1e7ded3bdbbeb7e34778d9ff1cdfb6b7f7c75d776f5df1adbcf3975de5ed7679f73ddbc75cefd6b9d9bf7cdbbeb87bd6fde5ddddf78efb79eef777de1cdf66b6e7d775edbeddefbd5e6b57bcddee5fe34f1d6b46f571bddae3a6f775ee5b79d779d1be7b79bd367bb779d77d5e69fe79d376f471ed786bddf87ba69bd1de36d35f3ce376daeb5f3ad39f7475c6dbd367b5d9de38f5a6b6f36d3cebb6f5ef57fceb9738edb7dedb86b4f7c6db7da73477ddb4ef5f39d75df571c69c7f4dfbefbd7d71bedbf5cf7969f7fd7366bae78e7575c775d7c7fce7de5ff36dde7f6e7c6bde3d7b8e38e5af3975e71bd786b6f796bcdf4e9fe5fe5ceb779ae5addbe3ceb6f1dd9fd5a7b6d1de7cd9e6df71edb8d5ce3de3979be5ae5e73c779f7bf1ef7875edb6e3969d71c7dff7a7767b6ef9d7ce5b6dedb7f3879b737f3bd38e75ef975df5a6dbd5ff3be1f7b6778e7cf7af7bd36e7a7df7356f46bddde7b97bb6dd7f9db8d79f77e7a735f3ad39df6d1b6b7e1b7f7eb6e5bebbf7ae7bdf8d5bf37e39736f787bcf38df475ed36dbd7ddef7eb6d7871ff5bf7bedae7cd9cf3a75ee39d396bbf7cd7defb6fb79cf787f96b4f756da73cd7ad7aeb7d766bd71a77c77b75d6f8ddbe75f5fe38d37f1a7ba79ceb6738d35f7ad3875de3877671ef5d79a7dc79c6ddf5d7757757b6ebae9ef1cddc6b7e36e5ff3d7f57deddde9de9a737ddeef7ef6e377f4f37e38edd6fc6dfe9dd9beb56bad1f6fbddc6f6e756b57b7f1fd74f5e6dbd5ce7cebad3dd5ce5ed1bd7c7bcf3a71ef3ad7de9ee34d7473bdfd6f8e3a71defa71ae7d7f76bc6ddd396b56bdf7679bf36f1ee38f5aebce1c6db6f6eb56b4e39e5a7f8dfc6da6fa6f473d6dbd1ddddf5df35d1c7f77de7b8d38eb5df86f97f9f1d79d75bd9de36e9b6f573bf35e9fd3b75dd39f776f7f77e7af7adfd77ad76e1f6bdf36d7573b69b79c7f6ebc73cef5dbce9c79ad3ce7b69d79f69fd77e37e3ae7de3c7fd79bf36df5f1ddb67dbf7575b6f869a7fb7dc73ddf9e5def971b7bbf1ad9be5ae9eebcd766f6ebae76f76dddede75fe7a71c7b8dbd7777b96dcdbd79f6b8dbdf3af5b77ce9a71ff34dbdebc7bb7de775e5dd386fb69de78e3ad5e7bcdfad5aeb67b87346faeb7e5ff7671ce366bbd77d1ed1dedaeb9d7cd3c77a7f67b8d356de6f5d5debdf7bd7de35e5f79a71e6f56ba7bcdf97fdd1a73ddb9e5d6b67fde9e6dbd7d71bf1de9ce7af5a6dbd5a6f6f3bd787ded3ce1f6fb7fd7b7ddef74d1fd79e36e5fedcdb8e5be7cd5af38dfcefdd5eeb5e5be9cdb87bc69fd9cd3d7dbedfe5de9deb5d1fdf6e9ed1c6b47bd774e356f5d79f7573c734e9dd9a6faeda77ae3bdb8f5bd1a7bbf7cdf9734f77f376b77b4e5d71debd71bdbcddbedfdbbf5cd766fbd1c7fbd75d1cdf9e5cdf96f4dbd79de3bdb5f7af39db57b5df977def7f5ef1bd3ddbc6b6d1aedeeb8dbcf1c69b69ae796f56daefbf1fdb6f38d5f7b5d9ee356b4f7bf5ed367f7f38ef8d1c73df1b6f7e9fd9a75fdb9f36f36f5ad9b75ee36db87f6e75778d74db569dd367b4f3af3869bdba7b86deddc7f7db773ce9fdf5f5fedeef5ddbe356fbd9bdb8ebae796b9e346dddfadf475c7fc75cef9efcf1be7b79b7f679ff78efbd77efbdf8d5edf56f6e9ee7879ae1cedff1df1aebde9b7daf5fedadfa73c7bcdda79f77a71feb4ef6ddfe1c7b971fdfbefae1df386f579de5bdbbf76e7ae9b71fdb771fe3c73ce1a777d5fedf6b6739e7b6bae9cd3d7b9d3c6b4d76f39f5dd1eebd7366b4f1bd9de1cd1adbb71f7df6fd7746b7ebaf5c738e776b7d9ff1ae79735e776f6ddee9b778d7cef8f35e36e37f1d6dbe747b9dbbf1cdb97f6d7ae1df1ff5ee34e74edad39dfddde73a779e1ae3a7b9eb4df6d34f3bd7c7dfd79ef9dbadfadb97dfef9ef9f75f3c7b6f5cd9ce9ae35ebdef66bb6f969bd5cedc7bcd36eda75b75e6f97fd71e6ddef6f39", + "signature": "0x8357bd71c6e965252c9f998fd61ca2add1a2488da52df1663d47f1509d57c330739a958d9fa76d902e25511828f3bb800bd15682eecddfe7f5b7966c48272eb93e82cf94825815d500ced5105d3d8998fa34c21bb1db891f0dffd8fc9305ca0e", + "withdrawalCredentials": "0x010000000000000000000000704ED6FCD0F7d507793a002d15aF970489701E60" } } \ No newline at end of file diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index bf749e339..836a226a4 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -1038,10 +1038,10 @@ Constructor | _linkSubscriptionId | uint64 | The functions subscription ID | | linkTokenAddress | address | The LINK token address | -### registerAndPredictID +### registerUpkeep ```solidity -function registerAndPredictID(struct KeeperRegistrarInterface.RegistrationParams params) public +function registerUpkeep(struct KeeperRegistrarInterface.RegistrationParams params) public ``` ### generateRequest diff --git a/contracts/ethereum/helpers/oracle.ts b/contracts/ethereum/helpers/oracle.ts index a0d298b11..2d6b0a4d9 100644 --- a/contracts/ethereum/helpers/oracle.ts +++ b/contracts/ethereum/helpers/oracle.ts @@ -4,11 +4,19 @@ import { CasimirManager } from '../build/artifacts/types' import { validatorStore } from '@casimir/data' import { Validator } from '@casimir/types' import { getClusterDetails } from '@casimir/ssv' +import { getWithdrawalCredentials } from '@casimir/helpers' const mockValidators: Validator[] = Object.values(validatorStore) -export async function initiateDepositHandler({ manager, signer, args }: { manager: CasimirManager, signer: SignerWithAddress, args: Record }) { - const { poolId } = args +export async function initiateDepositHandler({ manager, signer }: { manager: CasimirManager, signer: SignerWithAddress }) { + const nonce = await ethers.provider.getTransactionCount(manager.address) + const poolAddress = ethers.utils.getContractAddress({ + from: manager.address, + nonce + }) + const poolWithdrawalCredentials = `0x${getWithdrawalCredentials(poolAddress)}` + const validator = mockValidators.find((validator) => validator.withdrawalCredentials === poolWithdrawalCredentials) + if (!validator) throw new Error(`No validator found for withdrawal credentials ${poolWithdrawalCredentials}`) const { depositDataRoot, publicKey, @@ -16,7 +24,7 @@ export async function initiateDepositHandler({ manager, signer, args }: { manage withdrawalCredentials, operatorIds, shares, - } = mockValidators[poolId - 1] + } = validator const clusterDetails = await getClusterDetails({ provider: ethers.provider, ownerAddress: manager.address, diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index adefb0e0f..7617c211c 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -85,9 +85,9 @@ void async function () { await result.wait() } - /** Stake 160 from the fourth user */ + /** Stake 320 from the fourth user */ setTimeout(async () => { - const depositAmount = 160 * ((100 + await manager.getFeePercent()) / 100) + const depositAmount = 320 * ((100 + await manager.getFeePercent()) / 100) const stake = await manager.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await stake?.wait() }, 1000) diff --git a/contracts/ethereum/scripts/test.ts b/contracts/ethereum/scripts/test.ts index 960f25213..a64523ae6 100644 --- a/contracts/ethereum/scripts/test.ts +++ b/contracts/ethereum/scripts/test.ts @@ -20,5 +20,5 @@ void async function () { await run('npm run build --workspace @casimir/ethereum') - run('npx mocha --require hardhat/register --recursive --exit --extension ts --timeout 60000') + run('npx mocha --require hardhat/register --recursive --exit --extension ts --timeout 60000 > test.log') }() \ No newline at end of file diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index 9b28f594f..e729a87ab 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -328,11 +328,36 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Deposit recovered balance for a given pool from an operator + * @param poolId The pool ID */ function depositRecoveredBalance(uint32 poolId) external payable onlyRegistry { recoveredBalances[poolId] += msg.value; } + /** + * @notice Deposit to a cluster balance + * @param cluster The cluster + * @param amount The amount to deposit + */ + function depositClusterBalance(ISSVNetworkCore.Cluster memory cluster, uint256 amount) external onlyOwner { + + } + + /** + * @notice Deposit upkeep balance + * @param amount The amount to deposit + */ + function depositUpkeepBalance(uint256 amount) external onlyUpkeep { + + } + + /** + * @notice Deposit reserved fees + */ + function depositReservedFees() external payable { + reservedFeeBalance += msg.value; + } + /** * @dev Distribute a given amount of stake * @param amount The amount of stake to distribute @@ -542,8 +567,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { require(readyPoolIds.length > 0, "No ready pools"); require(reservedFeeBalance >= feeAmount, "Not enough reserved fees"); - // Todo validate deposit data root - uint32 poolId = readyPoolIds[0]; readyPoolIds.remove(0); pendingPoolIds.push(poolId); @@ -590,8 +613,12 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ISSVNetworkCore.Cluster memory cluster, uint256 feeAmount ) private { + address poolAddress = poolAddresses[poolId]; + bytes memory computedWithdrawalCredentials = abi.encodePacked(bytes1(uint8(1)), bytes11(0), poolAddress); + require (keccak256(computedWithdrawalCredentials) == keccak256(withdrawalCredentials), "Invalid withdrawal credentials"); + for (uint256 i = 0; i < operatorIds.length; i++) { - registry.addActivePool(poolId, operatorIds[i]); + registry.addOperatorPool(operatorIds[i], poolId); } beaconDeposit.deposit{value: poolCapacity}( diff --git a/contracts/ethereum/src/CasimirPool.sol b/contracts/ethereum/src/CasimirPool.sol index 7d443eb3e..0932b144c 100644 --- a/contracts/ethereum/src/CasimirPool.sol +++ b/contracts/ethereum/src/CasimirPool.sol @@ -55,7 +55,7 @@ contract CasimirPool is ICasimirPool, Ownable, ReentrancyGuard { uint256 blamePercent = blamePercents[i]; blameAmount = Math.mulDiv(lostBalance, blamePercent, 100); } - registry.removeActivePool(config.poolId, config.operatorIds[i], blameAmount); + registry.removeOperatorPool(config.operatorIds[i], config.poolId, blameAmount); } manager.depositExitedBalance{value: balance}(config.poolId); diff --git a/contracts/ethereum/src/CasimirRegistry.sol b/contracts/ethereum/src/CasimirRegistry.sol index 7cefe33f7..969ea7001 100644 --- a/contracts/ethereum/src/CasimirRegistry.sol +++ b/contracts/ethereum/src/CasimirRegistry.sol @@ -83,31 +83,31 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { } /** - * @notice Add an active pool to an operator - * @param poolId The pool ID + * @notice Add a pool to an operator * @param operatorId The operator ID + * @param poolId The pool ID */ - function addActivePool(uint32 poolId, uint64 operatorId) external onlyOwner { + function addOperatorPool(uint64 operatorId, uint32 poolId) external onlyOwner { Operator storage operator = operators[operatorId]; require(operator.active, "Operator is not active"); require(operator.collateral >= 0, "Operator owes collateral"); require(!operator.deregistering, "Operator is deregistering"); - require(!operator.activePools[poolId], "Pool is already active for operator"); - operator.activePools[poolId] = true; + require(!operator.pools[poolId], "Pool is already active for operator"); + operator.pools[poolId] = true; operator.poolCount += 1; } /** - * @notice Remove an active pool from an operator - * @param poolId The pool ID + * @notice Remove a pool from an operator * @param operatorId The operator ID + * @param poolId The pool ID * @param blameAmount The amount to recover from collateral */ - function removeActivePool(uint32 poolId, uint64 operatorId, uint256 blameAmount) external onlyPool(poolId) { + function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external onlyPool(poolId) { Operator storage operator = operators[operatorId]; - require(operator.activePools[poolId], "Pool is not active for operator"); + require(operator.pools[poolId], "Pool is not active for operator"); - operator.activePools[poolId] = false; + operator.pools[poolId] = false; operator.poolCount -= 1; if (blameAmount > 0) { diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index b8e1c39ec..4e9f3aaba 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -66,26 +66,21 @@ interface ICasimirManager { /*************/ function depositStake() external payable; - function depositRewards() external payable; - + function depositExitedBalance(uint32 poolId) external payable; + function depositRecoveredBalance(uint32 poolId) external payable; + function depositReservedFees() external payable; + function depositClusterBalance(ISSVNetworkCore.Cluster memory cluster, uint256 amount) external; + function depositUpkeepBalance(uint256 amount) external; function rebalanceStake( uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, uint256 completedExits ) external; - function compoundRewards(uint32[5] memory poolIds) external; - - function depositExitedBalance(uint32 poolId) external payable; - - function depositRecoveredBalance(uint32 poolId) external payable; - function requestWithdrawal(uint256 amount) external; - function fulfillWithdrawals(uint256 count) external; - function initiateDeposit( bytes32 depositDataRoot, bytes calldata publicKey, @@ -96,74 +91,38 @@ interface ICasimirManager { ISSVNetworkCore.Cluster memory cluster, uint256 feeAmount ) external; - function activateDeposits(uint256 count) external; - function requestForcedExitReports(uint256 count) external; - function requestCompletedExitReports(uint256 count) external; - function reportCompletedExit( uint256 poolIndex, uint32[] memory blamePercents, ISSVNetworkCore.Cluster memory cluster ) external; - function setFunctionsAddress(address functionsAddress) external; - function getFeePercent() external view returns (uint32); - - function getTotalDeposits() - external - view - returns (uint256); - - function getRequestedExits() - external - view - returns (uint256); - + function getTotalDeposits() external view returns (uint256); + function getRequestedExits() external view returns (uint256); function getReadyPoolIds() external view returns (uint32[] memory); - function getPendingPoolIds() external view returns (uint32[] memory); - function getStakedPoolIds() external view returns (uint32[] memory); - function getTotalStake() external view returns (uint256); - function getBufferedBalance() external view returns (uint256); - function getExpectedEffectiveBalance() external view returns (uint256); - function getReportPeriod() external view returns (uint32); - function getFinalizableCompletedExits() external view returns (uint256); - function getFinalizableExitedBalance() external view returns (uint256); - function getLatestActiveBalance() external view returns (uint256); - function getLatestActiveBalanceAfterFees() external view returns (uint256); - function getPendingWithdrawalEligibility(uint256 index, uint256 period) external view returns (bool); - function getWithdrawableBalance() external view returns (uint256); - function getPrepoolBalance() external view returns (uint256); - function getSweptBalance() external view returns (uint256); - function getUserStake(address userAddress) external view returns (uint256); - function getPendingWithdrawalBalance() external view returns (uint256); - function getPendingWithdrawals() external view returns (uint256); - function getPoolAddress(uint32 poolId) external view returns (address); - function getPoolDetails(uint32 poolId) external view returns (PoolDetails memory); - function getRegistryAddress() external view returns (address); - function getUpkeepAddress() external view returns (address); } diff --git a/contracts/ethereum/src/interfaces/ICasimirRegistry.sol b/contracts/ethereum/src/interfaces/ICasimirRegistry.sol index 52d39329a..2482edbb3 100644 --- a/contracts/ethereum/src/interfaces/ICasimirRegistry.sol +++ b/contracts/ethereum/src/interfaces/ICasimirRegistry.sol @@ -12,19 +12,14 @@ interface ICasimirRegistry { bool active; int256 collateral; uint256 poolCount; - mapping(uint32 => bool active) activePools; + mapping(uint32 => bool active) pools; bool deregistering; } function registerOperator(uint64 operatorId) external payable; - function depositCollateral(uint64 operatorId) external payable; - function withdrawCollateral(uint64 operatorId, uint256 amount) external; - - function addActivePool(uint32 poolId, uint64 operatorId) external; - - function removeActivePool(uint32 poolId, uint64 operatorId, uint256 blameAmount) external; - + function addOperatorPool(uint64 operatorId, uint32 poolId) external; + function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external; function getOperatorCollateral(uint64 operatorId) external view returns (int256); } \ No newline at end of file diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index cf959b2b1..d833f7ead 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -109,8 +109,7 @@ export async function secondUserDepositFixture() { const deposit = await manager.connect(secondUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await deposit.wait() - const nextPoolId = 1 - await initiateDepositHandler({ manager, signer: oracle, args: { poolId: nextPoolId } }) + await initiateDepositHandler({ manager, signer: oracle }) await time.increase(time.duration.days(1)) @@ -218,9 +217,7 @@ export async function thirdUserDepositFixture() { const deposit = await manager.connect(thirdUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await deposit.wait() - const readyPools = await manager.getReadyPoolIds() - const nextPoolId = readyPools[readyPools.length - 1] - await initiateDepositHandler({ manager, signer: oracle, args: { poolId: nextPoolId } }) + await initiateDepositHandler({ manager, signer: oracle }) await time.increase(time.duration.days(1)) @@ -361,10 +358,8 @@ export async function fourthUserDepositFixture() { await deposit.wait() /** Initiate next ready pools (2) */ - const readyPools = await manager.getReadyPoolIds() for (let i = 0; i < 2; i++) { - const nextPoolId = readyPools[i] - await initiateDepositHandler({ manager, signer: oracle, args: { poolId: nextPoolId } }) + await initiateDepositHandler({ manager, signer: oracle }) } await time.increase(time.duration.days(1)) diff --git a/services/oracle/src/index.ts b/services/oracle/src/index.ts index bab186619..f55c8625e 100644 --- a/services/oracle/src/index.ts +++ b/services/oracle/src/index.ts @@ -20,9 +20,8 @@ const { provider, signer, manager, cliPath, messengerUrl } = config() ;(async function () { const eventEmitter = getEventEmitter({ manager, events: Object.keys(handlers) }) for await (const event of eventEmitter) { - console.log('Event received', event) - - const [ value, details ] = event + const details = event[event.length - 1] + const { args } = details const handler = handlers[details.event as keyof typeof handlers] if (!handler) throw new Error(`No handler found for event ${details.event}`) await handler({ @@ -31,7 +30,7 @@ const { provider, signer, manager, cliPath, messengerUrl } = config() manager, cliPath, messengerUrl, - value + args }) } })() diff --git a/services/oracle/src/interfaces/HandlerInput.ts b/services/oracle/src/interfaces/HandlerInput.ts index 59a3c6e2c..ca658db69 100644 --- a/services/oracle/src/interfaces/HandlerInput.ts +++ b/services/oracle/src/interfaces/HandlerInput.ts @@ -12,6 +12,6 @@ export interface HandlerInput { cliPath: string /** DKG messenger service URL */ messengerUrl: string - /** Event value */ - value: number + /** Event args */ + args: Record } \ No newline at end of file diff --git a/services/oracle/src/providers/handlers.ts b/services/oracle/src/providers/handlers.ts index 7ebcb2d34..a17a6800f 100644 --- a/services/oracle/src/providers/handlers.ts +++ b/services/oracle/src/providers/handlers.ts @@ -66,10 +66,10 @@ export async function initiatePoolReshareHandler(input: HandlerInput) { manager, cliPath, messengerUrl, - value + args } = input - const poolId = value + const { poolId } = args // Todo reshare event will include the operator to boot @@ -102,10 +102,10 @@ export async function initiatePoolExitHandler(input: HandlerInput) { manager, cliPath, messengerUrl, - value + args } = input - const poolId = value + const { poolId } = args // Get pool to exit const poolDetails = await manager.getPoolDetails(poolId) @@ -121,10 +121,10 @@ export async function reportCompletedExitsHandler(input: HandlerInput) { provider, signer, manager, - value + args } = input - const count = value + const { count } = args // In production, we get the withdrawn exit order from the Beacon API (sorting by withdrawal epoch) // Here, we're just reporting them in the order they were exited From 7a6dac83e576e30f1e31701b7c48ff3c3f142c0b Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Tue, 6 Jun 2023 00:08:17 -0400 Subject: [PATCH 50/78] Add reshare reporter --- contracts/ethereum/docs/index.md | 107 ++++- contracts/ethereum/hardhat.config.ts | 13 +- contracts/ethereum/helpers/oracle.ts | 3 +- contracts/ethereum/scripts/dev.ts | 2 +- contracts/ethereum/scripts/test.ts | 2 +- contracts/ethereum/src/CasimirManager.sol | 419 ++++++++++++++---- contracts/ethereum/src/CasimirRegistry.sol | 12 +- contracts/ethereum/src/CasimirUpkeep.sol | 46 +- .../src/interfaces/ICasimirManager.sol | 31 +- .../interfaces/KeeperRegistrarInterface.sol | 10 +- contracts/ethereum/test/fixtures/shared.ts | 2 +- services/oracle/src/index.ts | 2 +- services/oracle/src/providers/handlers.ts | 3 +- 13 files changed, 474 insertions(+), 178 deletions(-) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 836a226a4..1e0ef7ed1 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -143,6 +143,49 @@ function depositRecoveredBalance(uint32 poolId) external payable Deposit recovered balance for a given pool from an operator +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolId | uint32 | The pool ID | + +### depositClusterBalance + +```solidity +function depositClusterBalance(struct ISSVNetworkCore.Cluster cluster, uint256 amount) external +``` + +Deposit to a cluster balance + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| cluster | struct ISSVNetworkCore.Cluster | The cluster | +| amount | uint256 | The amount to deposit | + +### depositUpkeepBalance + +```solidity +function depositUpkeepBalance(uint256 amount) external +``` + +Deposit upkeep balance + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| amount | uint256 | The amount to deposit | + +### depositReservedFees + +```solidity +function depositReservedFees() external payable +``` + +Deposit reserved fees + ### rebalanceStake ```solidity @@ -265,10 +308,10 @@ Request reports for a given count of completed exits | ---- | ---- | ----------- | | count | uint256 | The number of completed exits | -### reportForcedExit +### reportForcedExits ```solidity -function reportForcedExit(uint32 poolId) external +function reportForcedExits(uint32 poolId) external ``` Report a pool unexpected exit @@ -896,35 +939,35 @@ Withdraw collateral for an operator | operatorId | uint64 | The operator ID | | amount | uint256 | The amount to withdraw | -### addActivePool +### addOperatorPool ```solidity -function addActivePool(uint32 poolId, uint64 operatorId) external +function addOperatorPool(uint64 operatorId, uint32 poolId) external ``` -Add an active pool to an operator +Add a pool to an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | | operatorId | uint64 | The operator ID | +| poolId | uint32 | The pool ID | -### removeActivePool +### removeOperatorPool ```solidity -function removeActivePool(uint32 poolId, uint64 operatorId, uint256 blameAmount) external +function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external ``` -Remove an active pool from an operator +Remove a pool from an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | | operatorId | uint64 | The operator ID | +| poolId | uint32 | The pool ID | | blameAmount | uint256 | The amount to recover from collateral | ### getOperatorCollateral @@ -1319,28 +1362,46 @@ function depositStake() external payable function depositRewards() external payable ``` -### rebalanceStake +### depositExitedBalance ```solidity -function rebalanceStake(uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, uint256 completedExits) external +function depositExitedBalance(uint32 poolId) external payable ``` -### compoundRewards +### depositRecoveredBalance ```solidity -function compoundRewards(uint32[5] poolIds) external +function depositRecoveredBalance(uint32 poolId) external payable ``` -### depositExitedBalance +### depositReservedFees ```solidity -function depositExitedBalance(uint32 poolId) external payable +function depositReservedFees() external payable ``` -### depositRecoveredBalance +### depositClusterBalance ```solidity -function depositRecoveredBalance(uint32 poolId) external payable +function depositClusterBalance(struct ISSVNetworkCore.Cluster cluster, uint256 amount) external +``` + +### depositUpkeepBalance + +```solidity +function depositUpkeepBalance(uint256 amount) external +``` + +### rebalanceStake + +```solidity +function rebalanceStake(uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, uint256 completedExits) external +``` + +### compoundRewards + +```solidity +function compoundRewards(uint32[5] poolIds) external ``` ### requestWithdrawal @@ -1647,7 +1708,7 @@ struct Operator { bool active; int256 collateral; uint256 poolCount; - mapping(uint32 => bool) activePools; + mapping(uint32 => bool) pools; bool deregistering; } ``` @@ -1670,16 +1731,16 @@ function depositCollateral(uint64 operatorId) external payable function withdrawCollateral(uint64 operatorId, uint256 amount) external ``` -### addActivePool +### addOperatorPool ```solidity -function addActivePool(uint32 poolId, uint64 operatorId) external +function addOperatorPool(uint64 operatorId, uint32 poolId) external ``` -### removeActivePool +### removeOperatorPool ```solidity -function removeActivePool(uint32 poolId, uint64 operatorId, uint256 blameAmount) external +function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external ``` ### getOperatorCollateral diff --git a/contracts/ethereum/hardhat.config.ts b/contracts/ethereum/hardhat.config.ts index 0d1608fdf..7b3c90264 100644 --- a/contracts/ethereum/hardhat.config.ts +++ b/contracts/ethereum/hardhat.config.ts @@ -28,11 +28,12 @@ const externalEnv = { ORACLE_ADDRESS: '0x0000000000000000000000000000000000000000', BEACON_DEPOSIT_ADDRESS: '0x00000000219ab540356cBB839Cbe05303d7705Fa', LINK_FUNCTIONS_ADDRESS: '0x0000000000000000000000000000000000000000', - LINK_REGISTRAR_ADDRESS: '0xE16Df59B887e3Caa439E0b29B42bA2e7976FD8b2', + LINK_REGISTRAR_ADDRESS: ' 0xDb8e8e2ccb5C033938736aa89Fe4fa1eDfD15a1d', + LINK_REGISTRY_ADDRESS: '0x02777053d6764996e594c3E88AF1D58D5363a2e6', LINK_SUBSCRIPTION_ID: '1', LINK_TOKEN_ADDRESS: '0x514910771AF9Ca656af840dff83E8264EcF986CA', - SSV_NETWORK_ADDRESS: '0xAfdb141Dd99b5a101065f40e3D7636262dce65b3', - SSV_NETWORK_VIEWS_ADDRESS: '0x8dB45282d7C4559fd093C26f677B3837a5598914', + SSV_NETWORK_ADDRESS: '0x0000000000000000000000000000000000000000', + SSV_NETWORK_VIEWS_ADDRESS: '0x0000000000000000000000000000000000000000', SSV_TOKEN_ADDRESS: '0x9D65fF81a3c488d585bBfb0Bfe3c7707c7917f54', SWAP_FACTORY_ADDRESS: '0x1F98431c8aD98523631AE4a59f267346ea31F984', SWAP_ROUTER_ADDRESS: '0xE592427A0AEce92De3Edee1F18E0157C05861564', @@ -41,9 +42,9 @@ const externalEnv = { goerli: { ORACLE_ADDRESS: '0x0000000000000000000000000000000000000000', BEACON_DEPOSIT_ADDRESS: '0x07b39F4fDE4A38bACe212b546dAc87C58DfE3fDC', - LINK_FUNCTIONS_ADDRESS: '0x3de1bE9407645533CD0CbeCf88dFE5297E7125e6', - LINK_REGISTRAR_ADDRESS: '0xE16Df59B887e3Caa439E0b29B42bA2e7976FD8b2', - LINK_SUBSCRIPTION_ID: '1', + LINK_FUNCTIONS_ADDRESS: '0x0000000000000000000000000000000000000000', + LINK_REGISTRAR_ADDRESS: '0x57A4a13b35d25EE78e084168aBaC5ad360252467', + LINK_REGISTRY_ADDRESS: '0xE16Df59B887e3Caa439E0b29B42bA2e7976FD8b2', LINK_TOKEN_ADDRESS: '0x326C977E6efc84E512bB9C30f76E30c160eD06FB', SSV_NETWORK_ADDRESS: '0xAfdb141Dd99b5a101065f40e3D7636262dce65b3', SSV_NETWORK_VIEWS_ADDRESS: '0x8dB45282d7C4559fd093C26f677B3837a5598914', diff --git a/contracts/ethereum/helpers/oracle.ts b/contracts/ethereum/helpers/oracle.ts index 2d6b0a4d9..af33924ed 100644 --- a/contracts/ethereum/helpers/oracle.ts +++ b/contracts/ethereum/helpers/oracle.ts @@ -39,7 +39,8 @@ export async function initiateDepositHandler({ manager, signer }: { manager: Cas operatorIds, shares, cluster, - requiredBalancePerValidator // Mock fee amount estimate ~ 10 SSV + requiredBalancePerValidator, + false ) await initiateDeposit.wait() } diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 7617c211c..52ce91486 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -19,7 +19,7 @@ void async function () { beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, linkFunctionsAddress: process.env.LINK_FUNCTIONS_ADDRESS, linkRegistrarAddress: process.env.LINK_REGISTRAR_ADDRESS, - linkSubscriptionId: process.env.LINK_SUBSCRIPTION_ID, + linkRegistryAddress: process.env.LINK_REGISTRY_ADDRESS, linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, ssvNetworkViewsAddress: process.env.SSV_NETWORK_VIEWS_ADDRESS, diff --git a/contracts/ethereum/scripts/test.ts b/contracts/ethereum/scripts/test.ts index a64523ae6..960f25213 100644 --- a/contracts/ethereum/scripts/test.ts +++ b/contracts/ethereum/scripts/test.ts @@ -20,5 +20,5 @@ void async function () { await run('npm run build --workspace @casimir/ethereum') - run('npx mocha --require hardhat/register --recursive --exit --extension ts --timeout 60000 > test.log') + run('npx mocha --require hardhat/register --recursive --exit --extension ts --timeout 60000') }() \ No newline at end of file diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index e729a87ab..c15c60da1 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -9,6 +9,8 @@ import "./libraries/Types.sol"; import "./vendor/interfaces/IDepositContract.sol"; import "./vendor/interfaces/ISSVNetwork.sol"; import "./vendor/interfaces/IWETH9.sol"; +import "./vendor/interfaces/KeeperRegistrarInterface.sol"; +import "@chainlink/contracts/src/v0.8/interfaces/AutomationRegistryInterface2_0.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; @@ -45,7 +47,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /*************/ /** Compound minimum (0.1 ETH) */ - uint256 private constant compoundMinimum = 100000000000000000; + uint256 private constant compoundMinimum = 100000000 gwei; + /** Minimum balance for upkeep registration (0.1 LINK) */ + uint256 upkeepRegistrationMinimum = 100000000 gwei; /** Stake minimum (0.0001 ETH) */ uint256 private constant stakeMinimum = 100000000000000; /** Scale factor for each rewards to stake ratio */ @@ -67,6 +71,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ICasimirUpkeep private immutable upkeep; /** Beacon deposit contract */ IDepositContract private immutable beaconDeposit; + /** Keeper registrar contract */ + KeeperRegistrarInterface private immutable linkRegistrar; + /** Keeper registry contract */ + AutomationRegistryInterface private immutable linkRegistry; /** LINK ERC-20 token contract */ IERC20 private immutable linkToken; /** SSV network contract */ @@ -82,6 +90,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /* Dynamic State */ /********************/ + /** Upkeep ID */ + uint256 private upkeepId; /** Current report period */ uint32 private reportPeriod; /** Last pool ID created */ @@ -147,7 +157,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @dev Validate the caller is the authorized pool */ modifier onlyPool(uint32 poolId) { - require(msg.sender == poolAddresses[poolId], "Only authorized pool can call this function"); + require( + msg.sender == poolAddresses[poolId], + "Only authorized pool can call this function" + ); _; } @@ -162,6 +175,17 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { _; } + /** + * @dev Validate the caller is the oracle or upkeep + */ + modifier onlyOracleOrUpkeep() { + require( + msg.sender == oracleAddress || msg.sender == address(upkeep), + "Only manager oracle or upkeep can call this function" + ); + _; + } + /** * @dev Validate the caller is the registry */ @@ -188,7 +212,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @dev Validate a deposit */ modifier validDeposit() { - require(msg.value >= stakeMinimum, "Deposit must be greater than minimum"); + require( + msg.value >= stakeMinimum, + "Deposit must be greater than minimum" + ); _; } @@ -211,14 +238,14 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { require(amount > 0, "Distribution must be greater than zero"); _; } - + /** * @notice Constructor * @param _oracleAddress The manager oracle address * @param beaconDepositAddress The Beacon deposit address * @param linkFunctionsAddress The Chainlink functions oracle address * @param linkRegistrarAddress The Chainlink keeper registrar address - * @param linkSubscriptionId The Chainlink functions subscription ID + * @param linkRegistryAddress The Chainlink keeper registry address * @param linkTokenAddress The Chainlink token address * @param ssvNetworkAddress The SSV network address * @param ssvNetworkViewsAddress The SSV network views address @@ -232,7 +259,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { address beaconDepositAddress, address linkFunctionsAddress, address linkRegistrarAddress, - uint32 linkSubscriptionId, + address linkRegistryAddress, address linkTokenAddress, address ssvNetworkAddress, address ssvNetworkViewsAddress, @@ -243,6 +270,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ) { oracleAddress = _oracleAddress; beaconDeposit = IDepositContract(beaconDepositAddress); + linkRegistrar = KeeperRegistrarInterface(linkRegistrarAddress); + linkRegistry = AutomationRegistryInterface(linkRegistryAddress); linkToken = IERC20(linkTokenAddress); tokenAddresses[Token.LINK] = linkTokenAddress; ssvNetwork = ISSVNetwork(ssvNetworkAddress); @@ -253,12 +282,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { tokenAddresses[Token.WETH] = wethTokenAddress; registry = new CasimirRegistry(ssvNetworkViewsAddress); - upkeep = new CasimirUpkeep( - linkFunctionsAddress, - linkRegistrarAddress, - linkSubscriptionId, - linkTokenAddress - ); + upkeep = new CasimirUpkeep(linkFunctionsAddress); } /** @@ -316,7 +340,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Deposit exited balance from a given pool ID * @param poolId The pool ID */ - function depositExitedBalance(uint32 poolId) external payable onlyPool(poolId) { + function depositExitedBalance( + uint32 poolId + ) external payable onlyPool(poolId) { delete poolAddresses[poolId]; uint256 balance = msg.value + recoveredBalances[poolId]; delete recoveredBalances[poolId]; @@ -330,25 +356,64 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Deposit recovered balance for a given pool from an operator * @param poolId The pool ID */ - function depositRecoveredBalance(uint32 poolId) external payable onlyRegistry { + function depositRecoveredBalance( + uint32 poolId + ) external payable onlyRegistry { recoveredBalances[poolId] += msg.value; } /** * @notice Deposit to a cluster balance - * @param cluster The cluster - * @param amount The amount to deposit + * @param operatorIds The operator IDs + * @param cluster The SSV cluster snapshot + * @param feeAmount The fee amount to deposit + * @param processed Whether the fee amount is already processed */ - function depositClusterBalance(ISSVNetworkCore.Cluster memory cluster, uint256 amount) external onlyOwner { - + function depositClusterBalance( + uint64[] memory operatorIds, + ISSVNetworkCore.Cluster memory cluster, + uint256 feeAmount, + bool processed + ) external onlyOracle { + uint256 ssvAmount = retrieveFees(feeAmount, tokenAddresses[Token.SSV], processed); + ssvToken.approve(address(ssvNetwork), ssvAmount); + ssvNetwork.deposit(address(this), operatorIds, ssvAmount, cluster); } /** - * @notice Deposit upkeep balance - * @param amount The amount to deposit + * @notice Deposit to the upkeep balance + * @param feeAmount The fee amount to deposit + * @param processed Whether the fee amount is already processed */ - function depositUpkeepBalance(uint256 amount) external onlyUpkeep { + function depositUpkeepBalance( + uint256 feeAmount, + bool processed + ) external onlyOracleOrUpkeep { + uint256 linkAmount = retrieveFees(feeAmount, tokenAddresses[Token.LINK], processed); + linkToken.approve(address(linkRegistrar), linkAmount); + if (upkeepId == 0) { + if (linkAmount < upkeepRegistrationMinimum) { + revert("Upkeep registration minimum not met"); + } + upkeepId = linkRegistrar.registerUpkeep( + KeeperRegistrarInterface.RegistrationParams({ + name: string("CasimirUpkeep"), + encryptedEmail: new bytes(0), + upkeepContract: address(this), + gasLimit: 0, + adminAddress: address(this), + checkData: new bytes(0), + offchainConfig: new bytes(0), + amount: uint96(linkAmount) + }) + ); + } else { + linkRegistry.addFunds(upkeepId, uint96(linkAmount)); + } + if (upkeepId == 0) { + revert("Upkeep not registered"); + } } /** @@ -358,6 +423,19 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { reservedFeeBalance += msg.value; } + /** + * @notice Withdraw a given amount of reserved fees + * @param amount The amount of fees to withdraw + */ + function withdrawReservedFees(uint256 amount) external onlyOwner { + require( + amount <= reservedFeeBalance, + "Withdrawing more than reserved fees" + ); + reservedFeeBalance -= amount; + owner().send(amount); + } + /** * @dev Distribute a given amount of stake * @param amount The amount of stake to distribute @@ -461,7 +539,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Request to withdraw user stake * @param amount The amount of stake to withdraw */ - function requestWithdrawal(uint256 amount) external nonReentrant validWithdrawal(amount) { + function requestWithdrawal( + uint256 amount + ) external nonReentrant validWithdrawal(amount) { users[msg.sender].stake0 = getUserStake(msg.sender); require( users[msg.sender].stake0 >= amount, @@ -488,8 +568,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { if (requestedWithdrawalBalance > coveredExitBalance) { uint256 exitsRequired = (requestedWithdrawalBalance - coveredExitBalance) / poolCapacity; - if ((requestedWithdrawalBalance - - coveredExitBalance) % poolCapacity > 0) { + if ( + (requestedWithdrawalBalance - coveredExitBalance) % + poolCapacity > + 0 + ) { exitsRequired++; } requestExits(exitsRequired); @@ -552,7 +635,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param withdrawalCredentials The withdrawal credentials * @param operatorIds The operator IDs * @param shares The operator shares - * @param feeAmount The fee amount + * @param feeAmount The fee amount to deposit + * @param cluster The SSV cluster snapshot */ function initiateDeposit( bytes32 depositDataRoot, @@ -562,17 +646,22 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint64[] memory operatorIds, bytes memory shares, ISSVNetworkCore.Cluster memory cluster, - uint256 feeAmount + uint256 feeAmount, + bool processed ) external onlyOracle { require(readyPoolIds.length > 0, "No ready pools"); - require(reservedFeeBalance >= feeAmount, "Not enough reserved fees"); uint32 poolId = readyPoolIds[0]; readyPoolIds.remove(0); pendingPoolIds.push(poolId); totalDeposits++; - - poolAddresses[poolId] = deployPool(poolId, publicKey, operatorIds); + + poolAddresses[poolId] = deployPool( + poolId, + publicKey, + withdrawalCredentials, + operatorIds + ); registerPool( poolId, @@ -583,7 +672,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { operatorIds, shares, cluster, - feeAmount + feeAmount, + processed ); emit DepositInitiated(poolId); @@ -592,14 +682,26 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function deployPool( uint32 poolId, bytes memory publicKey, + bytes memory withdrawalCredentials, uint64[] memory operatorIds ) private returns (address poolAddress) { ICasimirPool pool = new CasimirPool( address(registry), - poolId, publicKey, + poolId, + publicKey, operatorIds ); poolAddress = address(pool); + bytes memory computedWithdrawalCredentials = abi.encodePacked( + bytes1(uint8(1)), + bytes11(0), + poolAddress + ); + require( + keccak256(computedWithdrawalCredentials) == + keccak256(withdrawalCredentials), + "Invalid withdrawal credentials" + ); } function registerPool( @@ -611,13 +713,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint64[] memory operatorIds, bytes memory shares, ISSVNetworkCore.Cluster memory cluster, - uint256 feeAmount + uint256 feeAmount, + bool processed ) private { - address poolAddress = poolAddresses[poolId]; - bytes memory computedWithdrawalCredentials = abi.encodePacked(bytes1(uint8(1)), bytes11(0), poolAddress); - require (keccak256(computedWithdrawalCredentials) == keccak256(withdrawalCredentials), "Invalid withdrawal credentials"); - - for (uint256 i = 0; i < operatorIds.length; i++) { + for (uint256 i = 0; i < operatorIds.length; i++) { registry.addOperatorPool(operatorIds[i], poolId); } @@ -628,13 +727,13 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { depositDataRoot ); - uint256 ssvFees = processFees(feeAmount, tokenAddresses[Token.SSV]); - ssvToken.approve(address(ssvNetwork), ssvFees); + uint256 ssvAmount = retrieveFees(feeAmount, tokenAddresses[Token.SSV], processed); + ssvToken.approve(address(ssvNetwork), ssvAmount); ssvNetwork.registerValidator( publicKey, operatorIds, shares, - ssvFees, + ssvAmount, cluster ); } @@ -668,7 +767,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); ICasimirPool.PoolStatus poolStatus = pool.getStatus(); - if (poolStatus == ICasimirPool.PoolStatus.PENDING || poolStatus == ICasimirPool.PoolStatus.ACTIVE) { + if ( + poolStatus == ICasimirPool.PoolStatus.PENDING || + poolStatus == ICasimirPool.PoolStatus.ACTIVE + ) { count--; index++; @@ -701,27 +803,31 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Report a pool unexpected exit - * @param poolId The pool ID + * @notice Report pool forced (unrequested) exits + * @param poolIds The pool IDs */ - function reportForcedExit(uint32 poolId) external onlyOracle { - require( - requestedForcedExitReports > 0, - "No requested pool unexpected exit reports" - ); - ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); - ICasimirPool.PoolStatus poolStatus = pool.getStatus(); - require( - poolStatus != ICasimirPool.PoolStatus.EXITING_FORCED, - "Forced exit already reported" - ); + function reportForcedExits(uint32[] memory poolIds) external onlyOracle { + for (uint256 i = 0; i < poolIds.length; i++) { + require( + requestedForcedExitReports > 0, + "No requested forced exits" + ); - requestedForcedExitReports -= 1; - forcedExits++; - if (poolStatus == ICasimirPool.PoolStatus.EXITING_REQUESTED) { - requestedExits--; + uint32 poolId = poolIds[i]; + ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); + ICasimirPool.PoolStatus poolStatus = pool.getStatus(); + require( + poolStatus != ICasimirPool.PoolStatus.EXITING_FORCED, + "Forced exit already reported" + ); + + requestedForcedExitReports -= 1; + forcedExits++; + if (poolStatus == ICasimirPool.PoolStatus.EXITING_REQUESTED) { + requestedExits--; + } + pool.setStatus(ICasimirPool.PoolStatus.EXITING_FORCED); } - pool.setStatus(ICasimirPool.PoolStatus.EXITING_FORCED); } /** @@ -743,8 +849,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); ICasimirPool.PoolConfig memory poolConfig = pool.getConfig(); require( - poolConfig.status == ICasimirPool.PoolStatus.EXITING_FORCED || - poolConfig.status == ICasimirPool.PoolStatus.EXITING_REQUESTED, + poolConfig.status == ICasimirPool.PoolStatus.EXITING_FORCED || + poolConfig.status == ICasimirPool.PoolStatus.EXITING_REQUESTED, "Pool not exiting" ); @@ -756,7 +862,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { totalDeposits--; if (poolConfig.status == ICasimirPool.PoolStatus.EXITING_REQUESTED) { requestedExits--; - } else if (poolConfig.status == ICasimirPool.PoolStatus.EXITING_FORCED) { + } else if ( + poolConfig.status == ICasimirPool.PoolStatus.EXITING_FORCED + ) { forcedExits--; } pool.setStatus(ICasimirPool.PoolStatus.WITHDRAWN); @@ -767,6 +875,61 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { emit ExitCompleted(poolId); } + /** + * @notice Report a reshare + * @param poolId The pool ID + * @param operatorIds The operator IDs + * @param oldOperatorIds The old operator IDs + * @param newOperatorId The new operator ID + * @param oldOperatorId The old operator ID + * @param shares The operator shares + * @param cluster The SSV cluster snapshot + * @param oldCluster The old SSV cluster snapshot + * @param feeAmount The fee amount to deposit + * @param processed Whether the fee amount is already processed + */ + function reportReshare( + uint32 poolId, + uint64[] memory operatorIds, + uint64[] memory oldOperatorIds, + uint64 newOperatorId, + uint64 oldOperatorId, + bytes memory shares, + ISSVNetworkCore.Cluster memory cluster, + ISSVNetworkCore.Cluster memory oldCluster, + uint256 feeAmount, + bool processed + ) external onlyOracle { + ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); + ICasimirPool.PoolConfig memory poolConfig = pool.getConfig(); + + require( + poolConfig.status == ICasimirPool.PoolStatus.PENDING || + poolConfig.status == ICasimirPool.PoolStatus.ACTIVE, + "Pool not active" + ); + + registry.removeOperatorPool(oldOperatorId, poolId, 0); + registry.addOperatorPool(newOperatorId, poolId); + + uint256 ssvAmount = retrieveFees(feeAmount, tokenAddresses[Token.SSV], processed); + ssvToken.approve(address(ssvNetwork), ssvAmount); + + ssvNetwork.removeValidator( + poolConfig.publicKey, + oldOperatorIds, + oldCluster + ); + + ssvNetwork.registerValidator( + poolConfig.publicKey, + operatorIds, + shares, + ssvAmount, + cluster + ); + } + /** * @dev Get reservable fees from a given amount * @param amount The amount to reserve fees from @@ -778,6 +941,24 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { amountAfterFees = Math.mulDiv(amount, 100, 100 + feePercent); } + /** + * @dev Retrieve fees for a given amount of a given token + * @param amount The amount to retrieve + * @param token The token address + * @param processed Whether the amount is already processed + */ + function retrieveFees( + uint256 amount, + address token, + bool processed + ) private returns (uint256 amountOut) { + if (!processed) { + amountOut = processFees(amount, token); + } else { + amountOut = amount; + } + } + /** * @dev Process reserved fees to a given token * @param amount The amount to process @@ -789,46 +970,74 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { address tokenOut ) private returns (uint256 amountOut) { reservedFeeBalance -= amount; - wrapFees(amount); - amountOut = swapFees(amount, tokenOut); - } - - function wrapFees( - uint256 amount - ) private { IWETH9 wethToken = IWETH9(tokenAddresses[Token.WETH]); wethToken.deposit{value: amount}(); wethToken.approve( address(swapRouter), wethToken.balanceOf(address(this)) ); - } - function swapFees( - uint256 amount, - address tokenOut - ) private returns (uint256 amountOut) { - address swapPool = swapFactory.getPool( - tokenAddresses[Token.WETH], - tokenOut, - uniswapFeeTier + IUniswapV3PoolState swapPool = IUniswapV3PoolState( + swapFactory.getPool( + tokenAddresses[Token.WETH], + tokenOut, + uniswapFeeTier + ) ); - uint256 liquidity = IUniswapV3PoolState(swapPool).liquidity(); + uint256 liquidity = swapPool.liquidity(); require(liquidity >= amount, "Not enough liquidity"); - ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({ - tokenIn: tokenAddresses[Token.WETH], - tokenOut: tokenOut, - fee: uniswapFeeTier, - recipient: address(this), - deadline: block.timestamp, - amountIn: amount, - amountOutMinimum: 0, - sqrtPriceLimitX96: 0 - }); + ISwapRouter.ExactInputSingleParams memory params = ISwapRouter + .ExactInputSingleParams({ + tokenIn: tokenAddresses[Token.WETH], + tokenOut: tokenOut, + fee: uniswapFeeTier, + recipient: address(this), + deadline: block.timestamp, + amountIn: amount, + amountOutMinimum: 0, + sqrtPriceLimitX96: 0 + }); amountOut = swapRouter.exactInputSingle(params); } + /** + * @notice Withdraw a given amount of a cluster balance + * @param operatorIds The operator IDs + * @param cluster The SSV cluster snapshot + * @param amount The amount to withdraw + */ + function withdrawClusterBalance( + uint64[] memory operatorIds, + ISSVNetworkCore.Cluster memory cluster, + uint256 amount + ) private { + ssvNetwork.withdraw(operatorIds, amount, cluster); + } + + /** + * @notice Cancel upkeep and withdraw the upkeep balance + */ + function withdrawUpkeepBalance() external onlyOracle { + linkRegistry.cancelUpkeep(upkeepId); + } + + /** + * @notice Withdraw a given amount from the LINK balance + * @param amount The amount to withdraw + */ + function withdrawLINKBalance(uint256 amount) external onlyOwner { + linkToken.transfer(owner(), amount); + } + + /** + * @notice Withdraw a given amount from the SSV balance + * @param amount The amount to withdraw + */ + function withdrawSSVBalance(uint256 amount) external onlyOwner { + ssvToken.transfer(owner(), amount); + } + /** * @notice Update the functions oracle address * @param functionsAddress New functions oracle address @@ -1067,7 +1276,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param poolId The pool ID * @return poolDetails The pool details */ - function getPoolDetails(uint32 poolId) external view returns (PoolDetails memory poolDetails) { + function getPoolDetails( + uint32 poolId + ) external view returns (PoolDetails memory poolDetails) { if (poolAddresses[poolId] != address(0)) { ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); ICasimirPool.PoolConfig memory poolConfig = pool.getConfig(); @@ -1085,10 +1296,22 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @notice Get the registry address * @return registryAddress The registry address */ - function getRegistryAddress() external view returns (address registryAddress) { + function getRegistryAddress() + external + view + returns (address registryAddress) + { registryAddress = address(registry); } + /** + * @notice Get the upkeep ID + * @return upkeepId The upkeep ID + */ + function getUpkeepId() external view returns (uint256) { + return upkeepId; + } + /** * @notice Get the upkeep address * @return upkeepAddress The upkeep address @@ -1097,6 +1320,14 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { upkeepAddress = address(upkeep); } + /** + * @notice Get the upkeep balance + * @return upkeepBalance The upkeep balance + */ + function getUpkeepBalance() external view returns (uint256 upkeepBalance) { + upkeepBalance = linkRegistry.getUpkeep(upkeepId).balance; + } + /** * @notice Get the swept balance * @dev Should be called off-chain @@ -1120,7 +1351,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @dev Should be called off-chain * @return poolIds The next five compoundable pool IDs */ - function getCompoundablePoolIds() external view returns (uint32[5] memory poolIds) { + function getCompoundablePoolIds() + external + view + returns (uint32[5] memory poolIds) + { uint256 count = 0; for (uint256 i = 0; i < stakedPoolIds.length; i++) { uint32 poolId = stakedPoolIds[i]; diff --git a/contracts/ethereum/src/CasimirRegistry.sol b/contracts/ethereum/src/CasimirRegistry.sol index 969ea7001..162ddeb1f 100644 --- a/contracts/ethereum/src/CasimirRegistry.sol +++ b/contracts/ethereum/src/CasimirRegistry.sol @@ -24,10 +24,14 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { /*************/ /** - * @dev Validate the caller is the authorized pool + * @dev Validate the caller is owner or the authorized pool */ - modifier onlyPool(uint32 poolId) { - require(msg.sender == manager.getPoolAddress(poolId), "Only authorized pool can call this function"); + modifier onlyOwnerOrPool(uint32 poolId) { + require( + msg.sender == owner() || + msg.sender == manager.getPoolAddress(poolId), + "Only owner or the authorized pool can call this function" + ); _; } @@ -103,7 +107,7 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { * @param poolId The pool ID * @param blameAmount The amount to recover from collateral */ - function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external onlyPool(poolId) { + function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external onlyOwnerOrPool(poolId) { Operator storage operator = operators[operatorId]; require(operator.pools[poolId], "Pool is not active for operator"); diff --git a/contracts/ethereum/src/CasimirUpkeep.sol b/contracts/ethereum/src/CasimirUpkeep.sol index 4a1deaab0..c575b31bb 100644 --- a/contracts/ethereum/src/CasimirUpkeep.sol +++ b/contracts/ethereum/src/CasimirUpkeep.sol @@ -3,7 +3,6 @@ pragma solidity 0.8.18; import "./interfaces/ICasimirUpkeep.sol"; import "./interfaces/ICasimirManager.sol"; -import "./vendor/interfaces/KeeperRegistrarInterface.sol"; import {Functions, FunctionsClient} from "@chainlink/contracts/src/v0.8/dev/functions/FunctionsClient.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; @@ -36,17 +35,11 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /** Manager contract */ ICasimirManager private immutable manager; - /** Keeper registrar contract */ - KeeperRegistrarInterface private immutable linkRegistrar; - /** LINK ERC-20 token contract */ - IERC20 private immutable linkToken; /********************/ /* Dynamic State */ /********************/ - /** Upkeep ID */ - uint256 private upkeepId; /** Current report status */ ReportStatus private reportStatus; /** Current report period */ @@ -64,7 +57,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /** Current report deposit activations */ uint256 private reportActivatedDeposits; /** Current report unexpected exits */ - uint256 private reportForcedExits; + uint256 private reportForcedExitss; /** Current report completed exits */ uint256 private reportCompletedExits; /** Current report compoundable pools */ @@ -81,8 +74,8 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { bytes public requestCBOR; /** Fulfillment gas limit */ uint32 fulfillGasLimit; - /** Functions subscription ID */ - uint64 private linkSubscriptionId; + /** Functions subscription ID (Mocked until managed subscriptions are implemented) */ + uint64 private linkSubscriptionId = 1; /***************/ /* Constructor */ @@ -91,28 +84,11 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /** * Constructor * @param linkFunctionsAddress The functions oracle contract address - * @param linkRegistrarAddress The keeper registrar address - * @param _linkSubscriptionId The functions subscription ID - * @param linkTokenAddress The LINK token address */ constructor( - address linkFunctionsAddress, - address linkRegistrarAddress, - uint64 _linkSubscriptionId, - address linkTokenAddress + address linkFunctionsAddress ) FunctionsClient(linkFunctionsAddress) { manager = ICasimirManager(msg.sender); - linkRegistrar = KeeperRegistrarInterface(linkRegistrarAddress); - linkToken = IERC20(linkTokenAddress); - linkSubscriptionId = _linkSubscriptionId; - } - - function registerUpkeep(KeeperRegistrarInterface.RegistrationParams memory params) public { - linkToken.approve(address(linkRegistrar), params.amount); - upkeepId = linkRegistrar.registerUpkeep(params); - if (upkeepId == 0) { - revert("Registration failed"); - } } /** @@ -144,16 +120,16 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /** * @notice Set the bytes representing the CBOR-encoded Functions.Request * @param _fulfillGasLimit Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function - * @param linkSubscriptionId The functions billing subscription ID used to pay for Functions requests + * @param _linkSubscriptionId The functions billing subscription ID used to pay for Functions requests * @param _requestCBOR Bytes representing the CBOR-encoded Functions.Request */ function setRequest( uint32 _fulfillGasLimit, - uint64 linkSubscriptionId, + uint64 _linkSubscriptionId, bytes calldata _requestCBOR ) external onlyOwner { fulfillGasLimit = _fulfillGasLimit; - linkSubscriptionId = linkSubscriptionId; + linkSubscriptionId = _linkSubscriptionId; requestCBOR = _requestCBOR; } @@ -228,7 +204,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { reportActiveBalance = 0; reportActivatedDeposits = 0; - reportForcedExits = 0; + reportForcedExitss = 0; reportCompletedExits = 0; reportCompoundablePoolIds = [0, 0, 0, 0, 0]; } @@ -276,7 +252,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { ) = abi.decode(response, (uint32, uint32, uint32, uint32[5])); reportActivatedDeposits = activatedDeposits; - reportForcedExits = unexpectedExits; + reportForcedExitss = unexpectedExits; reportCompletedExits = completedExits; reportCompoundablePoolIds = compoundablePools; @@ -287,8 +263,8 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { if (reportRemainingRequests == 0) { reportStatus = ReportStatus.PROCESSING; - if (reportForcedExits > 0) { - manager.requestForcedExitReports(reportForcedExits); + if (reportForcedExitss > 0) { + manager.requestForcedExitReports(reportForcedExitss); } if (reportCompletedExits > 0) { diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index 4e9f3aaba..ab2d619be 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -70,8 +70,16 @@ interface ICasimirManager { function depositExitedBalance(uint32 poolId) external payable; function depositRecoveredBalance(uint32 poolId) external payable; function depositReservedFees() external payable; - function depositClusterBalance(ISSVNetworkCore.Cluster memory cluster, uint256 amount) external; - function depositUpkeepBalance(uint256 amount) external; + function depositClusterBalance( + uint64[] memory operatorIds, + ISSVNetworkCore.Cluster memory cluster, + uint256 feeAmount, + bool processed + ) external; + function depositUpkeepBalance( + uint256 feeAmount, + bool processed + ) external; function rebalanceStake( uint256 activeBalance, uint256 sweptBalance, @@ -89,7 +97,8 @@ interface ICasimirManager { uint64[] memory operatorIds, bytes calldata shares, ISSVNetworkCore.Cluster memory cluster, - uint256 feeAmount + uint256 feeAmount, + bool processed ) external; function activateDeposits(uint256 count) external; function requestForcedExitReports(uint256 count) external; @@ -99,6 +108,20 @@ interface ICasimirManager { uint32[] memory blamePercents, ISSVNetworkCore.Cluster memory cluster ) external; + function reportReshare( + uint32 poolId, + uint64[] memory operatorIds, + uint64[] memory oldOperatorIds, + uint64 newOperatorId, + uint64 oldOperatorId, + bytes memory shares, + ISSVNetworkCore.Cluster memory cluster, + ISSVNetworkCore.Cluster memory oldCluster, + uint256 feeAmount, + bool processed + ) external; + function withdrawLINKBalance(uint256 amount) external; + function withdrawSSVBalance(uint256 amount) external; function setFunctionsAddress(address functionsAddress) external; function getFeePercent() external view returns (uint32); function getTotalDeposits() external view returns (uint256); @@ -124,5 +147,7 @@ interface ICasimirManager { function getPoolAddress(uint32 poolId) external view returns (address); function getPoolDetails(uint32 poolId) external view returns (PoolDetails memory); function getRegistryAddress() external view returns (address); + function getUpkeepId() external view returns (uint256); function getUpkeepAddress() external view returns (address); + function getUpkeepBalance() external view returns (uint256 upkeepBalance); } diff --git a/contracts/ethereum/src/vendor/interfaces/KeeperRegistrarInterface.sol b/contracts/ethereum/src/vendor/interfaces/KeeperRegistrarInterface.sol index 3ee63ca9d..bc87f65a3 100644 --- a/contracts/ethereum/src/vendor/interfaces/KeeperRegistrarInterface.sol +++ b/contracts/ethereum/src/vendor/interfaces/KeeperRegistrarInterface.sol @@ -1,11 +1,7 @@ -// SPDX-License-Identifier: Apache +// SPDX-License-Identifier: MIT pragma solidity 0.8.18; interface KeeperRegistrarInterface { - /***********/ - /* Structs */ - /***********/ - struct RegistrationParams { string name; bytes encryptedEmail; @@ -17,10 +13,6 @@ interface KeeperRegistrarInterface { uint96 amount; } - /*************/ - /* Functions */ - /*************/ - function registerUpkeep( RegistrationParams calldata requestParams ) external returns (uint256); diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index d833f7ead..4f377a764 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -19,7 +19,7 @@ export async function deploymentFixture() { beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, linkFunctionsAddress: process.env.LINK_FUNCTIONS_ADDRESS, linkRegistrarAddress: process.env.LINK_REGISTRAR_ADDRESS, - linkSubscriptionId: process.env.LINK_SUBSCRIPTION_ID, + linkRegistryAddress: process.env.LINK_REGISTRY_ADDRESS, linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, ssvNetworkViewsAddress: process.env.SSV_NETWORK_VIEWS_ADDRESS, diff --git a/services/oracle/src/index.ts b/services/oracle/src/index.ts index f55c8625e..eb1207579 100644 --- a/services/oracle/src/index.ts +++ b/services/oracle/src/index.ts @@ -11,7 +11,7 @@ const handlers = { DepositRequested: initiateDepositHandler, ReshareRequested: initiatePoolReshareHandler, ExitRequested: initiatePoolExitHandler, - // ForcedExitReportsRequested: reportForcedExitsHandler, + // ForcedExitReportsRequested: reportForcedExitssHandler, CompletedExitReportsRequested: reportCompletedExitsHandler } diff --git a/services/oracle/src/providers/handlers.ts b/services/oracle/src/providers/handlers.ts index a17a6800f..a558d0225 100644 --- a/services/oracle/src/providers/handlers.ts +++ b/services/oracle/src/providers/handlers.ts @@ -54,7 +54,8 @@ export async function initiateDepositHandler(input: HandlerInput) { operatorIds, shares, cluster, - requiredBalancePerValidator + requiredBalancePerValidator, + false ) await initiateDeposit.wait() } From 3dd5804478ad2818d5b7d556af741b9493f99b79 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Tue, 6 Jun 2023 00:20:47 -0400 Subject: [PATCH 51/78] Add reshare count --- contracts/ethereum/docs/index.md | 206 +++++++++++++++--- contracts/ethereum/src/CasimirManager.sol | 7 +- contracts/ethereum/src/CasimirPool.sol | 4 + .../ethereum/src/interfaces/ICasimirPool.sol | 3 + 4 files changed, 187 insertions(+), 33 deletions(-) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 1e0ef7ed1..df31ceaa5 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -2,6 +2,14 @@ ## CasimirManager +### upkeepRegistrationMinimum + +```solidity +uint256 upkeepRegistrationMinimum +``` + +Minimum balance for upkeep registration (0.1 LINK) + ### finalizableCompletedExits ```solidity @@ -26,6 +34,14 @@ modifier onlyOracle() _Validate the caller is the manager oracle_ +### onlyOracleOrUpkeep + +```solidity +modifier onlyOracleOrUpkeep() +``` + +_Validate the caller is the oracle or upkeep_ + ### onlyRegistry ```solidity @@ -75,7 +91,7 @@ _Validate a distribution_ ### constructor ```solidity -constructor(address _oracleAddress, address beaconDepositAddress, address linkFunctionsAddress, address linkRegistrarAddress, uint32 linkSubscriptionId, address linkTokenAddress, address ssvNetworkAddress, address ssvNetworkViewsAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public +constructor(address _oracleAddress, address beaconDepositAddress, address linkFunctionsAddress, address linkRegistrarAddress, address linkRegistryAddress, address linkTokenAddress, address ssvNetworkAddress, address ssvNetworkViewsAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public ``` Constructor @@ -88,7 +104,7 @@ Constructor | beaconDepositAddress | address | The Beacon deposit address | | linkFunctionsAddress | address | The Chainlink functions oracle address | | linkRegistrarAddress | address | The Chainlink keeper registrar address | -| linkSubscriptionId | uint32 | The Chainlink functions subscription ID | +| linkRegistryAddress | address | The Chainlink keeper registry address | | linkTokenAddress | address | The Chainlink token address | | ssvNetworkAddress | address | The SSV network address | | ssvNetworkViewsAddress | address | The SSV network views address | @@ -152,7 +168,7 @@ Deposit recovered balance for a given pool from an operator ### depositClusterBalance ```solidity -function depositClusterBalance(struct ISSVNetworkCore.Cluster cluster, uint256 amount) external +function depositClusterBalance(uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external ``` Deposit to a cluster balance @@ -161,22 +177,25 @@ Deposit to a cluster balance | Name | Type | Description | | ---- | ---- | ----------- | -| cluster | struct ISSVNetworkCore.Cluster | The cluster | -| amount | uint256 | The amount to deposit | +| operatorIds | uint64[] | The operator IDs | +| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | +| feeAmount | uint256 | The fee amount to deposit | +| processed | bool | Whether the fee amount is already processed | ### depositUpkeepBalance ```solidity -function depositUpkeepBalance(uint256 amount) external +function depositUpkeepBalance(uint256 feeAmount, bool processed) external ``` -Deposit upkeep balance +Deposit to the upkeep balance #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| amount | uint256 | The amount to deposit | +| feeAmount | uint256 | The fee amount to deposit | +| processed | bool | Whether the fee amount is already processed | ### depositReservedFees @@ -186,6 +205,20 @@ function depositReservedFees() external payable Deposit reserved fees +### withdrawReservedFees + +```solidity +function withdrawReservedFees(uint256 amount) external +``` + +Withdraw a given amount of reserved fees + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| amount | uint256 | The amount of fees to withdraw | + ### rebalanceStake ```solidity @@ -248,7 +281,7 @@ Fulfill a given count of pending withdrawals ### initiateDeposit ```solidity -function initiateDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount) external +function initiateDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external ``` Initiate the next ready pool @@ -263,8 +296,9 @@ Initiate the next ready pool | withdrawalCredentials | bytes | The withdrawal credentials | | operatorIds | uint64[] | The operator IDs | | shares | bytes | The operator shares | -| cluster | struct ISSVNetworkCore.Cluster | | -| feeAmount | uint256 | The fee amount | +| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | +| feeAmount | uint256 | The fee amount to deposit | +| processed | bool | | ### activateDeposits @@ -311,16 +345,16 @@ Request reports for a given count of completed exits ### reportForcedExits ```solidity -function reportForcedExits(uint32 poolId) external +function reportForcedExits(uint32[] poolIds) external ``` -Report a pool unexpected exit +Report pool forced (unrequested) exits #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | +| poolIds | uint32[] | The pool IDs | ### reportCompletedExit @@ -338,6 +372,65 @@ Report a completed exit | blamePercents | uint32[] | The operator blame percents (0 if balance is 32 ether) | | cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | +### reportReshare + +```solidity +function reportReshare(uint32 poolId, uint64[] operatorIds, uint64[] oldOperatorIds, uint64 newOperatorId, uint64 oldOperatorId, bytes shares, struct ISSVNetworkCore.Cluster cluster, struct ISSVNetworkCore.Cluster oldCluster, uint256 feeAmount, bool processed) external +``` + +Report a reshare + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolId | uint32 | The pool ID | +| operatorIds | uint64[] | The operator IDs | +| oldOperatorIds | uint64[] | The old operator IDs | +| newOperatorId | uint64 | The new operator ID | +| oldOperatorId | uint64 | The old operator ID | +| shares | bytes | The operator shares | +| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | +| oldCluster | struct ISSVNetworkCore.Cluster | The old SSV cluster snapshot | +| feeAmount | uint256 | The fee amount to deposit | +| processed | bool | Whether the fee amount is already processed | + +### withdrawUpkeepBalance + +```solidity +function withdrawUpkeepBalance() external +``` + +Cancel upkeep and withdraw the upkeep balance + +### withdrawLINKBalance + +```solidity +function withdrawLINKBalance(uint256 amount) external +``` + +Withdraw a given amount from the LINK balance + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| amount | uint256 | The amount to withdraw | + +### withdrawSSVBalance + +```solidity +function withdrawSSVBalance(uint256 amount) external +``` + +Withdraw a given amount from the SSV balance + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| amount | uint256 | The amount to withdraw | + ### setFunctionsAddress ```solidity @@ -748,6 +841,20 @@ Get the registry address | ---- | ---- | ----------- | | registryAddress | address | The registry address | +### getUpkeepId + +```solidity +function getUpkeepId() external view returns (uint256) +``` + +Get the upkeep ID + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | upkeepId The upkeep ID | + ### getUpkeepAddress ```solidity @@ -762,6 +869,20 @@ Get the upkeep address | ---- | ---- | ----------- | | upkeepAddress | address | The upkeep address | +### getUpkeepBalance + +```solidity +function getUpkeepBalance() external view returns (uint256 upkeepBalance) +``` + +Get the upkeep balance + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| upkeepBalance | uint256 | The upkeep balance | + ### getSweptBalance ```solidity @@ -882,13 +1003,13 @@ uint256 minimumCollateralDeposit uint256 totalCollateral ``` -### onlyPool +### onlyOwnerOrPool ```solidity -modifier onlyPool(uint32 poolId) +modifier onlyOwnerOrPool(uint32 poolId) ``` -_Validate the caller is the authorized pool_ +_Validate the caller is owner or the authorized pool_ ### constructor @@ -1067,7 +1188,7 @@ Fulfillment gas limit ### constructor ```solidity -constructor(address linkFunctionsAddress, address linkRegistrarAddress, uint64 _linkSubscriptionId, address linkTokenAddress) public +constructor(address linkFunctionsAddress) public ``` Constructor @@ -1077,15 +1198,6 @@ Constructor | Name | Type | Description | | ---- | ---- | ----------- | | linkFunctionsAddress | address | The functions oracle contract address | -| linkRegistrarAddress | address | The keeper registrar address | -| _linkSubscriptionId | uint64 | The functions subscription ID | -| linkTokenAddress | address | The LINK token address | - -### registerUpkeep - -```solidity -function registerUpkeep(struct KeeperRegistrarInterface.RegistrationParams params) public -``` ### generateRequest @@ -1106,7 +1218,7 @@ Generate a new Functions.Request(off-chain, saving gas) ### setRequest ```solidity -function setRequest(uint32 _fulfillGasLimit, uint64 linkSubscriptionId, bytes _requestCBOR) external +function setRequest(uint32 _fulfillGasLimit, uint64 _linkSubscriptionId, bytes _requestCBOR) external ``` Set the bytes representing the CBOR-encoded Functions.Request @@ -1116,7 +1228,7 @@ Set the bytes representing the CBOR-encoded Functions.Request | Name | Type | Description | | ---- | ---- | ----------- | | _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | -| linkSubscriptionId | uint64 | The functions billing subscription ID used to pay for Functions requests | +| _linkSubscriptionId | uint64 | The functions billing subscription ID used to pay for Functions requests | | _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | ### checkUpkeep @@ -1383,13 +1495,13 @@ function depositReservedFees() external payable ### depositClusterBalance ```solidity -function depositClusterBalance(struct ISSVNetworkCore.Cluster cluster, uint256 amount) external +function depositClusterBalance(uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external ``` ### depositUpkeepBalance ```solidity -function depositUpkeepBalance(uint256 amount) external +function depositUpkeepBalance(uint256 feeAmount, bool processed) external ``` ### rebalanceStake @@ -1419,7 +1531,7 @@ function fulfillWithdrawals(uint256 count) external ### initiateDeposit ```solidity -function initiateDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount) external +function initiateDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external ``` ### activateDeposits @@ -1446,6 +1558,24 @@ function requestCompletedExitReports(uint256 count) external function reportCompletedExit(uint256 poolIndex, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external ``` +### reportReshare + +```solidity +function reportReshare(uint32 poolId, uint64[] operatorIds, uint64[] oldOperatorIds, uint64 newOperatorId, uint64 oldOperatorId, bytes shares, struct ISSVNetworkCore.Cluster cluster, struct ISSVNetworkCore.Cluster oldCluster, uint256 feeAmount, bool processed) external +``` + +### withdrawLINKBalance + +```solidity +function withdrawLINKBalance(uint256 amount) external +``` + +### withdrawSSVBalance + +```solidity +function withdrawSSVBalance(uint256 amount) external +``` + ### setFunctionsAddress ```solidity @@ -1596,12 +1726,24 @@ function getPoolDetails(uint32 poolId) external view returns (struct ICasimirMan function getRegistryAddress() external view returns (address) ``` +### getUpkeepId + +```solidity +function getUpkeepId() external view returns (uint256) +``` + ### getUpkeepAddress ```solidity function getUpkeepAddress() external view returns (address) ``` +### getUpkeepBalance + +```solidity +function getUpkeepBalance() external view returns (uint256 upkeepBalance) +``` + ## ICasimirPool ### PoolConfig diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index c15c60da1..a07d56deb 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -902,12 +902,17 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ) external onlyOracle { ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); ICasimirPool.PoolConfig memory poolConfig = pool.getConfig(); - require( poolConfig.status == ICasimirPool.PoolStatus.PENDING || poolConfig.status == ICasimirPool.PoolStatus.ACTIVE, "Pool not active" ); + require( + poolConfig.reshares < 2, + "Pool already reshared twice" + ); + + pool.setReshares(poolConfig.reshares + 1); registry.removeOperatorPool(oldOperatorId, poolId, 0); registry.addOperatorPool(newOperatorId, poolId); diff --git a/contracts/ethereum/src/CasimirPool.sol b/contracts/ethereum/src/CasimirPool.sol index 0932b144c..8b8c073df 100644 --- a/contracts/ethereum/src/CasimirPool.sol +++ b/contracts/ethereum/src/CasimirPool.sol @@ -65,6 +65,10 @@ contract CasimirPool is ICasimirPool, Ownable, ReentrancyGuard { config.operatorIds = operatorIds; } + function setReshares(uint256 reshares) external onlyOwner { + config.reshares = reshares; + } + function setStatus(PoolStatus status) external onlyOwner { config.status = status; } diff --git a/contracts/ethereum/src/interfaces/ICasimirPool.sol b/contracts/ethereum/src/interfaces/ICasimirPool.sol index 05bc4b971..3c94e8228 100644 --- a/contracts/ethereum/src/interfaces/ICasimirPool.sol +++ b/contracts/ethereum/src/interfaces/ICasimirPool.sol @@ -11,6 +11,7 @@ interface ICasimirPool { uint32 poolId; bytes publicKey; uint64[] operatorIds; + uint256 reshares; PoolStatus status; } @@ -33,6 +34,8 @@ interface ICasimirPool { function setOperatorIds(uint64[] memory operatorIds) external; + function setReshares(uint256 reshares) external; + function setStatus(PoolStatus status) external; function getBalance() external view returns (uint256); From c9acd9925e9356105243d37deb4d1f9272760d0a Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Tue, 6 Jun 2023 11:02:10 -0400 Subject: [PATCH 52/78] Restrict count of per-user daily actions --- contracts/ethereum/docs/index.md | 43 ++++++--------- contracts/ethereum/hardhat.config.ts | 5 -- contracts/ethereum/package.json | 2 - contracts/ethereum/scripts/deploy.ts | 0 contracts/ethereum/scripts/ganache.ts | 33 ------------ contracts/ethereum/src/CasimirManager.sol | 53 +++++++++++++++---- .../{CasimirDAO.sol => CasimirMultisig.sol} | 52 ++++++++++-------- .../src/interfaces/ICasimirManager.sol | 2 + .../{ICasimirDAO.sol => ICasimirMultisig.sol} | 10 ++-- package.json | 4 +- scripts/ethereum/dev.ts | 22 ++------ 11 files changed, 104 insertions(+), 122 deletions(-) create mode 100644 contracts/ethereum/scripts/deploy.ts delete mode 100644 contracts/ethereum/scripts/ganache.ts rename contracts/ethereum/src/{CasimirDAO.sol => CasimirMultisig.sol} (87%) rename contracts/ethereum/src/interfaces/{ICasimirDAO.sol => ICasimirMultisig.sol} (93%) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index df31ceaa5..bc9a2aaf0 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -947,6 +947,12 @@ function withdrawBalance(uint32[] blamePercents) external function setOperatorIds(uint64[] operatorIds) external ``` +### setReshares + +```solidity +function setReshares(uint256 reshares) external +``` + ### setStatus ```solidity @@ -1753,6 +1759,7 @@ struct PoolConfig { uint32 poolId; bytes publicKey; uint64[] operatorIds; + uint256 reshares; enum ICasimirPool.PoolStatus status; } ``` @@ -1787,6 +1794,12 @@ function withdrawBalance(uint32[] blamePercents) external function setOperatorIds(uint64[] operatorIds) external ``` +### setReshares + +```solidity +function setReshares(uint256 reshares) external +``` + ### setStatus ```solidity @@ -2152,7 +2165,7 @@ struct RegistrationParams { function registerUpkeep(struct KeeperRegistrarInterface.RegistrationParams requestParams) external returns (uint256) ``` -## CasimirDAO +## CasimirMultisig ### owners @@ -2187,13 +2200,13 @@ mapping(uint256 => mapping(address => bool)) isTransactionConfirmed ### ownerChanges ```solidity -struct ICasimirDAO.OwnerChange[] ownerChanges +struct ICasimirMultisig.OwnerChange[] ownerChanges ``` ### transactions ```solidity -struct ICasimirDAO.Transaction[] transactions +struct ICasimirMultisig.Transaction[] transactions ``` ### onlyOwner @@ -2328,7 +2341,7 @@ function getTransactionCount() public view returns (uint256) function getTransaction(uint256 transactionIndex) public view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) ``` -## ICasimirDAO +## ICasimirMultisig ### Deposit @@ -2491,28 +2504,6 @@ function getTransactionCount() external view returns (uint256) function getTransaction(uint256 transactionIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) ``` -## CasimirRecipient - -### manager - -```solidity -contract ICasimirManager manager -``` - -### constructor - -```solidity -constructor() public -``` - -### receive - -```solidity -receive() external payable -``` - -## ICasimirRecipient - ## MockFunctionsOracle ### constructor diff --git a/contracts/ethereum/hardhat.config.ts b/contracts/ethereum/hardhat.config.ts index 7b3c90264..3c9ac9876 100644 --- a/contracts/ethereum/hardhat.config.ts +++ b/contracts/ethereum/hardhat.config.ts @@ -97,11 +97,6 @@ const config: HardhatUserConfig = { gas: 'auto', gasPrice: 'auto' }, - ganache: { - accounts: mnemonic ? hid : undefined, - url: 'http://127.0.0.1:8545', - allowUnlimitedContractSize: true - }, mainnet: { accounts: mnemonic ? hid : undefined, url: hardhatUrl || '', diff --git a/contracts/ethereum/package.json b/contracts/ethereum/package.json index 254353cd4..0a038926e 100644 --- a/contracts/ethereum/package.json +++ b/contracts/ethereum/package.json @@ -2,7 +2,6 @@ "name": "@casimir/ethereum", "scripts": { "node": "npx hardhat node", - "node:ganache": "npx esno scripts/ganache.ts", "dev": "npx hardhat run scripts/dev.ts", "docgen": "npx hardhat docgen", "test": "npx esno scripts/test.ts --clean \"$npm_config_clean\"", @@ -29,7 +28,6 @@ "@types/node": "^17.0.45", "chai": "^4.3.6", "esno": "^0.16.3", - "ganache": "^7.8.0", "hardhat": "^2.12.2", "localtunnel": "^2.0.2", "minimist": "^1.2.8", diff --git a/contracts/ethereum/scripts/deploy.ts b/contracts/ethereum/scripts/deploy.ts new file mode 100644 index 000000000..e69de29bb diff --git a/contracts/ethereum/scripts/ganache.ts b/contracts/ethereum/scripts/ganache.ts deleted file mode 100644 index cd1b5a9a5..000000000 --- a/contracts/ethereum/scripts/ganache.ts +++ /dev/null @@ -1,33 +0,0 @@ -import ganache from 'ganache' - -// Seed is provided -const mnemonic = process.env.BIP39_SEED as string - -// Mining interval is provided -const miningInterval = parseInt(process.env.MINING_INTERVAL as string) -const mining = { - blockTime: miningInterval, - defaultTransactionGasLimit: 'estimate' -} - -// Local network fork rpc is provided -const forkingUrl = process.env.ETHEREUM_FORKING_URL as string -const forkingNetwork = forkingUrl?.includes('mainnet') ? 'mainnet' : 'goerli' -const forkingChainId = { mainnet: 1, goerli: 5 }[forkingNetwork] - -const options = { - mnemonic, - fork: forkingUrl ? { url: forkingUrl } : undefined, - allowUnlimitedContractSize: true, - totalAccounts: 5, - defaultBalanceEther: 96, - chain: { - chainId: forkingChainId || 1337 - }, - miner: miningInterval ? mining : undefined -} -const server = ganache.server(options) -const port = 8545 -server.listen(port, async () => { - console.log(`Ganache listening on port ${port}`) -}) diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/CasimirManager.sol index a07d56deb..38e82f976 100644 --- a/contracts/ethereum/src/CasimirManager.sol +++ b/contracts/ethereum/src/CasimirManager.sol @@ -46,6 +46,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /* Constants */ /*************/ + /** User action period */ + uint256 public constant actionPeriod = 1 days; + /** Max user actions per period */ + uint256 public constant maxActionsPerPeriod = 5; /** Compound minimum (0.1 ETH) */ uint256 private constant compoundMinimum = 100000000 gwei; /** Minimum balance for upkeep registration (0.1 LINK) */ @@ -208,6 +212,20 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { _; } + /** + * @dev Validate a user action + */ + modifier validAction() { + User storage user = users[msg.sender]; + require( + user.actionPeriodTimestamp == 0 || + user.actionCount < maxActionsPerPeriod || + block.timestamp >= user.actionPeriodTimestamp + actionPeriod, + "User action period not elapsed" + ); + _; + } + /** * @dev Validate a deposit */ @@ -298,15 +316,23 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Deposit user stake */ - function depositStake() external payable nonReentrant validDeposit { + function depositStake() external payable nonReentrant validAction validDeposit { + User storage user = users[msg.sender]; + if (block.timestamp >= user.actionPeriodTimestamp + actionPeriod) { + user.actionPeriodTimestamp = block.timestamp; + user.actionCount = 1; + } else { + user.actionCount++; + } + uint256 depositAfterFees = subtractFees(msg.value); reservedFeeBalance += msg.value - depositAfterFees; - if (users[msg.sender].stake0 > 0) { - users[msg.sender].stake0 = getUserStake(msg.sender); + if (user.stake0 > 0) { + user.stake0 = getUserStake(msg.sender); } - users[msg.sender].stakeRatioSum0 = stakeRatioSum; - users[msg.sender].stake0 += depositAfterFees; + user.stakeRatioSum0 = stakeRatioSum; + user.stake0 += depositAfterFees; distributeStake(depositAfterFees); @@ -541,15 +567,22 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function requestWithdrawal( uint256 amount - ) external nonReentrant validWithdrawal(amount) { - users[msg.sender].stake0 = getUserStake(msg.sender); + ) external nonReentrant validAction validWithdrawal(amount) { + User storage user = users[msg.sender]; + if (block.timestamp >= user.actionPeriodTimestamp + actionPeriod) { + user.actionPeriodTimestamp = block.timestamp; + user.actionCount = 1; + } else { + user.actionCount++; + } + user.stake0 = getUserStake(msg.sender); require( - users[msg.sender].stake0 >= amount, + user.stake0 >= amount, "Withdrawing more than user stake" ); - users[msg.sender].stakeRatioSum0 = stakeRatioSum; - users[msg.sender].stake0 -= amount; + user.stakeRatioSum0 = stakeRatioSum; + user.stake0 -= amount; if (amount <= getWithdrawableBalance()) { fulfillWithdrawal(msg.sender, amount); diff --git a/contracts/ethereum/src/CasimirDAO.sol b/contracts/ethereum/src/CasimirMultisig.sol similarity index 87% rename from contracts/ethereum/src/CasimirDAO.sol rename to contracts/ethereum/src/CasimirMultisig.sol index ae6a71754..2c59fa7e6 100644 --- a/contracts/ethereum/src/CasimirDAO.sol +++ b/contracts/ethereum/src/CasimirMultisig.sol @@ -1,12 +1,12 @@ // SPDX-License-Identifier: Apache pragma solidity 0.8.18; -import './interfaces/ICasimirDAO.sol'; +import './interfaces/ICasimirMultisig.sol'; -contract CasimirDAO is ICasimirDAO { +contract CasimirMultisig is ICasimirMultisig { address[] public owners; mapping(address => bool) public isOwner; - uint public numConfirmationsRequired; + uint public confirmationsRequired; mapping(uint => mapping(address => bool)) public isOwnerChangeConfirmed; mapping(uint => mapping(address => bool)) public isTransactionConfirmed; @@ -64,13 +64,8 @@ contract CasimirDAO is ICasimirDAO { _; } - constructor(address[] memory _owners, uint256 _numConfirmationsRequired) { + constructor(address[] memory _owners) { require(_owners.length > 0, "Owners required"); - require( - _numConfirmationsRequired > 0 && - _numConfirmationsRequired <= _owners.length, - "Invalid number of required confirmations" - ); for (uint256 i = 0; i < _owners.length; i++) { address owner = _owners[i]; @@ -82,7 +77,7 @@ contract CasimirDAO is ICasimirDAO { owners.push(owner); } - numConfirmationsRequired = _numConfirmationsRequired; + adjustConfirmationsRequired(); } receive() external payable { @@ -97,7 +92,7 @@ contract CasimirDAO is ICasimirDAO { owner: owner, add: add, executed: false, - numConfirmations: 0 + confirmations: 0 }) ); @@ -114,7 +109,7 @@ contract CasimirDAO is ICasimirDAO { ownerChangeNotConfirmed(changeId) { OwnerChange storage ownerChange = ownerChanges[changeId]; - ownerChange.numConfirmations += 1; + ownerChange.confirmations += 1; isOwnerChangeConfirmed[changeId][msg.sender] = true; emit ConfirmOwnerChange(msg.sender, changeId); @@ -131,7 +126,7 @@ contract CasimirDAO is ICasimirDAO { OwnerChange storage ownerChange = ownerChanges[changeId]; require( - ownerChange.numConfirmations >= numConfirmationsRequired, + ownerChange.confirmations >= confirmationsRequired, "Cannot execute owner change" ); @@ -152,6 +147,8 @@ contract CasimirDAO is ICasimirDAO { owners.pop(); } + adjustConfirmationsRequired(); + emit ExecuteOwnerChange(msg.sender, changeId); } @@ -170,7 +167,7 @@ contract CasimirDAO is ICasimirDAO { "Owner change not confirmed" ); - ownerChange.numConfirmations -= 1; + ownerChange.confirmations -= 1; isOwnerChangeConfirmed[changeId][msg.sender] = false; emit RevokeOwnerChangeConfirmation(msg.sender, changeId); @@ -189,7 +186,7 @@ contract CasimirDAO is ICasimirDAO { value: value, data: data, executed: false, - numConfirmations: 0 + confirmations: 0 }) ); @@ -206,7 +203,7 @@ contract CasimirDAO is ICasimirDAO { transactionNotConfirmed(transactionIndex) { Transaction storage transaction = transactions[transactionIndex]; - transaction.numConfirmations += 1; + transaction.confirmations += 1; isTransactionConfirmed[transactionIndex][msg.sender] = true; emit ConfirmTransaction(msg.sender, transactionIndex); @@ -223,7 +220,7 @@ contract CasimirDAO is ICasimirDAO { Transaction storage transaction = transactions[transactionIndex]; require( - transaction.numConfirmations >= numConfirmationsRequired, + transaction.confirmations >= confirmationsRequired, "Cannot execute Transaction" ); @@ -252,12 +249,23 @@ contract CasimirDAO is ICasimirDAO { "Transaction not confirmed" ); - transaction.numConfirmations -= 1; + transaction.confirmations -= 1; isTransactionConfirmed[transactionIndex][msg.sender] = false; emit RevokeTransactionConfirmation(msg.sender, transactionIndex); } + function adjustConfirmationsRequired() internal { + uint ownerCount = owners.length; + if (ownerCount == 1 || ownerCount == 2) { + confirmationsRequired = 1; + } else if (ownerCount == 3) { + confirmationsRequired = 2; + } else { + confirmationsRequired = (ownerCount * 2) / 3; + } + } + function getOwners() public view returns (address[] memory) { return owners; } @@ -275,7 +283,7 @@ contract CasimirDAO is ICasimirDAO { address owner, bool add, bool executed, - uint256 numConfirmations + uint256 confirmations ) { OwnerChange storage ownerChange = ownerChanges[changeId]; @@ -283,7 +291,7 @@ contract CasimirDAO is ICasimirDAO { ownerChange.owner, ownerChange.add, ownerChange.executed, - ownerChange.numConfirmations + ownerChange.confirmations ); } @@ -301,7 +309,7 @@ contract CasimirDAO is ICasimirDAO { uint256 value, bytes memory data, bool executed, - uint256 numConfirmations + uint256 confirmations ) { Transaction storage transaction = transactions[transactionIndex]; @@ -310,7 +318,7 @@ contract CasimirDAO is ICasimirDAO { transaction.value, transaction.data, transaction.executed, - transaction.numConfirmations + transaction.confirmations ); } } \ No newline at end of file diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/interfaces/ICasimirManager.sol index ab2d619be..cc59e672b 100644 --- a/contracts/ethereum/src/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/interfaces/ICasimirManager.sol @@ -31,6 +31,8 @@ interface ICasimirManager { struct User { uint256 stake0; uint256 stakeRatioSum0; + uint256 actionPeriodTimestamp; + uint256 actionCount; } struct Withdrawal { diff --git a/contracts/ethereum/src/interfaces/ICasimirDAO.sol b/contracts/ethereum/src/interfaces/ICasimirMultisig.sol similarity index 93% rename from contracts/ethereum/src/interfaces/ICasimirDAO.sol rename to contracts/ethereum/src/interfaces/ICasimirMultisig.sol index 62f223af7..6d5df7e44 100644 --- a/contracts/ethereum/src/interfaces/ICasimirDAO.sol +++ b/contracts/ethereum/src/interfaces/ICasimirMultisig.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache pragma solidity 0.8.18; -interface ICasimirDAO { +interface ICasimirMultisig { event Deposit(address indexed sender, uint amount, uint balance); event SubmitOwnerChange( address indexed owner, @@ -26,7 +26,7 @@ interface ICasimirDAO { address owner; bool add; bool executed; - uint numConfirmations; + uint confirmations; } struct Transaction { @@ -34,7 +34,7 @@ interface ICasimirDAO { uint value; bytes data; bool executed; - uint numConfirmations; + uint confirmations; } receive() external payable; @@ -87,7 +87,7 @@ interface ICasimirDAO { address owner, bool add, bool executed, - uint256 numConfirmations + uint256 confirmations ); function getTransactionCount() external view returns (uint256); @@ -102,6 +102,6 @@ interface ICasimirDAO { uint256 value, bytes memory data, bool executed, - uint256 numConfirmations + uint256 confirmations ); } \ No newline at end of file diff --git a/package.json b/package.json index 762266189..704f18567 100644 --- a/package.json +++ b/package.json @@ -13,9 +13,9 @@ "clean": "npm exec --workspaces -- npx rimraf node_modules dist && npx rimraf node_modules package-lock.json && npm i", "curl": "curl -H 'Content-Type: application/json' -d \"$npm_config_body\" \"$npm_config_url\"", "deploy:cdk": "npx esno -r dotenv/config scripts/cdk/deploy.ts", - "dev": "npx esno -r dotenv/config scripts/local/dev.ts --app \"$npm_config_app\" --clean \"$npm_config_clean\" --emulate \"$npm_config_emulate\" --fork \"$npm_config_fork\" --mock \"$npm_config_mock\" --network \"$npm_config_network\" --simulation \"$npm_config_simulation\"", + "dev": "npx esno -r dotenv/config scripts/local/dev.ts --app \"$npm_config_app\" --clean \"$npm_config_clean\" --emulate \"$npm_config_emulate\" --fork \"$npm_config_fork\" --mock \"$npm_config_mock\" --network \"$npm_config_network\"", "dev:crawler": "scripts/crawler/dev -c \"$npm_config_chains\" -f \"$npm_config_fork\" -n \"$npm_config_network\" -u \"$npm_config_upload\"", - "dev:ethereum": "npx esno -r dotenv/config scripts/ethereum/dev.ts --clean \"$npm_config_clean\" --execution \"$npm_config_execution\" --fork \"$npm_config_fork\" --simulation \"$npm_config_simulation\"", + "dev:ethereum": "npx esno -r dotenv/config scripts/ethereum/dev.ts --clean \"$npm_config_clean\" --fork \"$npm_config_fork\"", "dev:landing": "npm run dev --workspace @casimir/landing", "dev:ssv": "scripts/ssv/dev -n \"$npm_config_nodes\"", "docgen": "npm run docgen --workspace @casimir/ethereum", diff --git a/scripts/ethereum/dev.ts b/scripts/ethereum/dev.ts index 5a599c637..ed555009a 100644 --- a/scripts/ethereum/dev.ts +++ b/scripts/ethereum/dev.ts @@ -7,7 +7,6 @@ import minimist from 'minimist' * * Arguments: * --clean: whether to clean build directory (override default true) - * --execution: hardhat or gananche (override default hardhat) * --fork: mainnet, goerli, true, or false (override default goerli) * --mock: whether to use mock contracts (override default true) * @@ -31,9 +30,6 @@ void async function () { /** Default to clean services and data */ const clean = argv.clean !== 'false' || argv.clean !== false - /** Set execution environment */ - const execution = argv.execution === 'ganache' ? 'ganache' : 'hardhat' - /** Set fork rpc if requested, default fork to goerli if set vaguely or unset */ const fork = argv.fork === 'true' ? 'goerli' : argv.fork === 'false' ? false : argv.fork ? argv.fork : 'goerli' @@ -66,19 +62,11 @@ void async function () { /** Set mock */ process.env.MOCK_EXTERNAL_CONTRACTS = `${mock}` - if (execution === 'ganache') { - $`npm run node:ganache --workspace @casimir/ethereum` - // Wait for ganache to start - const ganacheWaitTime = 5000 - await new Promise(resolve => setTimeout(resolve, ganacheWaitTime)) - $`npm run dev --workspace @casimir/ethereum -- --network ganache` - } else { - $`npm run node --workspace @casimir/ethereum` - // Wait for hardhat to start - const hardhatWaitTime = 2500 - await new Promise(resolve => setTimeout(resolve, hardhatWaitTime)) - $`npm run dev --workspace @casimir/ethereum -- --network localhost` - } + $`npm run node --workspace @casimir/ethereum` + // Wait for hardhat to start + const hardhatWaitTime = 2500 + await new Promise(resolve => setTimeout(resolve, hardhatWaitTime)) + $`npm run dev --workspace @casimir/ethereum -- --network localhost` /** Start local oracle */ process.env.ETHEREUM_RPC_URL = 'http://localhost:8545' From 41ac57a437fcdcee0f8a7f92f35b9fde180cb92d Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Tue, 6 Jun 2023 12:00:26 -0400 Subject: [PATCH 53/78] Move contract source to v1 --- apps/web/src/composables/ssv.ts | 2 +- contracts/ethereum/docs/index.md | 710 ++++++++++++------ .../ethereum/src/{ => v1}/CasimirManager.sol | 0 .../ethereum/src/{ => v1}/CasimirMultisig.sol | 0 .../ethereum/src/{ => v1}/CasimirPool.sol | 0 .../ethereum/src/{ => v1}/CasimirRegistry.sol | 0 .../ethereum/src/{ => v1}/CasimirUpkeep.sol | 0 .../{ => v1}/interfaces/ICasimirManager.sol | 0 .../{ => v1}/interfaces/ICasimirMultisig.sol | 0 .../src/{ => v1}/interfaces/ICasimirPool.sol | 0 .../{ => v1}/interfaces/ICasimirRegistry.sol | 0 .../{ => v1}/interfaces/ICasimirUpkeep.sol | 0 .../ethereum/src/{ => v1}/libraries/Types.sol | 0 .../src/{ => v1}/mock/MockFunctionsOracle.sol | 0 .../vendor/interfaces/IDepositContract.sol | 0 .../src/v1/vendor/interfaces/ISSVNetwork.sol | 4 + .../v1/vendor/interfaces/ISSVNetworkCore.sol | 4 + .../v1/vendor/interfaces/ISSVNetworkViews.sol | 4 + .../src/{ => v1}/vendor/interfaces/IWETH9.sol | 0 .../interfaces/KeeperRegistrarInterface.sol | 0 .../src/vendor/interfaces/ISSVNetwork.sol | 4 - .../src/vendor/interfaces/ISSVNetworkCore.sol | 4 - .../vendor/interfaces/ISSVNetworkViews.sol | 4 - services/oracle/src/providers/config.ts | 2 +- 24 files changed, 486 insertions(+), 252 deletions(-) rename contracts/ethereum/src/{ => v1}/CasimirManager.sol (100%) rename contracts/ethereum/src/{ => v1}/CasimirMultisig.sol (100%) rename contracts/ethereum/src/{ => v1}/CasimirPool.sol (100%) rename contracts/ethereum/src/{ => v1}/CasimirRegistry.sol (100%) rename contracts/ethereum/src/{ => v1}/CasimirUpkeep.sol (100%) rename contracts/ethereum/src/{ => v1}/interfaces/ICasimirManager.sol (100%) rename contracts/ethereum/src/{ => v1}/interfaces/ICasimirMultisig.sol (100%) rename contracts/ethereum/src/{ => v1}/interfaces/ICasimirPool.sol (100%) rename contracts/ethereum/src/{ => v1}/interfaces/ICasimirRegistry.sol (100%) rename contracts/ethereum/src/{ => v1}/interfaces/ICasimirUpkeep.sol (100%) rename contracts/ethereum/src/{ => v1}/libraries/Types.sol (100%) rename contracts/ethereum/src/{ => v1}/mock/MockFunctionsOracle.sol (100%) rename contracts/ethereum/src/{ => v1}/vendor/interfaces/IDepositContract.sol (100%) create mode 100644 contracts/ethereum/src/v1/vendor/interfaces/ISSVNetwork.sol create mode 100644 contracts/ethereum/src/v1/vendor/interfaces/ISSVNetworkCore.sol create mode 100644 contracts/ethereum/src/v1/vendor/interfaces/ISSVNetworkViews.sol rename contracts/ethereum/src/{ => v1}/vendor/interfaces/IWETH9.sol (100%) rename contracts/ethereum/src/{ => v1}/vendor/interfaces/KeeperRegistrarInterface.sol (100%) delete mode 100644 contracts/ethereum/src/vendor/interfaces/ISSVNetwork.sol delete mode 100644 contracts/ethereum/src/vendor/interfaces/ISSVNetworkCore.sol delete mode 100644 contracts/ethereum/src/vendor/interfaces/ISSVNetworkViews.sol diff --git a/apps/web/src/composables/ssv.ts b/apps/web/src/composables/ssv.ts index df8cc7852..48f525c6e 100644 --- a/apps/web/src/composables/ssv.ts +++ b/apps/web/src/composables/ssv.ts @@ -1,6 +1,6 @@ import { ethers } from 'ethers' import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' -import { abi } from '@casimir/ethereum/build/artifacts/src/CasimirManager.sol/CasimirManager.json' +import { abi } from '@casimir/ethereum/build/artifacts/src/v1/CasimirManager.sol/CasimirManager.json' import useEnvironment from './environment' import useUsers from './users' import useEthers from './ethers' diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index bc9a2aaf0..e723d5b07 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -2,6 +2,22 @@ ## CasimirManager +### actionPeriod + +```solidity +uint256 actionPeriod +``` + +User action period + +### maxActionsPerPeriod + +```solidity +uint256 maxActionsPerPeriod +``` + +Max user actions per period + ### upkeepRegistrationMinimum ```solidity @@ -58,6 +74,14 @@ modifier onlyUpkeep() _Validate the caller is the upkeep contract_ +### validAction + +```solidity +modifier validAction() +``` + +_Validate a user action_ + ### validDeposit ```solidity @@ -915,6 +939,188 @@ _Should be called off-chain_ | ---- | ---- | ----------- | | poolIds | uint32[5] | The next five compoundable pool IDs | +## CasimirMultisig + +### owners + +```solidity +address[] owners +``` + +### isOwner + +```solidity +mapping(address => bool) isOwner +``` + +### confirmationsRequired + +```solidity +uint256 confirmationsRequired +``` + +### isOwnerChangeConfirmed + +```solidity +mapping(uint256 => mapping(address => bool)) isOwnerChangeConfirmed +``` + +### isTransactionConfirmed + +```solidity +mapping(uint256 => mapping(address => bool)) isTransactionConfirmed +``` + +### ownerChanges + +```solidity +struct ICasimirMultisig.OwnerChange[] ownerChanges +``` + +### transactions + +```solidity +struct ICasimirMultisig.Transaction[] transactions +``` + +### onlyOwner + +```solidity +modifier onlyOwner() +``` + +### ownerChangeExists + +```solidity +modifier ownerChangeExists(uint256 changeId) +``` + +### ownerChangeNotExecuted + +```solidity +modifier ownerChangeNotExecuted(uint256 changeId) +``` + +### ownerChangeNotConfirmed + +```solidity +modifier ownerChangeNotConfirmed(uint256 changeId) +``` + +### transactionExists + +```solidity +modifier transactionExists(uint256 transactionIndex) +``` + +### transactionNotExecuted + +```solidity +modifier transactionNotExecuted(uint256 transactionIndex) +``` + +### transactionNotConfirmed + +```solidity +modifier transactionNotConfirmed(uint256 transactionIndex) +``` + +### constructor + +```solidity +constructor(address[] _owners) public +``` + +### receive + +```solidity +receive() external payable +``` + +### submitOwnerChange + +```solidity +function submitOwnerChange(address owner, bool add) public +``` + +### confirmOwnerChange + +```solidity +function confirmOwnerChange(uint256 changeId) public +``` + +### executeOwnerChange + +```solidity +function executeOwnerChange(uint256 changeId) public +``` + +### revokeOwnerChangeConfirmation + +```solidity +function revokeOwnerChangeConfirmation(uint256 changeId) public +``` + +### submitTransaction + +```solidity +function submitTransaction(address to, uint256 value, bytes data) public +``` + +### confirmTransaction + +```solidity +function confirmTransaction(uint256 transactionIndex) public +``` + +### executeTransaction + +```solidity +function executeTransaction(uint256 transactionIndex) public +``` + +### revokeTransactionConfirmation + +```solidity +function revokeTransactionConfirmation(uint256 transactionIndex) public +``` + +### adjustConfirmationsRequired + +```solidity +function adjustConfirmationsRequired() internal +``` + +### getOwners + +```solidity +function getOwners() public view returns (address[]) +``` + +### getOwnerChangeCount + +```solidity +function getOwnerChangeCount() public view returns (uint256) +``` + +### getOwnerChange + +```solidity +function getOwnerChange(uint256 changeId) public view returns (address owner, bool add, bool executed, uint256 confirmations) +``` + +### getTransactionCount + +```solidity +function getTransactionCount() public view returns (uint256) +``` + +### getTransaction + +```solidity +function getTransaction(uint256 transactionIndex) public view returns (address to, uint256 value, bytes data, bool executed, uint256 confirmations) +``` + ## CasimirPool ### poolCapacity @@ -1353,6 +1559,8 @@ struct PoolDetails { struct User { uint256 stake0; uint256 stakeRatioSum0; + uint256 actionPeriodTimestamp; + uint256 actionCount; } ``` @@ -1750,87 +1958,250 @@ function getUpkeepAddress() external view returns (address) function getUpkeepBalance() external view returns (uint256 upkeepBalance) ``` -## ICasimirPool - -### PoolConfig - -```solidity -struct PoolConfig { - uint32 poolId; - bytes publicKey; - uint64[] operatorIds; - uint256 reshares; - enum ICasimirPool.PoolStatus status; -} -``` +## ICasimirMultisig -### PoolStatus +### Deposit ```solidity -enum PoolStatus { - PENDING, - ACTIVE, - EXITING_FORCED, - EXITING_REQUESTED, - WITHDRAWN -} +event Deposit(address sender, uint256 amount, uint256 balance) ``` -### depositRewards +### SubmitOwnerChange ```solidity -function depositRewards() external +event SubmitOwnerChange(address owner, uint256 changeId, bool add) ``` -### withdrawBalance +### ConfirmOwnerChange ```solidity -function withdrawBalance(uint32[] blamePercents) external +event ConfirmOwnerChange(address owner, uint256 changeId) ``` -### setOperatorIds +### RevokeOwnerChangeConfirmation ```solidity -function setOperatorIds(uint64[] operatorIds) external +event RevokeOwnerChangeConfirmation(address owner, uint256 changeId) ``` -### setReshares +### ExecuteOwnerChange ```solidity -function setReshares(uint256 reshares) external +event ExecuteOwnerChange(address owner, uint256 changeId) ``` -### setStatus +### SubmitTransaction ```solidity -function setStatus(enum ICasimirPool.PoolStatus status) external +event SubmitTransaction(address owner, uint256 txIndex, address to, uint256 value, bytes data) ``` -### getBalance +### ConfirmTransaction ```solidity -function getBalance() external view returns (uint256) +event ConfirmTransaction(address owner, uint256 txIndex) ``` -### getConfig +### RevokeTransactionConfirmation ```solidity -function getConfig() external view returns (struct ICasimirPool.PoolConfig) +event RevokeTransactionConfirmation(address owner, uint256 txIndex) ``` -### getOperatorIds +### ExecuteTransaction ```solidity -function getOperatorIds() external view returns (uint64[]) +event ExecuteTransaction(address owner, uint256 txIndex) ``` -### getPublicKey +### OwnerChange ```solidity -function getPublicKey() external view returns (bytes) +struct OwnerChange { + address owner; + bool add; + bool executed; + uint256 confirmations; +} ``` -### getStatus +### Transaction + +```solidity +struct Transaction { + address to; + uint256 value; + bytes data; + bool executed; + uint256 confirmations; +} +``` + +### receive + +```solidity +receive() external payable +``` + +### submitOwnerChange + +```solidity +function submitOwnerChange(address owner, bool add) external +``` + +### confirmOwnerChange + +```solidity +function confirmOwnerChange(uint256 changeId) external +``` + +### executeOwnerChange + +```solidity +function executeOwnerChange(uint256 changeId) external +``` + +### revokeOwnerChangeConfirmation + +```solidity +function revokeOwnerChangeConfirmation(uint256 changeId) external +``` + +### submitTransaction + +```solidity +function submitTransaction(address to, uint256 value, bytes data) external +``` + +### confirmTransaction + +```solidity +function confirmTransaction(uint256 transactionIndex) external +``` + +### executeTransaction + +```solidity +function executeTransaction(uint256 transactionIndex) external +``` + +### revokeTransactionConfirmation + +```solidity +function revokeTransactionConfirmation(uint256 transactionIndex) external +``` + +### getOwners + +```solidity +function getOwners() external view returns (address[]) +``` + +### getOwnerChangeCount + +```solidity +function getOwnerChangeCount() external view returns (uint256) +``` + +### getOwnerChange + +```solidity +function getOwnerChange(uint256 changeId) external view returns (address owner, bool add, bool executed, uint256 confirmations) +``` + +### getTransactionCount + +```solidity +function getTransactionCount() external view returns (uint256) +``` + +### getTransaction + +```solidity +function getTransaction(uint256 transactionIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 confirmations) +``` + +## ICasimirPool + +### PoolConfig + +```solidity +struct PoolConfig { + uint32 poolId; + bytes publicKey; + uint64[] operatorIds; + uint256 reshares; + enum ICasimirPool.PoolStatus status; +} +``` + +### PoolStatus + +```solidity +enum PoolStatus { + PENDING, + ACTIVE, + EXITING_FORCED, + EXITING_REQUESTED, + WITHDRAWN +} +``` + +### depositRewards + +```solidity +function depositRewards() external +``` + +### withdrawBalance + +```solidity +function withdrawBalance(uint32[] blamePercents) external +``` + +### setOperatorIds + +```solidity +function setOperatorIds(uint64[] operatorIds) external +``` + +### setReshares + +```solidity +function setReshares(uint256 reshares) external +``` + +### setStatus + +```solidity +function setStatus(enum ICasimirPool.PoolStatus status) external +``` + +### getBalance + +```solidity +function getBalance() external view returns (uint256) +``` + +### getConfig + +```solidity +function getConfig() external view returns (struct ICasimirPool.PoolConfig) +``` + +### getOperatorIds + +```solidity +function getOperatorIds() external view returns (uint64[]) +``` + +### getPublicKey + +```solidity +function getPublicKey() external view returns (bytes) +``` + +### getStatus ```solidity function getStatus() external view returns (enum ICasimirPool.PoolStatus) @@ -2165,150 +2536,140 @@ struct RegistrationParams { function registerUpkeep(struct KeeperRegistrarInterface.RegistrationParams requestParams) external returns (uint256) ``` -## CasimirMultisig - -### owners - -```solidity -address[] owners -``` +## MockFunctionsOracle -### isOwner +### constructor ```solidity -mapping(address => bool) isOwner +constructor() public ``` -### numConfirmationsRequired +### getRegistry ```solidity -uint256 numConfirmationsRequired +function getRegistry() external view returns (address) ``` -### isOwnerChangeConfirmed - -```solidity -mapping(uint256 => mapping(address => bool)) isOwnerChangeConfirmed -``` +Returns the address of the registry contract -### isTransactionConfirmed +#### Return Values -```solidity -mapping(uint256 => mapping(address => bool)) isTransactionConfirmed -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | address | address The address of the registry contract | -### ownerChanges +### sendRequest ```solidity -struct ICasimirMultisig.OwnerChange[] ownerChanges +function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) ``` -### transactions +Sends a request (encoded as data) using the provided subscriptionId -```solidity -struct ICasimirMultisig.Transaction[] transactions -``` +#### Parameters -### onlyOwner +| Name | Type | Description | +| ---- | ---- | ----------- | +| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | +| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| _gasLimit | uint32 | Gas limit for the fulfillment callback | -```solidity -modifier onlyOwner() -``` +#### Return Values -### ownerChangeExists +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | A unique request identifier (unique per DON) | -```solidity -modifier ownerChangeExists(uint256 changeId) -``` +## CasimirDAO -### ownerChangeNotExecuted +### owners ```solidity -modifier ownerChangeNotExecuted(uint256 changeId) +address[] owners ``` -### ownerChangeNotConfirmed +### isOwner ```solidity -modifier ownerChangeNotConfirmed(uint256 changeId) +mapping(address => bool) isOwner ``` -### transactionExists +### numConfirmationsRequired ```solidity -modifier transactionExists(uint256 transactionIndex) +uint256 numConfirmationsRequired ``` -### transactionNotExecuted +### isConfirmed ```solidity -modifier transactionNotExecuted(uint256 transactionIndex) +mapping(uint256 => mapping(address => bool)) isConfirmed ``` -### transactionNotConfirmed +### transactions ```solidity -modifier transactionNotConfirmed(uint256 transactionIndex) +struct ICasimirDAO.Transaction[] transactions ``` -### constructor +### onlyOwner ```solidity -constructor(address[] _owners, uint256 _numConfirmationsRequired) public +modifier onlyOwner() ``` -### receive +### txExists ```solidity -receive() external payable +modifier txExists(uint256 _txIndex) ``` -### submitOwnerChange +### notExecuted ```solidity -function submitOwnerChange(address owner, bool add) public +modifier notExecuted(uint256 _txIndex) ``` -### confirmOwnerChange +### notConfirmed ```solidity -function confirmOwnerChange(uint256 changeId) public +modifier notConfirmed(uint256 _txIndex) ``` -### executeOwnerChange +### constructor ```solidity -function executeOwnerChange(uint256 changeId) public +constructor(address[] _owners, uint256 _numConfirmationsRequired) public ``` -### revokeOwnerChangeConfirmation +### receive ```solidity -function revokeOwnerChangeConfirmation(uint256 changeId) public +receive() external payable ``` ### submitTransaction ```solidity -function submitTransaction(address to, uint256 value, bytes data) public +function submitTransaction(address _to, uint256 _value, bytes _data) public ``` ### confirmTransaction ```solidity -function confirmTransaction(uint256 transactionIndex) public +function confirmTransaction(uint256 _txIndex) public ``` ### executeTransaction ```solidity -function executeTransaction(uint256 transactionIndex) public +function executeTransaction(uint256 _txIndex) public ``` -### revokeTransactionConfirmation +### revokeConfirmation ```solidity -function revokeTransactionConfirmation(uint256 transactionIndex) public +function revokeConfirmation(uint256 _txIndex) public ``` ### getOwners @@ -2317,18 +2678,6 @@ function revokeTransactionConfirmation(uint256 transactionIndex) public function getOwners() public view returns (address[]) ``` -### getOwnerChangeCount - -```solidity -function getOwnerChangeCount() public view returns (uint256) -``` - -### getOwnerChange - -```solidity -function getOwnerChange(uint256 changeId) public view returns (address owner, bool add, bool executed, uint256 numConfirmations) -``` - ### getTransactionCount ```solidity @@ -2338,10 +2687,10 @@ function getTransactionCount() public view returns (uint256) ### getTransaction ```solidity -function getTransaction(uint256 transactionIndex) public view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) +function getTransaction(uint256 _txIndex) public view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) ``` -## ICasimirMultisig +## ICasimirDAO ### Deposit @@ -2349,30 +2698,6 @@ function getTransaction(uint256 transactionIndex) public view returns (address t event Deposit(address sender, uint256 amount, uint256 balance) ``` -### SubmitOwnerChange - -```solidity -event SubmitOwnerChange(address owner, uint256 changeId, bool add) -``` - -### ConfirmOwnerChange - -```solidity -event ConfirmOwnerChange(address owner, uint256 changeId) -``` - -### RevokeOwnerChangeConfirmation - -```solidity -event RevokeOwnerChangeConfirmation(address owner, uint256 changeId) -``` - -### ExecuteOwnerChange - -```solidity -event ExecuteOwnerChange(address owner, uint256 changeId) -``` - ### SubmitTransaction ```solidity @@ -2385,10 +2710,10 @@ event SubmitTransaction(address owner, uint256 txIndex, address to, uint256 valu event ConfirmTransaction(address owner, uint256 txIndex) ``` -### RevokeTransactionConfirmation +### RevokeConfirmation ```solidity -event RevokeTransactionConfirmation(address owner, uint256 txIndex) +event RevokeConfirmation(address owner, uint256 txIndex) ``` ### ExecuteTransaction @@ -2397,17 +2722,6 @@ event RevokeTransactionConfirmation(address owner, uint256 txIndex) event ExecuteTransaction(address owner, uint256 txIndex) ``` -### OwnerChange - -```solidity -struct OwnerChange { - address owner; - bool add; - bool executed; - uint256 numConfirmations; -} -``` - ### Transaction ```solidity @@ -2426,52 +2740,28 @@ struct Transaction { receive() external payable ``` -### submitOwnerChange - -```solidity -function submitOwnerChange(address owner, bool add) external -``` - -### confirmOwnerChange - -```solidity -function confirmOwnerChange(uint256 changeId) external -``` - -### executeOwnerChange - -```solidity -function executeOwnerChange(uint256 changeId) external -``` - -### revokeOwnerChangeConfirmation - -```solidity -function revokeOwnerChangeConfirmation(uint256 changeId) external -``` - ### submitTransaction ```solidity -function submitTransaction(address to, uint256 value, bytes data) external +function submitTransaction(address _to, uint256 _value, bytes _data) external ``` ### confirmTransaction ```solidity -function confirmTransaction(uint256 transactionIndex) external +function confirmTransaction(uint256 _txIndex) external ``` ### executeTransaction ```solidity -function executeTransaction(uint256 transactionIndex) external +function executeTransaction(uint256 _txIndex) external ``` -### revokeTransactionConfirmation +### revokeConfirmation ```solidity -function revokeTransactionConfirmation(uint256 transactionIndex) external +function revokeConfirmation(uint256 _txIndex) external ``` ### getOwners @@ -2480,18 +2770,6 @@ function revokeTransactionConfirmation(uint256 transactionIndex) external function getOwners() external view returns (address[]) ``` -### getOwnerChangeCount - -```solidity -function getOwnerChangeCount() external view returns (uint256) -``` - -### getOwnerChange - -```solidity -function getOwnerChange(uint256 changeId) external view returns (address owner, bool add, bool executed, uint256 numConfirmations) -``` - ### getTransactionCount ```solidity @@ -2501,50 +2779,6 @@ function getTransactionCount() external view returns (uint256) ### getTransaction ```solidity -function getTransaction(uint256 transactionIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) -``` - -## MockFunctionsOracle - -### constructor - -```solidity -constructor() public -``` - -### getRegistry - -```solidity -function getRegistry() external view returns (address) -``` - -Returns the address of the registry contract - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | address | address The address of the registry contract | - -### sendRequest - -```solidity -function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) +function getTransaction(uint256 _txIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) ``` -Sends a request (encoded as data) using the provided subscriptionId - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| _gasLimit | uint32 | Gas limit for the fulfillment callback | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | A unique request identifier (unique per DON) | - diff --git a/contracts/ethereum/src/CasimirManager.sol b/contracts/ethereum/src/v1/CasimirManager.sol similarity index 100% rename from contracts/ethereum/src/CasimirManager.sol rename to contracts/ethereum/src/v1/CasimirManager.sol diff --git a/contracts/ethereum/src/CasimirMultisig.sol b/contracts/ethereum/src/v1/CasimirMultisig.sol similarity index 100% rename from contracts/ethereum/src/CasimirMultisig.sol rename to contracts/ethereum/src/v1/CasimirMultisig.sol diff --git a/contracts/ethereum/src/CasimirPool.sol b/contracts/ethereum/src/v1/CasimirPool.sol similarity index 100% rename from contracts/ethereum/src/CasimirPool.sol rename to contracts/ethereum/src/v1/CasimirPool.sol diff --git a/contracts/ethereum/src/CasimirRegistry.sol b/contracts/ethereum/src/v1/CasimirRegistry.sol similarity index 100% rename from contracts/ethereum/src/CasimirRegistry.sol rename to contracts/ethereum/src/v1/CasimirRegistry.sol diff --git a/contracts/ethereum/src/CasimirUpkeep.sol b/contracts/ethereum/src/v1/CasimirUpkeep.sol similarity index 100% rename from contracts/ethereum/src/CasimirUpkeep.sol rename to contracts/ethereum/src/v1/CasimirUpkeep.sol diff --git a/contracts/ethereum/src/interfaces/ICasimirManager.sol b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol similarity index 100% rename from contracts/ethereum/src/interfaces/ICasimirManager.sol rename to contracts/ethereum/src/v1/interfaces/ICasimirManager.sol diff --git a/contracts/ethereum/src/interfaces/ICasimirMultisig.sol b/contracts/ethereum/src/v1/interfaces/ICasimirMultisig.sol similarity index 100% rename from contracts/ethereum/src/interfaces/ICasimirMultisig.sol rename to contracts/ethereum/src/v1/interfaces/ICasimirMultisig.sol diff --git a/contracts/ethereum/src/interfaces/ICasimirPool.sol b/contracts/ethereum/src/v1/interfaces/ICasimirPool.sol similarity index 100% rename from contracts/ethereum/src/interfaces/ICasimirPool.sol rename to contracts/ethereum/src/v1/interfaces/ICasimirPool.sol diff --git a/contracts/ethereum/src/interfaces/ICasimirRegistry.sol b/contracts/ethereum/src/v1/interfaces/ICasimirRegistry.sol similarity index 100% rename from contracts/ethereum/src/interfaces/ICasimirRegistry.sol rename to contracts/ethereum/src/v1/interfaces/ICasimirRegistry.sol diff --git a/contracts/ethereum/src/interfaces/ICasimirUpkeep.sol b/contracts/ethereum/src/v1/interfaces/ICasimirUpkeep.sol similarity index 100% rename from contracts/ethereum/src/interfaces/ICasimirUpkeep.sol rename to contracts/ethereum/src/v1/interfaces/ICasimirUpkeep.sol diff --git a/contracts/ethereum/src/libraries/Types.sol b/contracts/ethereum/src/v1/libraries/Types.sol similarity index 100% rename from contracts/ethereum/src/libraries/Types.sol rename to contracts/ethereum/src/v1/libraries/Types.sol diff --git a/contracts/ethereum/src/mock/MockFunctionsOracle.sol b/contracts/ethereum/src/v1/mock/MockFunctionsOracle.sol similarity index 100% rename from contracts/ethereum/src/mock/MockFunctionsOracle.sol rename to contracts/ethereum/src/v1/mock/MockFunctionsOracle.sol diff --git a/contracts/ethereum/src/vendor/interfaces/IDepositContract.sol b/contracts/ethereum/src/v1/vendor/interfaces/IDepositContract.sol similarity index 100% rename from contracts/ethereum/src/vendor/interfaces/IDepositContract.sol rename to contracts/ethereum/src/v1/vendor/interfaces/IDepositContract.sol diff --git a/contracts/ethereum/src/v1/vendor/interfaces/ISSVNetwork.sol b/contracts/ethereum/src/v1/vendor/interfaces/ISSVNetwork.sol new file mode 100644 index 000000000..f3e53fbfa --- /dev/null +++ b/contracts/ethereum/src/v1/vendor/interfaces/ISSVNetwork.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.18; + +import "../../../../scripts/resources/ssv-network/contracts/ISSVNetwork.sol"; diff --git a/contracts/ethereum/src/v1/vendor/interfaces/ISSVNetworkCore.sol b/contracts/ethereum/src/v1/vendor/interfaces/ISSVNetworkCore.sol new file mode 100644 index 000000000..147cbbe7a --- /dev/null +++ b/contracts/ethereum/src/v1/vendor/interfaces/ISSVNetworkCore.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.18; + +import "../../../../scripts/resources/ssv-network/contracts/ISSVNetworkCore.sol"; diff --git a/contracts/ethereum/src/v1/vendor/interfaces/ISSVNetworkViews.sol b/contracts/ethereum/src/v1/vendor/interfaces/ISSVNetworkViews.sol new file mode 100644 index 000000000..cda3d403d --- /dev/null +++ b/contracts/ethereum/src/v1/vendor/interfaces/ISSVNetworkViews.sol @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.18; + +import "../../../../scripts/resources/ssv-network/contracts/ISSVNetworkViews.sol"; diff --git a/contracts/ethereum/src/vendor/interfaces/IWETH9.sol b/contracts/ethereum/src/v1/vendor/interfaces/IWETH9.sol similarity index 100% rename from contracts/ethereum/src/vendor/interfaces/IWETH9.sol rename to contracts/ethereum/src/v1/vendor/interfaces/IWETH9.sol diff --git a/contracts/ethereum/src/vendor/interfaces/KeeperRegistrarInterface.sol b/contracts/ethereum/src/v1/vendor/interfaces/KeeperRegistrarInterface.sol similarity index 100% rename from contracts/ethereum/src/vendor/interfaces/KeeperRegistrarInterface.sol rename to contracts/ethereum/src/v1/vendor/interfaces/KeeperRegistrarInterface.sol diff --git a/contracts/ethereum/src/vendor/interfaces/ISSVNetwork.sol b/contracts/ethereum/src/vendor/interfaces/ISSVNetwork.sol deleted file mode 100644 index 0ab45d3db..000000000 --- a/contracts/ethereum/src/vendor/interfaces/ISSVNetwork.sol +++ /dev/null @@ -1,4 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity 0.8.18; - -import "../../../scripts/resources/ssv-network/contracts/ISSVNetwork.sol"; diff --git a/contracts/ethereum/src/vendor/interfaces/ISSVNetworkCore.sol b/contracts/ethereum/src/vendor/interfaces/ISSVNetworkCore.sol deleted file mode 100644 index f14f515bd..000000000 --- a/contracts/ethereum/src/vendor/interfaces/ISSVNetworkCore.sol +++ /dev/null @@ -1,4 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity 0.8.18; - -import "../../../scripts/resources/ssv-network/contracts/ISSVNetworkCore.sol"; diff --git a/contracts/ethereum/src/vendor/interfaces/ISSVNetworkViews.sol b/contracts/ethereum/src/vendor/interfaces/ISSVNetworkViews.sol deleted file mode 100644 index 245918eb4..000000000 --- a/contracts/ethereum/src/vendor/interfaces/ISSVNetworkViews.sol +++ /dev/null @@ -1,4 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -pragma solidity 0.8.18; - -import "../../../scripts/resources/ssv-network/contracts/ISSVNetworkViews.sol"; diff --git a/services/oracle/src/providers/config.ts b/services/oracle/src/providers/config.ts index 599fc08e7..00db66649 100644 --- a/services/oracle/src/providers/config.ts +++ b/services/oracle/src/providers/config.ts @@ -1,5 +1,5 @@ import { ethers } from 'ethers' -import CasimirManagerJson from '@casimir/ethereum/build/artifacts/src/CasimirManager.sol/CasimirManager.json' +import CasimirManagerJson from '@casimir/ethereum/build/artifacts/src/v1/CasimirManager.sol/CasimirManager.json' import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' export function config() { From 43ec7c99d45e809c76dbb80adca44ae0d0aca37a Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Tue, 6 Jun 2023 12:36:28 -0400 Subject: [PATCH 54/78] Remove unused views --- contracts/ethereum/docs/index.md | 1674 ++++++++++++++++- contracts/ethereum/scripts/dev.ts | 8 +- contracts/ethereum/src/v1/CasimirManager.sol | 84 +- contracts/ethereum/src/v1/CasimirUpkeep.sol | 2 +- .../src/v1/interfaces/ICasimirManager.sol | 14 +- 5 files changed, 1636 insertions(+), 146 deletions(-) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index e723d5b07..903988e0a 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -2440,6 +2440,50 @@ _Send ETH to a user_ | user | address | The user address | | amount | uint256 | The amount of stake to send | +## MockFunctionsOracle + +### constructor + +```solidity +constructor() public +``` + +### getRegistry + +```solidity +function getRegistry() external view returns (address) +``` + +Returns the address of the registry contract + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | address | address The address of the registry contract | + +### sendRequest + +```solidity +function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) +``` + +Sends a request (encoded as data) using the provided subscriptionId + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | +| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| _gasLimit | uint32 | Gas limit for the fulfillment callback | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | A unique request identifier (unique per DON) | + ## IDepositContract ### DepositEvent @@ -2536,50 +2580,6 @@ struct RegistrationParams { function registerUpkeep(struct KeeperRegistrarInterface.RegistrationParams requestParams) external returns (uint256) ``` -## MockFunctionsOracle - -### constructor - -```solidity -constructor() public -``` - -### getRegistry - -```solidity -function getRegistry() external view returns (address) -``` - -Returns the address of the registry contract - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | address | address The address of the registry contract | - -### sendRequest - -```solidity -function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) -``` - -Sends a request (encoded as data) using the provided subscriptionId - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| _gasLimit | uint32 | Gas limit for the fulfillment callback | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | A unique request identifier (unique per DON) | - ## CasimirDAO ### owners @@ -2690,95 +2690,1611 @@ function getTransactionCount() public view returns (uint256) function getTransaction(uint256 _txIndex) public view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) ``` -## ICasimirDAO +## CasimirManager -### Deposit +### Token ```solidity -event Deposit(address sender, uint256 amount, uint256 balance) +enum Token { + LINK, + SSV, + WETH +} ``` -### SubmitTransaction +### constructor ```solidity -event SubmitTransaction(address owner, uint256 txIndex, address to, uint256 value, bytes data) +constructor(address _oracleAddress, address beaconDepositAddress, address functionsAddress, uint32 functionsSubscriptionId, address linkTokenAddress, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public ``` -### ConfirmTransaction +Constructor + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| _oracleAddress | address | The manager oracle address | +| beaconDepositAddress | address | The Beacon deposit address | +| functionsAddress | address | The Chainlink functions oracle address | +| functionsSubscriptionId | uint32 | The Chainlink functions subscription ID | +| linkTokenAddress | address | The Chainlink token address | +| ssvNetworkAddress | address | The SSV network address | +| ssvTokenAddress | address | The SSV token address | +| swapFactoryAddress | address | The Uniswap factory address | +| swapRouterAddress | address | The Uniswap router address | +| wethTokenAddress | address | The WETH contract address | + +### depositStake ```solidity -event ConfirmTransaction(address owner, uint256 txIndex) +function depositStake() external payable ``` -### RevokeConfirmation +Deposit user stake + +### rebalanceStake ```solidity -event RevokeConfirmation(address owner, uint256 txIndex) +function rebalanceStake(uint256 activeBalance, uint256 sweptRewards, uint256 sweptExits, uint32 completedDeposits, uint32 completedExits) external ``` -### ExecuteTransaction +Rebalance the rewards to stake ratio and redistribute swept rewards + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| activeBalance | uint256 | The active consensus balance | +| sweptRewards | uint256 | The swept consensus rewards | +| sweptExits | uint256 | The swept consensus exits | +| completedDeposits | uint32 | The completed deposit count | +| completedExits | uint32 | The completed exit count | + +### requestWithdrawal ```solidity -event ExecuteTransaction(address owner, uint256 txIndex) +function requestWithdrawal(uint256 amount) external ``` -### Transaction +Request to withdraw user stake + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| amount | uint256 | The amount of stake to withdraw | + +### completePendingWithdrawals ```solidity -struct Transaction { - address to; - uint256 value; - bytes data; - bool executed; - uint256 numConfirmations; -} +function completePendingWithdrawals(uint256 count) external ``` -### receive +Complete a given count of pending withdrawals + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| count | uint256 | The number of withdrawals to complete | + +### initiatePoolDeposit ```solidity -receive() external payable +function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount) external ``` -### submitTransaction +Initiate the next ready pool + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| depositDataRoot | bytes32 | The deposit data root | +| publicKey | bytes | The validator public key | +| signature | bytes | The signature | +| withdrawalCredentials | bytes | The withdrawal credentials | +| operatorIds | uint64[] | The operator IDs | +| shares | bytes | The operator shares | +| cluster | struct ISSVNetworkCore.Cluster | | +| feeAmount | uint256 | The fee amount | + +### completePoolDeposits ```solidity -function submitTransaction(address _to, uint256 _value, bytes _data) external +function completePoolDeposits(uint256 count) external ``` -### confirmTransaction +Complete a given count of the next pending pools + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| count | uint256 | The number of pools to complete | + +### requestPoolExits ```solidity -function confirmTransaction(uint256 _txIndex) external +function requestPoolExits(uint256 count) external ``` -### executeTransaction +Request a given count of staked pool exits + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| count | uint256 | The number of exits to request | + +### reportPoolSlash ```solidity -function executeTransaction(uint256 _txIndex) external +function reportPoolSlash(uint32 poolId) external ``` -### revokeConfirmation +Report a pool slash + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolId | uint32 | The pool ID | + +### completePoolExit ```solidity -function revokeConfirmation(uint256 _txIndex) external +function completePoolExit(uint256 poolIndex, uint256 validatorIndex, uint256 finalEffectiveBalance, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external ``` -### getOwners +Complete a pool exit + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolIndex | uint256 | The staked pool index | +| validatorIndex | uint256 | The staked validator (internal) index | +| finalEffectiveBalance | uint256 | The final effective balance | +| blamePercents | uint32[] | The operator blame percents (0 if balance is 32 ether) | +| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | + +### setFeePercents ```solidity -function getOwners() external view returns (address[]) +function setFeePercents(uint32 _ethFeePercent, uint32 _linkFeePercent, uint32 _ssvFeePercent) external ``` -### getTransactionCount +_Update fee percentages_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| _ethFeePercent | uint32 | The new ETH fee percentage | +| _linkFeePercent | uint32 | The new LINK fee percentage | +| _ssvFeePercent | uint32 | The new SSV fee percentage | + +### setFunctionsAddress ```solidity -function getTransactionCount() external view returns (uint256) +function setFunctionsAddress(address functionsAddress) external ``` -### getTransaction +Update the functions oracle address + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| functionsAddress | address | New functions oracle address | + +### getUserStake ```solidity -function getTransaction(uint256 _txIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) +function getUserStake(address userAddress) public view returns (uint256 userStake) +``` + +Get the total user stake for a given user address + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| userAddress | address | The user address | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| userStake | uint256 | The total user stake | + +### getStake + +```solidity +function getStake() public view returns (uint256 stake) ``` +Get the manager stake + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| stake | uint256 | The manager stake | + +### getBufferedBalance + +```solidity +function getBufferedBalance() public view returns (uint256 bufferedBalance) +``` + +Get the manager buffered (execution) balance + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| bufferedBalance | uint256 | The manager buffered (execution) balance | + +### getPendingDeposits + +```solidity +function getPendingDeposits() public view returns (uint256 pendingDeposits) +``` + +Get the manager pending (consensus) deposits + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| pendingDeposits | uint256 | The manager pending (consensus) deposits | + +### getExitedBalance + +```solidity +function getExitedBalance() public view returns (uint256) +``` + +Get the manager exited (execution) balance + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | exitedBalance The manager exited (execution) balance | + +### getReservedFees + +```solidity +function getReservedFees() public view returns (uint256) +``` + +Get the manager reserved fees + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | reservedFees The manager reserved fees | + +### getSweptBalance + +```solidity +function getSweptBalance() public view returns (uint256 balance) +``` + +Get the manager swept balance + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| balance | uint256 | The manager swept balance | + +### getActiveDeposits + +```solidity +function getActiveDeposits() public view returns (uint256 activeDeposits) +``` + +Get the manager active (consensus) deposits + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| activeDeposits | uint256 | The manager active (consensus) deposits | + +### getLatestActiveBalance + +```solidity +function getLatestActiveBalance() public view returns (uint256) +``` + +Get the latest manager active (consensus) balance + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | activeBalance The latest manager active (consensus) balance | + +### getLatestActiveBalanceAfterFees + +```solidity +function getLatestActiveBalanceAfterFees() public view returns (uint256) +``` + +Get the manager latest active (consensus) balance after fees + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | activeBalanceAfterFees The manager latest active (consensus) balance after fees | + +### getPendingWithdrawals + +```solidity +function getPendingWithdrawals() public view returns (uint256) +``` + +Get the total pending withdrawals + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | pendingWithdrawals The total pending withdrawals | + +### getPendingWithdrawalQueue + +```solidity +function getPendingWithdrawalQueue() public view returns (struct ICasimirManager.Withdrawal[]) +``` + +Get the pending withdrawal queue + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | struct ICasimirManager.Withdrawal[] | pendingWithdrawalQueue The pending withdrawal queue | + +### getFeePercent + +```solidity +function getFeePercent() public view returns (uint32) +``` + +Get the total fee percentage + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32 | feePercent The total fee percentage | + +### getValidatorPublicKeys + +```solidity +function getValidatorPublicKeys() external view returns (bytes[]) +``` + +Get validator public keys + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes[] | A list of pending and active validator public keys | + +### getExitingValidatorCount + +```solidity +function getExitingValidatorCount() external view returns (uint256) +``` + +Get the count of exiting validators + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | The count of exiting validators | + +### getReadyPoolIds + +```solidity +function getReadyPoolIds() external view returns (uint32[]) +``` + +Get a list of all ready pool IDs + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32[] | A list of all ready pool IDs | + +### getPendingPoolIds + +```solidity +function getPendingPoolIds() external view returns (uint32[]) +``` + +Get a list of all pending pool IDs + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32[] | A list of all pending pool IDs | + +### getStakedPoolIds + +```solidity +function getStakedPoolIds() external view returns (uint32[]) +``` + +Get a list of all staked pool IDs + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32[] | A list of all staked pool IDs | + +### getOpenDeposits + +```solidity +function getOpenDeposits() external view returns (uint256) +``` + +Get the total manager open deposits + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | The total manager open deposits | + +### getPool + +```solidity +function getPool(uint32 poolId) external view returns (struct ICasimirManager.Pool pool) +``` + +Get a pool by ID + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolId | uint32 | The pool ID | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| pool | struct ICasimirManager.Pool | The pool details | + +### getETHFeePercent + +```solidity +function getETHFeePercent() external view returns (uint32) +``` + +Get the ETH fee percentage to charge on each deposit + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32 | The ETH fee percentage to charge on each deposit | + +### getLINKFeePercent + +```solidity +function getLINKFeePercent() external view returns (uint32) +``` + +Get the LINK fee percentage to charge on each deposit + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32 | The LINK fee percentage to charge on each deposit | + +### getSSVFeePercent + +```solidity +function getSSVFeePercent() external view returns (uint32) +``` + +Get the SSV fee percentage to charge on each deposit + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32 | The SSV fee percentage to charge on each deposit | + +### getSSVNetworkAddress + +```solidity +function getSSVNetworkAddress() external view returns (address ssvNetworkAddress) +``` + +Get the SSV network address + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| ssvNetworkAddress | address | The SSV network address | + +### getUpkeepAddress + +```solidity +function getUpkeepAddress() external view returns (address upkeepAddress) +``` + +Get the upkeep address + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| upkeepAddress | address | The upkeep address | + +### receive + +```solidity +receive() external payable +``` + +_Will be removed in production +Used for mocking sweeps from Beacon to the manager_ + +## CasimirRegistry + +### requiredCollateral + +```solidity +uint256 requiredCollateral +``` + +### minimumCollateralDeposit + +```solidity +uint256 minimumCollateralDeposit +``` + +### constructor + +```solidity +constructor(address managerAddress, address ssvNetworkViewsAddress) public +``` + +### registerOperator + +```solidity +function registerOperator(uint64 operatorId) external payable +``` + +Register an operator with the set + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +### requestOperatorDeregistration + +```solidity +function requestOperatorDeregistration(uint64 operatorId) external +``` + +Request to deregister an operator from the set + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +### completeOperatorDeregistration + +```solidity +function completeOperatorDeregistration(uint64 operatorId) external +``` + +Deregister an operator from the set + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +### depositCollateral + +```solidity +function depositCollateral(uint64 operatorId) external payable +``` + +Deposit collateral for an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +### setOperatorCollateral + +```solidity +function setOperatorCollateral(uint64 operatorId, int256 collateral) external +``` + +Set the collateral for an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | +| collateral | int256 | The collateral | + +### getOperatorCollateral + +```solidity +function getOperatorCollateral(uint64 operatorId) external view returns (int256) +``` + +Get the collateral for an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | int256 | The collateral | + +## CasimirUpkeep + +### reportHeartbeat + +```solidity +uint256 reportHeartbeat +``` + +Oracle heartbeat + +### poolCapacity + +```solidity +uint256 poolCapacity +``` + +Pool capacity + +### currentReportRequestBlock + +```solidity +uint256 currentReportRequestBlock +``` + +Current report block + +### latestSummaryRequestId + +```solidity +bytes32 latestSummaryRequestId +``` + +Latest summary request ID + +### requestCBOR + +```solidity +bytes requestCBOR +``` + +Binary request source code + +### fulfillGasLimit + +```solidity +uint32 fulfillGasLimit +``` + +Fulfillment gas limit + +### constructor + +```solidity +constructor(address managerAddress, address functionsOracleAddress, uint64 _functionsSubscriptionId) public +``` + +Constructor + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| managerAddress | address | The manager contract address | +| functionsOracleAddress | address | The functions oracle contract address | +| _functionsSubscriptionId | uint64 | The functions subscription ID | + +### generateRequest + +```solidity +function generateRequest(string source, bytes secrets, string[] args) public pure returns (bytes) +``` + +Generate a new Functions.Request(off-chain, saving gas) + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| source | string | JavaScript source code | +| secrets | bytes | Encrypted secrets payload | +| args | string[] | List of arguments accessible from within the source code | + +### setRequest + +```solidity +function setRequest(uint32 _fulfillGasLimit, uint64 _functionsSubscriptionId, bytes _requestCBOR) external +``` + +Set the bytes representing the CBOR-encoded Functions.Request + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | +| _functionsSubscriptionId | uint64 | The functions billing subscription ID used to pay for Functions requests | +| _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | + +### checkUpkeep + +```solidity +function checkUpkeep(bytes) public view returns (bool upkeepNeeded, bytes) +``` + +Check if the upkeep is needed + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| upkeepNeeded | bool | True if the upkeep is needed | +| [1] | bytes | | + +### performUpkeep + +```solidity +function performUpkeep(bytes) external +``` + +Perform the upkeep + +### fulfillRequest + +```solidity +function fulfillRequest(bytes32 requestId, bytes response, bytes _error) internal +``` + +Callback that is invoked once the DON has resolved the request or hit an error + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| _error | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | + +### setOracleAddress + +```solidity +function setOracleAddress(address newOracleAddress) external +``` + +Update the functions oracle address + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| newOracleAddress | address | New oracle address | + +### mockFulfillRequest + +```solidity +function mockFulfillRequest(bytes32 requestId, bytes response, bytes err) external +``` + +Fulfill the request for testing + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | + +## ICasimirDAO + +### Deposit + +```solidity +event Deposit(address sender, uint256 amount, uint256 balance) +``` + +### SubmitTransaction + +```solidity +event SubmitTransaction(address owner, uint256 txIndex, address to, uint256 value, bytes data) +``` + +### ConfirmTransaction + +```solidity +event ConfirmTransaction(address owner, uint256 txIndex) +``` + +### RevokeConfirmation + +```solidity +event RevokeConfirmation(address owner, uint256 txIndex) +``` + +### ExecuteTransaction + +```solidity +event ExecuteTransaction(address owner, uint256 txIndex) +``` + +### Transaction + +```solidity +struct Transaction { + address to; + uint256 value; + bytes data; + bool executed; + uint256 numConfirmations; +} +``` + +### receive + +```solidity +receive() external payable +``` + +### submitTransaction + +```solidity +function submitTransaction(address _to, uint256 _value, bytes _data) external +``` + +### confirmTransaction + +```solidity +function confirmTransaction(uint256 _txIndex) external +``` + +### executeTransaction + +```solidity +function executeTransaction(uint256 _txIndex) external +``` + +### revokeConfirmation + +```solidity +function revokeConfirmation(uint256 _txIndex) external +``` + +### getOwners + +```solidity +function getOwners() external view returns (address[]) +``` + +### getTransactionCount + +```solidity +function getTransactionCount() external view returns (uint256) +``` + +### getTransaction + +```solidity +function getTransaction(uint256 _txIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) +``` + +## ICasimirManager + +### ProcessedDeposit + +```solidity +struct ProcessedDeposit { + uint256 ethAmount; + uint256 linkAmount; + uint256 ssvAmount; +} +``` + +### Pool + +```solidity +struct Pool { + uint256 deposits; + bool exiting; + bytes32 depositDataRoot; + bytes publicKey; + bytes signature; + bytes withdrawalCredentials; + uint64[] operatorIds; + bytes shares; +} +``` + +### User + +```solidity +struct User { + uint256 stake0; + uint256 stakeRatioSum0; +} +``` + +### Withdrawal + +```solidity +struct Withdrawal { + address user; + uint256 amount; +} +``` + +### PoolDepositRequested + +```solidity +event PoolDepositRequested(uint32 poolId) +``` + +### PoolDepositInitiated + +```solidity +event PoolDepositInitiated(uint32 poolId) +``` + +### PoolDeposited + +```solidity +event PoolDeposited(uint32 poolId) +``` + +### PoolReshareRequested + +```solidity +event PoolReshareRequested(uint32 poolId) +``` + +### PoolReshared + +```solidity +event PoolReshared(uint32 poolId) +``` + +### PoolExitRequested + +```solidity +event PoolExitRequested(uint32 poolId) +``` + +### PoolExited + +```solidity +event PoolExited(uint32 poolId) +``` + +### StakeDeposited + +```solidity +event StakeDeposited(address sender, uint256 amount) +``` + +### StakeRebalanced + +```solidity +event StakeRebalanced(uint256 amount) +``` + +### RewardsDeposited + +```solidity +event RewardsDeposited(uint256 amount) +``` + +### WithdrawalRequested + +```solidity +event WithdrawalRequested(address sender, uint256 amount) +``` + +### WithdrawalInitiated + +```solidity +event WithdrawalInitiated(address sender, uint256 amount) +``` + +### WithdrawalCompleted + +```solidity +event WithdrawalCompleted(address sender, uint256 amount) +``` + +### depositStake + +```solidity +function depositStake() external payable +``` + +### rebalanceStake + +```solidity +function rebalanceStake(uint256 activeBalance, uint256 sweptRewards, uint256 sweptExits, uint32 completedDeposits, uint32 completedExits) external +``` + +### requestWithdrawal + +```solidity +function requestWithdrawal(uint256 amount) external +``` + +### completePendingWithdrawals + +```solidity +function completePendingWithdrawals(uint256 count) external +``` + +### initiatePoolDeposit + +```solidity +function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount) external +``` + +### completePoolDeposits + +```solidity +function completePoolDeposits(uint256 count) external +``` + +### requestPoolExits + +```solidity +function requestPoolExits(uint256 count) external +``` + +### completePoolExit + +```solidity +function completePoolExit(uint256 poolIndex, uint256 validatorIndex, uint256 finalEffectiveBalance, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external +``` + +### setFeePercents + +```solidity +function setFeePercents(uint32 ethFeePercent, uint32 linkFeePercent, uint32 ssvFeePercent) external +``` + +### setFunctionsAddress + +```solidity +function setFunctionsAddress(address functionsAddress) external +``` + +### getFeePercent + +```solidity +function getFeePercent() external view returns (uint32) +``` + +### getETHFeePercent + +```solidity +function getETHFeePercent() external view returns (uint32) +``` + +### getLINKFeePercent + +```solidity +function getLINKFeePercent() external view returns (uint32) +``` + +### getSSVFeePercent + +```solidity +function getSSVFeePercent() external view returns (uint32) +``` + +### getValidatorPublicKeys + +```solidity +function getValidatorPublicKeys() external view returns (bytes[]) +``` + +### getExitingValidatorCount + +```solidity +function getExitingValidatorCount() external view returns (uint256) +``` + +### getReadyPoolIds + +```solidity +function getReadyPoolIds() external view returns (uint32[]) +``` + +### getPendingPoolIds + +```solidity +function getPendingPoolIds() external view returns (uint32[]) +``` + +### getStakedPoolIds + +```solidity +function getStakedPoolIds() external view returns (uint32[]) +``` + +### getStake + +```solidity +function getStake() external view returns (uint256) +``` + +### getBufferedBalance + +```solidity +function getBufferedBalance() external view returns (uint256) +``` + +### getActiveDeposits + +```solidity +function getActiveDeposits() external view returns (uint256) +``` + +### getLatestActiveBalance + +```solidity +function getLatestActiveBalance() external view returns (uint256) +``` + +### getLatestActiveBalanceAfterFees + +```solidity +function getLatestActiveBalanceAfterFees() external view returns (uint256) +``` + +### getExitedBalance + +```solidity +function getExitedBalance() external view returns (uint256) +``` + +### getOpenDeposits + +```solidity +function getOpenDeposits() external view returns (uint256) +``` + +### getSweptBalance + +```solidity +function getSweptBalance() external view returns (uint256) +``` + +### getUserStake + +```solidity +function getUserStake(address userAddress) external view returns (uint256) +``` + +### getPendingWithdrawals + +```solidity +function getPendingWithdrawals() external view returns (uint256) +``` + +### getPendingWithdrawalQueue + +```solidity +function getPendingWithdrawalQueue() external view returns (struct ICasimirManager.Withdrawal[]) +``` + +## ICasimirRegistry + +### OperatorRegistered + +```solidity +event OperatorRegistered(uint64 operatorId) +``` + +### OperatorDeregistrationRequested + +```solidity +event OperatorDeregistrationRequested(uint64 operatorId) +``` + +### OperatorDeregistrationCompleted + +```solidity +event OperatorDeregistrationCompleted(uint64 operatorId) +``` + +### Operator + +```solidity +struct Operator { + uint64 id; + int256 collateral; + uint256 poolCount; + bool deregistering; +} +``` + +### registerOperator + +```solidity +function registerOperator(uint64 operatorId) external payable +``` + +### requestOperatorDeregistration + +```solidity +function requestOperatorDeregistration(uint64 operatorId) external +``` + +### completeOperatorDeregistration + +```solidity +function completeOperatorDeregistration(uint64 operatorId) external +``` + +### depositCollateral + +```solidity +function depositCollateral(uint64 operatorId) external payable +``` + +### setOperatorCollateral + +```solidity +function setOperatorCollateral(uint64 operatorId, int256 collateral) external +``` + +### getOperatorCollateral + +```solidity +function getOperatorCollateral(uint64 operatorId) external view returns (int256) +``` + +## ICasimirUpkeep + +### ReportStatus + +```solidity +enum ReportStatus { + FINALIZED, + PENDING, + PROCESSING +} +``` + +### DetailRequestType + +```solidity +enum DetailRequestType { + NONE, + EXIT, + SLASH +} +``` + +### DetailRequest + +```solidity +struct DetailRequest { + enum ICasimirUpkeep.DetailRequestType requestType; + uint32 reportDetailIndex; +} +``` + +### Report + +```solidity +struct Report { + struct ICasimirUpkeep.Summary summary; + struct ICasimirUpkeep.ExitDetail[] exitDetails; + struct ICasimirUpkeep.SlashDetail[] slashDetails; +} +``` + +### Summary + +```solidity +struct Summary { + uint256 activeBalance; + uint32 completedDeposits; + uint32 completedExits; + uint32 slashedExits; + uint32 dummy; +} +``` + +### SlashDetail + +```solidity +struct SlashDetail { + uint32 poolId; + uint256 expectedEffectiveBalance; + uint32 blockDelay; + uint32 firstOperatorBlame; + uint32 secondOperatorBlame; + uint32 thirdOperatorBlame; + uint32 fourthOperatorBlame; +} +``` + +### ExitDetail + +```solidity +struct ExitDetail { + uint32 poolId; + uint256 finalEffectiveBalance; + uint32 firstOperatorBlame; + uint32 secondOperatorBlame; + uint32 thirdOperatorBlame; + uint32 fourthOperatorBlame; + uint32 dummy; +} +``` + +### OCRResponse + +```solidity +event OCRResponse(bytes32 requestId, bytes result, bytes err) +``` + +### UpkeepPerformed + +```solidity +event UpkeepPerformed(enum ICasimirUpkeep.ReportStatus status) +``` + +### checkUpkeep + +```solidity +function checkUpkeep(bytes checkData) external returns (bool upkeepNeeded, bytes performData) +``` + +method that is simulated by the keepers to see if any work actually +needs to be performed. This method does does not actually need to be +executable, and since it is only ever simulated it can consume lots of gas. + +_To ensure that it is never called, you may want to add the +cannotExecute modifier from KeeperBase to your implementation of this +method._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| checkData | bytes | specified in the upkeep registration so it is always the same for a registered upkeep. This can easily be broken down into specific arguments using `abi.decode`, so multiple upkeeps can be registered on the same contract and easily differentiated by the contract. | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| upkeepNeeded | bool | boolean to indicate whether the keeper should call performUpkeep or not. | +| performData | bytes | bytes that the keeper should call performUpkeep with, if upkeep is needed. If you would like to encode data to decode later, try `abi.encode`. | + +### performUpkeep + +```solidity +function performUpkeep(bytes performData) external +``` + +method that is actually executed by the keepers, via the registry. +The data returned by the checkUpkeep simulation will be passed into +this method to actually be executed. + +_The input to this method should not be trusted, and the caller of the +method should not even be restricted to any single registry. Anyone should +be able call it, and the input should be validated, there is no guarantee +that the data passed in is the performData returned from checkUpkeep. This +could happen due to malicious keepers, racing keepers, or simply a state +change while the performUpkeep transaction is waiting for confirmation. +Always validate the data passed in._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| performData | bytes | is the data which was passed back from the checkData simulation. If it is encoded, it can easily be decoded into other types by calling `abi.decode`. This data should not be trusted, and should be validated against the contract's current state. | + +### setOracleAddress + +```solidity +function setOracleAddress(address oracleAddress) external +``` + +### mockFulfillRequest + +```solidity +function mockFulfillRequest(bytes32 requestId, bytes result, bytes err) external +``` + +## Types32Array + +### remove + +```solidity +function remove(uint32[] uint32Array, uint256 index) internal +``` + +_Remove a uint32 element from the array_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| uint32Array | uint32[] | The array of uint32 | +| index | uint256 | | + +## TypesBytesArray + +### remove + +```solidity +function remove(bytes[] bytesArray, uint256 index) internal +``` + +_Remove a bytes element from the array_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| bytesArray | bytes[] | The array of bytes | +| index | uint256 | The index of the element to remove | + +## TypesWithdrawalArray + +### remove + +```solidity +function remove(struct ICasimirManager.Withdrawal[] withdrawals, uint256 index) internal +``` + +_Remove a withdrawal from the array_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| withdrawals | struct ICasimirManager.Withdrawal[] | The array of withdrawals | +| index | uint256 | The index of the withdrawal to remove | + +## TypesAddress + +### send + +```solidity +function send(address user, uint256 amount) internal +``` + +_Send ETH to a user_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| user | address | The user address | +| amount | uint256 | The amount of stake to send | + +## IDepositContract + +### DepositEvent + +```solidity +event DepositEvent(bytes pubkey, bytes withdrawal_credentials, bytes amount, bytes signature, bytes index) +``` + +A processed deposit event. + +### deposit + +```solidity +function deposit(bytes pubkey, bytes withdrawal_credentials, bytes signature, bytes32 deposit_data_root) external payable +``` + +Submit a Phase 0 DepositData object. + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| pubkey | bytes | A BLS12-381 public key. | +| withdrawal_credentials | bytes | Commitment to a public key for withdrawals. | +| signature | bytes | A BLS12-381 signature. | +| deposit_data_root | bytes32 | The SHA-256 hash of the SSZ-encoded DepositData object. Used as a protection against malformed input. | + +### get_deposit_root + +```solidity +function get_deposit_root() external view returns (bytes32) +``` + +Query the current deposit root hash. + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes32 | The deposit root hash. | + +### get_deposit_count + +```solidity +function get_deposit_count() external view returns (bytes) +``` + +Query the current deposit count. + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes | The deposit count encoded as a little endian 64-bit number. | + +## IWETH9 + +### deposit + +```solidity +function deposit() external payable +``` + +Deposit ether to get wrapped ether + +### withdraw + +```solidity +function withdraw(uint256) external +``` + +Withdraw wrapped ether to get ether + diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 52ce91486..a4a91a62e 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -101,14 +101,14 @@ void async function () { if (block - blocksPerReward >= lastRewardBlock) { console.log('New reward block') lastRewardBlock = block - const depositedPoolCount = await manager.getTotalDeposits() - if (depositedPoolCount) { - console.log(`Rewarding ${depositedPoolCount} validators ${rewardPerValidator} each`) + const stakedPoolCount = (await manager.getStakedPoolIds()).length + if (stakedPoolCount) { + console.log(`Rewarding ${stakedPoolCount} validators ${rewardPerValidator} each`) await time.increase(time.duration.days(1)) await runUpkeep({ upkeep, keeper }) - const rewardAmount = rewardPerValidator * depositedPoolCount.toNumber() + const rewardAmount = rewardPerValidator * stakedPoolCount let nextActiveBalance = round( parseFloat( ethers.utils.formatEther( diff --git a/contracts/ethereum/src/v1/CasimirManager.sol b/contracts/ethereum/src/v1/CasimirManager.sol index 38e82f976..4271ece49 100644 --- a/contracts/ethereum/src/v1/CasimirManager.sol +++ b/contracts/ethereum/src/v1/CasimirManager.sol @@ -423,7 +423,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } upkeepId = linkRegistrar.registerUpkeep( KeeperRegistrarInterface.RegistrationParams({ - name: string("CasimirUpkeep"), + name: string("CasimirV1Upkeep"), encryptedEmail: new bytes(0), upkeepContract: address(this), gasLimit: 0, @@ -1130,14 +1130,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { readyBalance = readyPoolIds.length * poolCapacity; } - /** - * @notice Get the pending balance - * @return pendingBalance The pending balance - */ - function getPendingBalance() public view returns (uint256 pendingBalance) { - pendingBalance = pendingPoolIds.length * poolCapacity; - } - /** * @notice Get the withdrawable balanace * @return withdrawableBalance The withdrawable balanace @@ -1166,14 +1158,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { expectedEffectiveBalance = stakedPoolIds.length * poolCapacity; } - /** - * @notice Get the report period - * @return reportPeriod The report period - */ - function getReportPeriod() public view returns (uint32) { - return reportPeriod; - } - /** * @notice Get the latest active balance * @return latestActiveBalance The latest active balance @@ -1190,22 +1174,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { return latestActiveBalanceAfterFees; } - /** - * @notice Get the latest active reward balance - * @return latestActiveRewardBalance The latest active reward balance - */ - function getLatestActiveRewardBalance() public view returns (int256) { - return latestActiveRewardBalance; - } - - /** - * @notice Get the finalizable exited balance of the current reporting period - * @return finalizableExitedBalance The finalizable exited balance of the current reporting period - */ - function getFinalizableExitedBalance() public view returns (uint256) { - return finalizableExitedBalance; - } - /** * @notice Get the finalizable completed exit count of the current reporting period * @return finalizableCompletedExits The finalizable completed exit count of the current reporting period @@ -1214,14 +1182,21 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { return finalizableCompletedExits; } + /** + * @notice Get the report period + * @return reportPeriod The report period + */ + function getReportPeriod() public view returns (uint256) { + return reportPeriod; + } + /** * @notice Get the eligibility of a pending withdrawal + * @param index The index of the pending withdrawal + * @param period The period to check * @return pendingWithdrawalEligibility The eligibility of a pending withdrawal */ - function getPendingWithdrawalEligibility( - uint256 index, - uint256 period - ) public view returns (bool) { + function getPendingWithdrawalEligibility(uint256 index, uint256 period) public view returns (bool) { if (requestedWithdrawals > index) { return requestedWithdrawalQueue[index].period <= period; } @@ -1252,14 +1227,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { return feePercent; } - /** - * @notice Get the count of deposited pools - * @return totalDeposits The count of deposited pools - */ - function getTotalDeposits() external view returns (uint256) { - return totalDeposits; - } - /** * @notice Get the count of pools requested to exit * @return requestedExits The count of pools requested to exit @@ -1369,15 +1336,15 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Get the swept balance * @dev Should be called off-chain + * @param startIndex The start index + * @param endIndex The end index * @return balance The swept balance */ - function getSweptBalance() public view returns (uint256 balance) { - for (uint256 i = 0; i < pendingPoolIds.length; i++) { - uint32 poolId = pendingPoolIds[i]; - ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); - balance += pool.getBalance(); - } - for (uint256 i = 0; i < stakedPoolIds.length; i++) { + function getSweptBalance( + uint256 startIndex, + uint256 endIndex + ) public view returns (uint256 balance) { + for (uint256 i = startIndex; i <= endIndex; i++) { uint32 poolId = stakedPoolIds[i]; ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); balance += pool.getBalance(); @@ -1387,15 +1354,16 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Get the next five compoundable pool IDs * @dev Should be called off-chain + * @param startIndex The start index + * @param endIndex The end index * @return poolIds The next five compoundable pool IDs */ - function getCompoundablePoolIds() - external - view - returns (uint32[5] memory poolIds) - { + function getCompoundablePoolIds( + uint256 startIndex, + uint256 endIndex + ) external view returns (uint32[5] memory poolIds) { uint256 count = 0; - for (uint256 i = 0; i < stakedPoolIds.length; i++) { + for (uint256 i = startIndex; i <= endIndex; i++) { uint32 poolId = stakedPoolIds[i]; ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); if (pool.getBalance() >= compoundMinimum) { diff --git a/contracts/ethereum/src/v1/CasimirUpkeep.sol b/contracts/ethereum/src/v1/CasimirUpkeep.sol index c575b31bb..3b7a574cc 100644 --- a/contracts/ethereum/src/v1/CasimirUpkeep.sol +++ b/contracts/ethereum/src/v1/CasimirUpkeep.sol @@ -146,7 +146,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { returns (bool upkeepNeeded, bytes memory) { if (reportStatus == ReportStatus.FINALIZED) { - bool checkActive = manager.getTotalDeposits() > 0; + bool checkActive = manager.getPendingPoolIds().length + manager.getStakedPoolIds().length > 0; bool heartbeatLapsed = (block.timestamp - reportTimestamp) >= reportHeartbeat; upkeepNeeded = checkActive && heartbeatLapsed; } else if (reportStatus == ReportStatus.PROCESSING) { diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol index cc59e672b..3a9e043b0 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol @@ -126,7 +126,6 @@ interface ICasimirManager { function withdrawSSVBalance(uint256 amount) external; function setFunctionsAddress(address functionsAddress) external; function getFeePercent() external view returns (uint32); - function getTotalDeposits() external view returns (uint256); function getRequestedExits() external view returns (uint256); function getReadyPoolIds() external view returns (uint32[] memory); function getPendingPoolIds() external view returns (uint32[] memory); @@ -134,15 +133,13 @@ interface ICasimirManager { function getTotalStake() external view returns (uint256); function getBufferedBalance() external view returns (uint256); function getExpectedEffectiveBalance() external view returns (uint256); - function getReportPeriod() external view returns (uint32); function getFinalizableCompletedExits() external view returns (uint256); - function getFinalizableExitedBalance() external view returns (uint256); function getLatestActiveBalance() external view returns (uint256); function getLatestActiveBalanceAfterFees() external view returns (uint256); + function getReportPeriod() external view returns (uint256); function getPendingWithdrawalEligibility(uint256 index, uint256 period) external view returns (bool); function getWithdrawableBalance() external view returns (uint256); function getPrepoolBalance() external view returns (uint256); - function getSweptBalance() external view returns (uint256); function getUserStake(address userAddress) external view returns (uint256); function getPendingWithdrawalBalance() external view returns (uint256); function getPendingWithdrawals() external view returns (uint256); @@ -152,4 +149,13 @@ interface ICasimirManager { function getUpkeepId() external view returns (uint256); function getUpkeepAddress() external view returns (address); function getUpkeepBalance() external view returns (uint256 upkeepBalance); + function getSweptBalance( + uint256 startIndex, + uint256 endIndex + ) external view returns (uint256); + function getCompoundablePoolIds( + uint256 startIndex, + uint256 endIndex + ) external view returns (uint32[5] memory); + } From b8a8b33f020b3abb185ca443ae2adda383303563 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Tue, 6 Jun 2023 13:36:59 -0400 Subject: [PATCH 55/78] Separate off-chain views into dedicated contract --- .../types/src/interfaces/DeploymentConfig.ts | 2 +- contracts/ethereum/docs/index.md | 903 +++++++++--------- contracts/ethereum/scripts/deploy.ts | 49 + contracts/ethereum/scripts/dev.ts | 17 +- contracts/ethereum/src/v1/CasimirManager.sol | 123 +-- contracts/ethereum/src/v1/CasimirViews.sol | 70 ++ .../src/v1/interfaces/ICasimirManager.sol | 9 - .../src/v1/interfaces/ICasimirViews.sol | 13 + contracts/ethereum/test/fixtures/shared.ts | 19 +- 9 files changed, 623 insertions(+), 582 deletions(-) create mode 100644 contracts/ethereum/src/v1/CasimirViews.sol create mode 100644 contracts/ethereum/src/v1/interfaces/ICasimirViews.sol diff --git a/common/types/src/interfaces/DeploymentConfig.ts b/common/types/src/interfaces/DeploymentConfig.ts index 0873f4371..7ace31a4b 100644 --- a/common/types/src/interfaces/DeploymentConfig.ts +++ b/common/types/src/interfaces/DeploymentConfig.ts @@ -2,6 +2,6 @@ import { ContractConfig } from './ContractConfig' export interface DeploymentConfig { CasimirManager: ContractConfig + CasimirViews: ContractConfig MockFunctionsOracle?: ContractConfig - MockKeeperRegistry?: ContractConfig } \ No newline at end of file diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 903988e0a..e15276c47 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -531,20 +531,6 @@ Get the ready balance | ---- | ---- | ----------- | | readyBalance | uint256 | The ready balance | -### getPendingBalance - -```solidity -function getPendingBalance() public view returns (uint256 pendingBalance) -``` - -Get the pending balance - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| pendingBalance | uint256 | The pending balance | - ### getWithdrawableBalance ```solidity @@ -587,20 +573,6 @@ Get the expected effective balance | ---- | ---- | ----------- | | expectedEffectiveBalance | uint256 | The expected effective balance | -### getReportPeriod - -```solidity -function getReportPeriod() public view returns (uint32) -``` - -Get the report period - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32 | reportPeriod The report period | - ### getLatestActiveBalance ```solidity @@ -629,55 +601,48 @@ Get the latest active balance after fees | ---- | ---- | ----------- | | [0] | uint256 | latestActiveBalanceAfterFees The latest active balance after fees | -### getLatestActiveRewardBalance +### getFinalizableCompletedExits ```solidity -function getLatestActiveRewardBalance() public view returns (int256) +function getFinalizableCompletedExits() public view returns (uint256) ``` -Get the latest active reward balance +Get the finalizable completed exit count of the current reporting period #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | int256 | latestActiveRewardBalance The latest active reward balance | +| [0] | uint256 | finalizableCompletedExits The finalizable completed exit count of the current reporting period | -### getFinalizableExitedBalance +### getReportPeriod ```solidity -function getFinalizableExitedBalance() public view returns (uint256) +function getReportPeriod() public view returns (uint256) ``` -Get the finalizable exited balance of the current reporting period +Get the report period #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | finalizableExitedBalance The finalizable exited balance of the current reporting period | +| [0] | uint256 | reportPeriod The report period | -### getFinalizableCompletedExits +### getPendingWithdrawalEligibility ```solidity -function getFinalizableCompletedExits() public view returns (uint256) +function getPendingWithdrawalEligibility(uint256 index, uint256 period) public view returns (bool) ``` -Get the finalizable completed exit count of the current reporting period +Get the eligibility of a pending withdrawal -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | finalizableCompletedExits The finalizable completed exit count of the current reporting period | - -### getPendingWithdrawalEligibility - -```solidity -function getPendingWithdrawalEligibility(uint256 index, uint256 period) public view returns (bool) -``` - -Get the eligibility of a pending withdrawal +| index | uint256 | The index of the pending withdrawal | +| period | uint256 | The period to check | #### Return Values @@ -727,20 +692,6 @@ Get the total fee percentage | ---- | ---- | ----------- | | [0] | uint32 | feePercent The total fee percentage | -### getTotalDeposits - -```solidity -function getTotalDeposits() external view returns (uint256) -``` - -Get the count of deposited pools - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | totalDeposits The count of deposited pools | - ### getRequestedExits ```solidity @@ -910,13 +861,20 @@ Get the upkeep balance ### getSweptBalance ```solidity -function getSweptBalance() public view returns (uint256 balance) +function getSweptBalance(uint256 startIndex, uint256 endIndex) public view returns (uint256 balance) ``` Get the swept balance _Should be called off-chain_ +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + #### Return Values | Name | Type | Description | @@ -926,200 +884,25 @@ _Should be called off-chain_ ### getCompoundablePoolIds ```solidity -function getCompoundablePoolIds() external view returns (uint32[5] poolIds) +function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5] poolIds) ``` Get the next five compoundable pool IDs _Should be called off-chain_ -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| poolIds | uint32[5] | The next five compoundable pool IDs | - -## CasimirMultisig - -### owners - -```solidity -address[] owners -``` - -### isOwner - -```solidity -mapping(address => bool) isOwner -``` - -### confirmationsRequired - -```solidity -uint256 confirmationsRequired -``` - -### isOwnerChangeConfirmed - -```solidity -mapping(uint256 => mapping(address => bool)) isOwnerChangeConfirmed -``` - -### isTransactionConfirmed - -```solidity -mapping(uint256 => mapping(address => bool)) isTransactionConfirmed -``` - -### ownerChanges - -```solidity -struct ICasimirMultisig.OwnerChange[] ownerChanges -``` - -### transactions - -```solidity -struct ICasimirMultisig.Transaction[] transactions -``` - -### onlyOwner - -```solidity -modifier onlyOwner() -``` - -### ownerChangeExists - -```solidity -modifier ownerChangeExists(uint256 changeId) -``` - -### ownerChangeNotExecuted - -```solidity -modifier ownerChangeNotExecuted(uint256 changeId) -``` - -### ownerChangeNotConfirmed +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | -```solidity -modifier ownerChangeNotConfirmed(uint256 changeId) -``` - -### transactionExists - -```solidity -modifier transactionExists(uint256 transactionIndex) -``` - -### transactionNotExecuted - -```solidity -modifier transactionNotExecuted(uint256 transactionIndex) -``` - -### transactionNotConfirmed - -```solidity -modifier transactionNotConfirmed(uint256 transactionIndex) -``` - -### constructor - -```solidity -constructor(address[] _owners) public -``` - -### receive - -```solidity -receive() external payable -``` - -### submitOwnerChange - -```solidity -function submitOwnerChange(address owner, bool add) public -``` - -### confirmOwnerChange - -```solidity -function confirmOwnerChange(uint256 changeId) public -``` - -### executeOwnerChange - -```solidity -function executeOwnerChange(uint256 changeId) public -``` - -### revokeOwnerChangeConfirmation - -```solidity -function revokeOwnerChangeConfirmation(uint256 changeId) public -``` - -### submitTransaction - -```solidity -function submitTransaction(address to, uint256 value, bytes data) public -``` - -### confirmTransaction - -```solidity -function confirmTransaction(uint256 transactionIndex) public -``` - -### executeTransaction - -```solidity -function executeTransaction(uint256 transactionIndex) public -``` - -### revokeTransactionConfirmation - -```solidity -function revokeTransactionConfirmation(uint256 transactionIndex) public -``` - -### adjustConfirmationsRequired - -```solidity -function adjustConfirmationsRequired() internal -``` - -### getOwners - -```solidity -function getOwners() public view returns (address[]) -``` - -### getOwnerChangeCount - -```solidity -function getOwnerChangeCount() public view returns (uint256) -``` - -### getOwnerChange - -```solidity -function getOwnerChange(uint256 changeId) public view returns (address owner, bool add, bool executed, uint256 confirmations) -``` - -### getTransactionCount - -```solidity -function getTransactionCount() public view returns (uint256) -``` - -### getTransaction +#### Return Values -```solidity -function getTransaction(uint256 transactionIndex) public view returns (address to, uint256 value, bytes data, bool executed, uint256 confirmations) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolIds | uint32[5] | The next five compoundable pool IDs | ## CasimirPool @@ -1802,12 +1585,6 @@ function setFunctionsAddress(address functionsAddress) external function getFeePercent() external view returns (uint32) ``` -### getTotalDeposits - -```solidity -function getTotalDeposits() external view returns (uint256) -``` - ### getRequestedExits ```solidity @@ -1850,22 +1627,10 @@ function getBufferedBalance() external view returns (uint256) function getExpectedEffectiveBalance() external view returns (uint256) ``` -### getReportPeriod +### getFinalizableCompletedExits ```solidity -function getReportPeriod() external view returns (uint32) -``` - -### getFinalizableCompletedExits - -```solidity -function getFinalizableCompletedExits() external view returns (uint256) -``` - -### getFinalizableExitedBalance - -```solidity -function getFinalizableExitedBalance() external view returns (uint256) +function getFinalizableCompletedExits() external view returns (uint256) ``` ### getLatestActiveBalance @@ -1880,6 +1645,12 @@ function getLatestActiveBalance() external view returns (uint256) function getLatestActiveBalanceAfterFees() external view returns (uint256) ``` +### getReportPeriod + +```solidity +function getReportPeriod() external view returns (uint256) +``` + ### getPendingWithdrawalEligibility ```solidity @@ -1898,12 +1669,6 @@ function getWithdrawableBalance() external view returns (uint256) function getPrepoolBalance() external view returns (uint256) ``` -### getSweptBalance - -```solidity -function getSweptBalance() external view returns (uint256) -``` - ### getUserStake ```solidity @@ -1958,167 +1723,16 @@ function getUpkeepAddress() external view returns (address) function getUpkeepBalance() external view returns (uint256 upkeepBalance) ``` -## ICasimirMultisig - -### Deposit - -```solidity -event Deposit(address sender, uint256 amount, uint256 balance) -``` - -### SubmitOwnerChange - -```solidity -event SubmitOwnerChange(address owner, uint256 changeId, bool add) -``` - -### ConfirmOwnerChange - -```solidity -event ConfirmOwnerChange(address owner, uint256 changeId) -``` - -### RevokeOwnerChangeConfirmation - -```solidity -event RevokeOwnerChangeConfirmation(address owner, uint256 changeId) -``` - -### ExecuteOwnerChange - -```solidity -event ExecuteOwnerChange(address owner, uint256 changeId) -``` - -### SubmitTransaction - -```solidity -event SubmitTransaction(address owner, uint256 txIndex, address to, uint256 value, bytes data) -``` - -### ConfirmTransaction - -```solidity -event ConfirmTransaction(address owner, uint256 txIndex) -``` - -### RevokeTransactionConfirmation - -```solidity -event RevokeTransactionConfirmation(address owner, uint256 txIndex) -``` - -### ExecuteTransaction - -```solidity -event ExecuteTransaction(address owner, uint256 txIndex) -``` - -### OwnerChange - -```solidity -struct OwnerChange { - address owner; - bool add; - bool executed; - uint256 confirmations; -} -``` - -### Transaction - -```solidity -struct Transaction { - address to; - uint256 value; - bytes data; - bool executed; - uint256 confirmations; -} -``` - -### receive - -```solidity -receive() external payable -``` - -### submitOwnerChange - -```solidity -function submitOwnerChange(address owner, bool add) external -``` - -### confirmOwnerChange - -```solidity -function confirmOwnerChange(uint256 changeId) external -``` - -### executeOwnerChange - -```solidity -function executeOwnerChange(uint256 changeId) external -``` - -### revokeOwnerChangeConfirmation - -```solidity -function revokeOwnerChangeConfirmation(uint256 changeId) external -``` - -### submitTransaction - -```solidity -function submitTransaction(address to, uint256 value, bytes data) external -``` - -### confirmTransaction - -```solidity -function confirmTransaction(uint256 transactionIndex) external -``` - -### executeTransaction - -```solidity -function executeTransaction(uint256 transactionIndex) external -``` - -### revokeTransactionConfirmation - -```solidity -function revokeTransactionConfirmation(uint256 transactionIndex) external -``` - -### getOwners - -```solidity -function getOwners() external view returns (address[]) -``` - -### getOwnerChangeCount - -```solidity -function getOwnerChangeCount() external view returns (uint256) -``` - -### getOwnerChange - -```solidity -function getOwnerChange(uint256 changeId) external view returns (address owner, bool add, bool executed, uint256 confirmations) -``` - -### getTransactionCount +### getSweptBalance ```solidity -function getTransactionCount() external view returns (uint256) +function getSweptBalance(uint256 startIndex, uint256 endIndex) external view returns (uint256) ``` -### getTransaction +### getCompoundablePoolIds ```solidity -function getTransaction(uint256 transactionIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 confirmations) +function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5]) ``` ## ICasimirPool @@ -2440,50 +2054,6 @@ _Send ETH to a user_ | user | address | The user address | | amount | uint256 | The amount of stake to send | -## MockFunctionsOracle - -### constructor - -```solidity -constructor() public -``` - -### getRegistry - -```solidity -function getRegistry() external view returns (address) -``` - -Returns the address of the registry contract - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | address | address The address of the registry contract | - -### sendRequest - -```solidity -function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) -``` - -Sends a request (encoded as data) using the provided subscriptionId - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| _gasLimit | uint32 | Gas limit for the fulfillment callback | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | A unique request identifier (unique per DON) | - ## IDepositContract ### DepositEvent @@ -2580,6 +2150,395 @@ struct RegistrationParams { function registerUpkeep(struct KeeperRegistrarInterface.RegistrationParams requestParams) external returns (uint256) ``` +## CasimirMultisig + +### owners + +```solidity +address[] owners +``` + +### isOwner + +```solidity +mapping(address => bool) isOwner +``` + +### confirmationsRequired + +```solidity +uint256 confirmationsRequired +``` + +### isOwnerChangeConfirmed + +```solidity +mapping(uint256 => mapping(address => bool)) isOwnerChangeConfirmed +``` + +### isTransactionConfirmed + +```solidity +mapping(uint256 => mapping(address => bool)) isTransactionConfirmed +``` + +### ownerChanges + +```solidity +struct ICasimirMultisig.OwnerChange[] ownerChanges +``` + +### transactions + +```solidity +struct ICasimirMultisig.Transaction[] transactions +``` + +### onlyOwner + +```solidity +modifier onlyOwner() +``` + +### ownerChangeExists + +```solidity +modifier ownerChangeExists(uint256 changeId) +``` + +### ownerChangeNotExecuted + +```solidity +modifier ownerChangeNotExecuted(uint256 changeId) +``` + +### ownerChangeNotConfirmed + +```solidity +modifier ownerChangeNotConfirmed(uint256 changeId) +``` + +### transactionExists + +```solidity +modifier transactionExists(uint256 transactionIndex) +``` + +### transactionNotExecuted + +```solidity +modifier transactionNotExecuted(uint256 transactionIndex) +``` + +### transactionNotConfirmed + +```solidity +modifier transactionNotConfirmed(uint256 transactionIndex) +``` + +### constructor + +```solidity +constructor(address[] _owners) public +``` + +### receive + +```solidity +receive() external payable +``` + +### submitOwnerChange + +```solidity +function submitOwnerChange(address owner, bool add) public +``` + +### confirmOwnerChange + +```solidity +function confirmOwnerChange(uint256 changeId) public +``` + +### executeOwnerChange + +```solidity +function executeOwnerChange(uint256 changeId) public +``` + +### revokeOwnerChangeConfirmation + +```solidity +function revokeOwnerChangeConfirmation(uint256 changeId) public +``` + +### submitTransaction + +```solidity +function submitTransaction(address to, uint256 value, bytes data) public +``` + +### confirmTransaction + +```solidity +function confirmTransaction(uint256 transactionIndex) public +``` + +### executeTransaction + +```solidity +function executeTransaction(uint256 transactionIndex) public +``` + +### revokeTransactionConfirmation + +```solidity +function revokeTransactionConfirmation(uint256 transactionIndex) public +``` + +### adjustConfirmationsRequired + +```solidity +function adjustConfirmationsRequired() internal +``` + +### getOwners + +```solidity +function getOwners() public view returns (address[]) +``` + +### getOwnerChangeCount + +```solidity +function getOwnerChangeCount() public view returns (uint256) +``` + +### getOwnerChange + +```solidity +function getOwnerChange(uint256 changeId) public view returns (address owner, bool add, bool executed, uint256 confirmations) +``` + +### getTransactionCount + +```solidity +function getTransactionCount() public view returns (uint256) +``` + +### getTransaction + +```solidity +function getTransaction(uint256 transactionIndex) public view returns (address to, uint256 value, bytes data, bool executed, uint256 confirmations) +``` + +## ICasimirMultisig + +### Deposit + +```solidity +event Deposit(address sender, uint256 amount, uint256 balance) +``` + +### SubmitOwnerChange + +```solidity +event SubmitOwnerChange(address owner, uint256 changeId, bool add) +``` + +### ConfirmOwnerChange + +```solidity +event ConfirmOwnerChange(address owner, uint256 changeId) +``` + +### RevokeOwnerChangeConfirmation + +```solidity +event RevokeOwnerChangeConfirmation(address owner, uint256 changeId) +``` + +### ExecuteOwnerChange + +```solidity +event ExecuteOwnerChange(address owner, uint256 changeId) +``` + +### SubmitTransaction + +```solidity +event SubmitTransaction(address owner, uint256 txIndex, address to, uint256 value, bytes data) +``` + +### ConfirmTransaction + +```solidity +event ConfirmTransaction(address owner, uint256 txIndex) +``` + +### RevokeTransactionConfirmation + +```solidity +event RevokeTransactionConfirmation(address owner, uint256 txIndex) +``` + +### ExecuteTransaction + +```solidity +event ExecuteTransaction(address owner, uint256 txIndex) +``` + +### OwnerChange + +```solidity +struct OwnerChange { + address owner; + bool add; + bool executed; + uint256 confirmations; +} +``` + +### Transaction + +```solidity +struct Transaction { + address to; + uint256 value; + bytes data; + bool executed; + uint256 confirmations; +} +``` + +### receive + +```solidity +receive() external payable +``` + +### submitOwnerChange + +```solidity +function submitOwnerChange(address owner, bool add) external +``` + +### confirmOwnerChange + +```solidity +function confirmOwnerChange(uint256 changeId) external +``` + +### executeOwnerChange + +```solidity +function executeOwnerChange(uint256 changeId) external +``` + +### revokeOwnerChangeConfirmation + +```solidity +function revokeOwnerChangeConfirmation(uint256 changeId) external +``` + +### submitTransaction + +```solidity +function submitTransaction(address to, uint256 value, bytes data) external +``` + +### confirmTransaction + +```solidity +function confirmTransaction(uint256 transactionIndex) external +``` + +### executeTransaction + +```solidity +function executeTransaction(uint256 transactionIndex) external +``` + +### revokeTransactionConfirmation + +```solidity +function revokeTransactionConfirmation(uint256 transactionIndex) external +``` + +### getOwners + +```solidity +function getOwners() external view returns (address[]) +``` + +### getOwnerChangeCount + +```solidity +function getOwnerChangeCount() external view returns (uint256) +``` + +### getOwnerChange + +```solidity +function getOwnerChange(uint256 changeId) external view returns (address owner, bool add, bool executed, uint256 confirmations) +``` + +### getTransactionCount + +```solidity +function getTransactionCount() external view returns (uint256) +``` + +### getTransaction + +```solidity +function getTransaction(uint256 transactionIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 confirmations) +``` + +## MockFunctionsOracle + +### constructor + +```solidity +constructor() public +``` + +### getRegistry + +```solidity +function getRegistry() external view returns (address) +``` + +Returns the address of the registry contract + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | address | address The address of the registry contract | + +### sendRequest + +```solidity +function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) +``` + +Sends a request (encoded as data) using the provided subscriptionId + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | +| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| _gasLimit | uint32 | Gas limit for the fulfillment callback | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | A unique request identifier (unique per DON) | + ## CasimirDAO ### owners diff --git a/contracts/ethereum/scripts/deploy.ts b/contracts/ethereum/scripts/deploy.ts index e69de29bb..9668266e2 100644 --- a/contracts/ethereum/scripts/deploy.ts +++ b/contracts/ethereum/scripts/deploy.ts @@ -0,0 +1,49 @@ +import { deployContract } from '@casimir/ethereum/helpers/deploy' +import { ContractConfig, DeploymentConfig } from '@casimir/types' + +void async function () { + const config: DeploymentConfig = { + CasimirManager: { + address: '', + args: { + oracleAddress: process.env.ORACLE_ADDRESS, + beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, + linkFunctionsAddress: process.env.LINK_FUNCTIONS_ADDRESS, + linkRegistrarAddress: process.env.LINK_REGISTRAR_ADDRESS, + linkRegistryAddress: process.env.LINK_REGISTRY_ADDRESS, + linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, + ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, + ssvNetworkViewsAddress: process.env.SSV_NETWORK_VIEWS_ADDRESS, + ssvTokenAddress: process.env.SSV_TOKEN_ADDRESS, + swapFactoryAddress: process.env.SWAP_FACTORY_ADDRESS, + swapRouterAddress: process.env.SWAP_ROUTER_ADDRESS, + wethTokenAddress: process.env.WETH_TOKEN_ADDRESS + }, + options: {}, + proxy: false + }, + CasimirViews: { + address: '', + args: { + managerAddress: '' + }, + options: {}, + proxy: false + } + } + + for (const name in config) { + if (name === 'CasimirViews') { + (config[name as keyof typeof config] as ContractConfig).args.managerAddress = config.CasimirManager.address + } + + const { args, options, proxy } = config[name as keyof typeof config] as ContractConfig + + const contract = await deployContract(name, proxy, args, options) + const { address } = contract + + console.log(`${name} contract deployed to ${address}`) + + ;(config[name as keyof DeploymentConfig] as ContractConfig).address = address + } +}() \ No newline at end of file diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index a4a91a62e..1d840c67e 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -30,6 +30,14 @@ void async function () { }, options: {}, proxy: false + }, + CasimirViews: { + address: '', + args: { + managerAddress: '' + }, + options: {}, + proxy: false } } @@ -47,9 +55,6 @@ void async function () { } for (const name in config) { - console.log(`Deploying ${name} contract...`) - - /** Link mock external contracts to Casimir */ if (name === 'CasimirManager') { (config[name as keyof typeof config] as ContractConfig).args.linkFunctionsAddress = config.MockFunctionsOracle?.address } @@ -59,11 +64,9 @@ void async function () { const contract = await deployContract(name, proxy, args, options) const { address } = contract - // Semi-colon needed - console.log(`${name} contract deployed to ${address}`); + console.log(`${name} contract deployed to ${address}`) - // Save contract address for next loop - (config[name as keyof DeploymentConfig] as ContractConfig).address = address + ;(config[name as keyof DeploymentConfig] as ContractConfig).address = address } const manager = await ethers.getContractAt('CasimirManager', config.CasimirManager.address as string) as CasimirManager diff --git a/contracts/ethereum/src/v1/CasimirManager.sol b/contracts/ethereum/src/v1/CasimirManager.sol index 4271ece49..7623fc506 100644 --- a/contracts/ethereum/src/v1/CasimirManager.sol +++ b/contracts/ethereum/src/v1/CasimirManager.sol @@ -15,7 +15,6 @@ import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/utils/math/Math.sol"; -import "@openzeppelin/contracts/utils/math/SafeCast.sol"; import "@uniswap/v3-core/contracts/interfaces/IUniswapV3Factory.sol"; import "@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol"; import "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol"; @@ -47,9 +46,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /*************/ /** User action period */ - uint256 public constant actionPeriod = 1 days; + uint256 private constant actionPeriod = 1 days; /** Max user actions per period */ - uint256 public constant maxActionsPerPeriod = 5; + uint256 private constant maxActionsPerPeriod = 5; /** Compound minimum (0.1 ETH) */ uint256 private constant compoundMinimum = 100000000 gwei; /** Minimum balance for upkeep registration (0.1 LINK) */ @@ -163,7 +162,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { modifier onlyPool(uint32 poolId) { require( msg.sender == poolAddresses[poolId], - "Only authorized pool can call this function" + "Not pool" ); _; } @@ -174,7 +173,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { modifier onlyOracle() { require( msg.sender == oracleAddress, - "Only manager oracle can call this function" + "Not oracle" ); _; } @@ -185,7 +184,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { modifier onlyOracleOrUpkeep() { require( msg.sender == oracleAddress || msg.sender == address(upkeep), - "Only manager oracle or upkeep can call this function" + "Not oracle or upkeep" ); _; } @@ -196,7 +195,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { modifier onlyRegistry() { require( msg.sender == address(registry), - "Only registry can call this function" + "Not registry" ); _; } @@ -207,21 +206,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { modifier onlyUpkeep() { require( msg.sender == address(upkeep), - "Only upkeep can call this function" - ); - _; - } - - /** - * @dev Validate a user action - */ - modifier validAction() { - User storage user = users[msg.sender]; - require( - user.actionPeriodTimestamp == 0 || - user.actionCount < maxActionsPerPeriod || - block.timestamp >= user.actionPeriodTimestamp + actionPeriod, - "User action period not elapsed" + "Not upkeep" ); _; } @@ -232,7 +217,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { modifier validDeposit() { require( msg.value >= stakeMinimum, - "Deposit must be greater than minimum" + "Deposit less than minimum" ); _; } @@ -243,7 +228,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { modifier validWithdrawal(uint256 amount) { require( amount >= stakeMinimum, - "Withdrawal must be greater than minimum" + "Withdrawal less than minimum" ); _; } @@ -253,7 +238,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param amount The amount to validate */ modifier validDistribution(uint256 amount) { - require(amount > 0, "Distribution must be greater than zero"); + require(amount > 0, "Distribution amount is zero"); _; } @@ -316,15 +301,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Deposit user stake */ - function depositStake() external payable nonReentrant validAction validDeposit { + function depositStake() external payable nonReentrant validDeposit { + setActionCount(msg.sender); User storage user = users[msg.sender]; - if (block.timestamp >= user.actionPeriodTimestamp + actionPeriod) { - user.actionPeriodTimestamp = block.timestamp; - user.actionCount = 1; - } else { - user.actionCount++; - } - uint256 depositAfterFees = subtractFees(msg.value); reservedFeeBalance += msg.value - depositAfterFees; @@ -456,7 +435,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function withdrawReservedFees(uint256 amount) external onlyOwner { require( amount <= reservedFeeBalance, - "Withdrawing more than reserved fees" + "Withdrawing more than reserved" ); reservedFeeBalance -= amount; owner().send(amount); @@ -505,7 +484,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { int256 change = rewards - latestActiveRewardBalance; if (change > 0) { - uint256 gain = SafeCast.toUint256(change); + uint256 gain = uint256(change); if (rewards > 0) { uint256 gainAfterFees = subtractFees(gain); stakeRatioSum += Math.mulDiv( @@ -527,7 +506,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { emit StakeRebalanced(gain); } } else if (change < 0) { - uint256 loss = SafeCast.toUint256(-change); + uint256 loss = uint256(-change); stakeRatioSum -= Math.mulDiv(stakeRatioSum, loss, getTotalStake()); latestActiveBalanceAfterFees -= loss; @@ -567,14 +546,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function requestWithdrawal( uint256 amount - ) external nonReentrant validAction validWithdrawal(amount) { + ) external nonReentrant validWithdrawal(amount) { + setActionCount(msg.sender); User storage user = users[msg.sender]; - if (block.timestamp >= user.actionPeriodTimestamp + actionPeriod) { - user.actionPeriodTimestamp = block.timestamp; - user.actionCount = 1; - } else { - user.actionCount++; - } user.stake0 = getUserStake(msg.sender); require( user.stake0 >= amount, @@ -660,6 +634,26 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { emit WithdrawalFulfilled(sender, amount); } + /** + * Check and set a user's action count + * @param userAddress The user address to check + */ + function setActionCount(address userAddress) private { + User storage user = users[userAddress]; + require( + user.actionPeriodTimestamp == 0 || + user.actionCount < maxActionsPerPeriod || + block.timestamp >= user.actionPeriodTimestamp + actionPeriod, + "User action period maximum reached" + ); + if (block.timestamp >= user.actionPeriodTimestamp + actionPeriod) { + user.actionPeriodTimestamp = block.timestamp; + user.actionCount = 1; + } else { + user.actionCount++; + } + } + /** * @notice Initiate the next ready pool * @param depositDataRoot The deposit data root @@ -1332,47 +1326,4 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function getUpkeepBalance() external view returns (uint256 upkeepBalance) { upkeepBalance = linkRegistry.getUpkeep(upkeepId).balance; } - - /** - * @notice Get the swept balance - * @dev Should be called off-chain - * @param startIndex The start index - * @param endIndex The end index - * @return balance The swept balance - */ - function getSweptBalance( - uint256 startIndex, - uint256 endIndex - ) public view returns (uint256 balance) { - for (uint256 i = startIndex; i <= endIndex; i++) { - uint32 poolId = stakedPoolIds[i]; - ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); - balance += pool.getBalance(); - } - } - - /** - * @notice Get the next five compoundable pool IDs - * @dev Should be called off-chain - * @param startIndex The start index - * @param endIndex The end index - * @return poolIds The next five compoundable pool IDs - */ - function getCompoundablePoolIds( - uint256 startIndex, - uint256 endIndex - ) external view returns (uint32[5] memory poolIds) { - uint256 count = 0; - for (uint256 i = startIndex; i <= endIndex; i++) { - uint32 poolId = stakedPoolIds[i]; - ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); - if (pool.getBalance() >= compoundMinimum) { - poolIds[count] = poolId; - count++; - if (count == 5) { - break; - } - } - } - } } diff --git a/contracts/ethereum/src/v1/CasimirViews.sol b/contracts/ethereum/src/v1/CasimirViews.sol new file mode 100644 index 000000000..ca405a76a --- /dev/null +++ b/contracts/ethereum/src/v1/CasimirViews.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; + +import './interfaces/ICasimirViews.sol'; +import './interfaces/ICasimirManager.sol'; + +contract CasimirViews is ICasimirViews { + /*************/ + /* Constants */ + /*************/ + + /** Compound minimum (0.1 ETH) */ + uint256 private constant compoundMinimum = 100000000 gwei; + + /*************/ + /* Immutable */ + /*************/ + + /** Manager contract */ + ICasimirManager private immutable manager; + + constructor(address managerAddress) { + manager = ICasimirManager(managerAddress); + } + + /** + * @notice Get the next five compoundable pool IDs + * @dev Should be called off-chain + * @param startIndex The start index + * @param endIndex The end index + * @return poolIds The next five compoundable pool IDs + */ + function getCompoundablePoolIds( + uint256 startIndex, + uint256 endIndex + ) external view returns (uint32[5] memory poolIds) { + uint32[] memory stakedPoolIds = manager.getStakedPoolIds(); + uint256 count = 0; + for (uint256 i = startIndex; i <= endIndex; i++) { + uint32 poolId = stakedPoolIds[i]; + ICasimirPool pool = ICasimirPool(manager.getPoolAddress(poolId)); + if (pool.getBalance() >= compoundMinimum) { + poolIds[count] = poolId; + count++; + if (count == 5) { + break; + } + } + } + } + + /** + * @notice Get the swept balance + * @dev Should be called off-chain + * @param startIndex The start index + * @param endIndex The end index + * @return balance The swept balance + */ + function getSweptBalance( + uint256 startIndex, + uint256 endIndex + ) public view returns (uint256 balance) { + for (uint256 i = startIndex; i <= endIndex; i++) { + uint32[] memory stakedPoolIds = manager.getStakedPoolIds(); + uint32 poolId = stakedPoolIds[i]; + ICasimirPool pool = ICasimirPool(manager.getPoolAddress(poolId)); + balance += pool.getBalance(); + } + } +} \ No newline at end of file diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol index 3a9e043b0..244b17a55 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol @@ -149,13 +149,4 @@ interface ICasimirManager { function getUpkeepId() external view returns (uint256); function getUpkeepAddress() external view returns (address); function getUpkeepBalance() external view returns (uint256 upkeepBalance); - function getSweptBalance( - uint256 startIndex, - uint256 endIndex - ) external view returns (uint256); - function getCompoundablePoolIds( - uint256 startIndex, - uint256 endIndex - ) external view returns (uint32[5] memory); - } diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirViews.sol b/contracts/ethereum/src/v1/interfaces/ICasimirViews.sol new file mode 100644 index 000000000..cdc90e9e5 --- /dev/null +++ b/contracts/ethereum/src/v1/interfaces/ICasimirViews.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: Apache +pragma solidity 0.8.18; + +interface ICasimirViews { + function getCompoundablePoolIds( + uint256 startIndex, + uint256 endIndex + ) external view returns (uint32[5] memory); + function getSweptBalance( + uint256 startIndex, + uint256 endIndex + ) external view returns (uint256); +} \ No newline at end of file diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 4f377a764..cde4762c6 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -30,6 +30,14 @@ export async function deploymentFixture() { }, options: {}, proxy: false + }, + CasimirViews: { + address: '', + args: { + managerAddress: '' + }, + options: {}, + proxy: false } } @@ -47,11 +55,10 @@ export async function deploymentFixture() { } for (const name in config) { - console.log(`Deploying ${name} contract...`) - - /** Link mock external contracts to Casimir */ if (name === 'CasimirManager') { (config[name as keyof typeof config] as ContractConfig).args.linkFunctionsAddress = config.MockFunctionsOracle?.address + } else if (name === 'CasimirViews') { + (config[name as keyof typeof config] as ContractConfig).args.managerAddress = config.CasimirManager.address } const { args, options, proxy } = config[name as keyof typeof config] as ContractConfig @@ -59,11 +66,9 @@ export async function deploymentFixture() { const contract = await deployContract(name, proxy, args, options) const { address } = contract - // Semi-colon needed - console.log(`${name} contract deployed to ${address}`); + console.log(`${name} contract deployed to ${address}`) - // Save contract address for next loop - (config[name as keyof DeploymentConfig] as ContractConfig).address = address + ;(config[name as keyof DeploymentConfig] as ContractConfig).address = address } const manager = await ethers.getContractAt('CasimirManager', config.CasimirManager.address as string) as CasimirManager From 39df20195f34ab635092018cc7c7a137aa54d9f9 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Tue, 6 Jun 2023 15:42:13 -0400 Subject: [PATCH 56/78] Add registry-triggered reshare requests --- contracts/ethereum/docs/index.md | 150 ++++++++---------- contracts/ethereum/src/v1/CasimirManager.sol | 124 +++++++-------- contracts/ethereum/src/v1/CasimirRegistry.sol | 126 ++++++++++++--- contracts/ethereum/src/v1/CasimirViews.sol | 27 +++- .../src/v1/interfaces/ICasimirManager.sol | 4 +- .../src/v1/interfaces/ICasimirRegistry.sol | 6 +- 6 files changed, 261 insertions(+), 176 deletions(-) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index e15276c47..58dedd913 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -2,22 +2,6 @@ ## CasimirManager -### actionPeriod - -```solidity -uint256 actionPeriod -``` - -User action period - -### maxActionsPerPeriod - -```solidity -uint256 maxActionsPerPeriod -``` - -Max user actions per period - ### upkeepRegistrationMinimum ```solidity @@ -74,14 +58,6 @@ modifier onlyUpkeep() _Validate the caller is the upkeep contract_ -### validAction - -```solidity -modifier validAction() -``` - -_Validate a user action_ - ### validDeposit ```solidity @@ -858,52 +834,6 @@ Get the upkeep balance | ---- | ---- | ----------- | | upkeepBalance | uint256 | The upkeep balance | -### getSweptBalance - -```solidity -function getSweptBalance(uint256 startIndex, uint256 endIndex) public view returns (uint256 balance) -``` - -Get the swept balance - -_Should be called off-chain_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| balance | uint256 | The swept balance | - -### getCompoundablePoolIds - -```solidity -function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5] poolIds) -``` - -Get the next five compoundable pool IDs - -_Should be called off-chain_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolIds | uint32[5] | The next five compoundable pool IDs | - ## CasimirPool ### poolCapacity @@ -1312,6 +1242,60 @@ Fulfill the request for testing | response | bytes | Aggregated response from the user code | | err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | +## CasimirViews + +### constructor + +```solidity +constructor(address managerAddress) public +``` + +### getCompoundablePoolIds + +```solidity +function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5] poolIds) +``` + +Get the next five compoundable pool IDs + +_Should be called off-chain_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolIds | uint32[5] | The next five compoundable pool IDs | + +### getSweptBalance + +```solidity +function getSweptBalance(uint256 startIndex, uint256 endIndex) public view returns (uint256 balance) +``` + +Get the swept balance + +_Should be called off-chain_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| balance | uint256 | The swept balance | + ## ICasimirManager ### Token @@ -1723,18 +1707,6 @@ function getUpkeepAddress() external view returns (address) function getUpkeepBalance() external view returns (uint256 upkeepBalance) ``` -### getSweptBalance - -```solidity -function getSweptBalance(uint256 startIndex, uint256 endIndex) external view returns (uint256) -``` - -### getCompoundablePoolIds - -```solidity -function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5]) -``` - ## ICasimirPool ### PoolConfig @@ -1986,6 +1958,20 @@ function setOracleAddress(address oracleAddress) external function mockFulfillRequest(bytes32 requestId, bytes result, bytes err) external ``` +## ICasimirViews + +### getCompoundablePoolIds + +```solidity +function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5]) +``` + +### getSweptBalance + +```solidity +function getSweptBalance(uint256 startIndex, uint256 endIndex) external view returns (uint256) +``` + ## Types32Array ### remove diff --git a/contracts/ethereum/src/v1/CasimirManager.sol b/contracts/ethereum/src/v1/CasimirManager.sol index 7623fc506..d63e7bcb2 100644 --- a/contracts/ethereum/src/v1/CasimirManager.sol +++ b/contracts/ethereum/src/v1/CasimirManager.sol @@ -105,10 +105,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint256 private latestActiveBalanceAfterFees; /** Latest active rewards */ int256 private latestActiveRewardBalance; - /** Requested pool exit reports */ - uint256 private requestedCompletedExitReports; - /** Requested pool unexpected exit reports */ - uint256 private requestedForcedExitReports; /** Exited balance */ uint256 private finalizableExitedBalance; /** Exited pool count */ @@ -160,10 +156,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @dev Validate the caller is the authorized pool */ modifier onlyPool(uint32 poolId) { - require( - msg.sender == poolAddresses[poolId], - "Not pool" - ); + require(msg.sender == poolAddresses[poolId], "Not pool"); _; } @@ -171,9 +164,17 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @dev Validate the caller is the manager oracle */ modifier onlyOracle() { + require(msg.sender == oracleAddress, "Not oracle"); + _; + } + + /** + * @dev Validate the caller is the oracle or registry + */ + modifier onlyOracleOrRegistry() { require( - msg.sender == oracleAddress, - "Not oracle" + msg.sender == oracleAddress || msg.sender == address(registry), + "Not owner or registry" ); _; } @@ -193,10 +194,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @dev Validate the caller is the registry */ modifier onlyRegistry() { - require( - msg.sender == address(registry), - "Not registry" - ); + require(msg.sender == address(registry), "Not registry"); _; } @@ -204,10 +202,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @dev Validate the caller is the upkeep contract */ modifier onlyUpkeep() { - require( - msg.sender == address(upkeep), - "Not upkeep" - ); + require(msg.sender == address(upkeep), "Not upkeep"); _; } @@ -215,10 +210,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @dev Validate a deposit */ modifier validDeposit() { - require( - msg.value >= stakeMinimum, - "Deposit less than minimum" - ); + require(msg.value >= stakeMinimum, "Deposit less than minimum"); _; } @@ -226,10 +218,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @dev Validate a withdrawal */ modifier validWithdrawal(uint256 amount) { - require( - amount >= stakeMinimum, - "Withdrawal less than minimum" - ); + require(amount >= stakeMinimum, "Withdrawal less than minimum"); _; } @@ -241,7 +230,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { require(amount > 0, "Distribution amount is zero"); _; } - + /** * @notice Constructor * @param _oracleAddress The manager oracle address @@ -380,7 +369,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint256 feeAmount, bool processed ) external onlyOracle { - uint256 ssvAmount = retrieveFees(feeAmount, tokenAddresses[Token.SSV], processed); + uint256 ssvAmount = retrieveFees( + feeAmount, + tokenAddresses[Token.SSV], + processed + ); ssvToken.approve(address(ssvNetwork), ssvAmount); ssvNetwork.deposit(address(this), operatorIds, ssvAmount, cluster); } @@ -394,7 +387,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint256 feeAmount, bool processed ) external onlyOracleOrUpkeep { - uint256 linkAmount = retrieveFees(feeAmount, tokenAddresses[Token.LINK], processed); + uint256 linkAmount = retrieveFees( + feeAmount, + tokenAddresses[Token.LINK], + processed + ); linkToken.approve(address(linkRegistrar), linkAmount); if (upkeepId == 0) { if (linkAmount < upkeepRegistrationMinimum) { @@ -433,10 +430,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param amount The amount of fees to withdraw */ function withdrawReservedFees(uint256 amount) external onlyOwner { - require( - amount <= reservedFeeBalance, - "Withdrawing more than reserved" - ); + require(amount <= reservedFeeBalance, "Withdrawing more than reserved"); reservedFeeBalance -= amount; owner().send(amount); } @@ -550,10 +544,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { setActionCount(msg.sender); User storage user = users[msg.sender]; user.stake0 = getUserStake(msg.sender); - require( - user.stake0 >= amount, - "Withdrawing more than user stake" - ); + require(user.stake0 >= amount, "Withdrawing more than user stake"); user.stakeRatioSum0 = stakeRatioSum; user.stake0 -= amount; @@ -642,8 +633,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { User storage user = users[userAddress]; require( user.actionPeriodTimestamp == 0 || - user.actionCount < maxActionsPerPeriod || - block.timestamp >= user.actionPeriodTimestamp + actionPeriod, + user.actionCount < maxActionsPerPeriod || + block.timestamp >= user.actionPeriodTimestamp + actionPeriod, "User action period maximum reached" ); if (block.timestamp >= user.actionPeriodTimestamp + actionPeriod) { @@ -726,7 +717,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ); require( keccak256(computedWithdrawalCredentials) == - keccak256(withdrawalCredentials), + keccak256(withdrawalCredentials), "Invalid withdrawal credentials" ); } @@ -754,7 +745,11 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { depositDataRoot ); - uint256 ssvAmount = retrieveFees(feeAmount, tokenAddresses[Token.SSV], processed); + uint256 ssvAmount = retrieveFees( + feeAmount, + tokenAddresses[Token.SSV], + processed + ); ssvToken.approve(address(ssvNetwork), ssvAmount); ssvNetwork.registerValidator( publicKey, @@ -810,12 +805,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @notice Request reports for a given count of pools forced to exit - * @param count The number of pools forced to exit + * @notice Request reports a given count of forced exits + * @param count The number of forced exits */ function requestForcedExitReports(uint256 count) external onlyUpkeep { - requestedForcedExitReports = count; - emit ForcedExitReportsRequested(count); } @@ -824,22 +817,23 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param count The number of completed exits */ function requestCompletedExitReports(uint256 count) external onlyUpkeep { - requestedCompletedExitReports = count; - emit CompletedExitReportsRequested(count); } + /** + * @notice Request reshares for an operator + * @param operatorId The operator ID + */ + function requestReshares(uint64 operatorId) external onlyOracleOrRegistry { + emit ResharesRequested(operatorId); + } + /** * @notice Report pool forced (unrequested) exits * @param poolIds The pool IDs */ function reportForcedExits(uint32[] memory poolIds) external onlyOracle { for (uint256 i = 0; i < poolIds.length; i++) { - require( - requestedForcedExitReports > 0, - "No requested forced exits" - ); - uint32 poolId = poolIds[i]; ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); ICasimirPool.PoolStatus poolStatus = pool.getStatus(); @@ -848,7 +842,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { "Forced exit already reported" ); - requestedForcedExitReports -= 1; forcedExits++; if (poolStatus == ICasimirPool.PoolStatus.EXITING_REQUESTED) { requestedExits--; @@ -868,10 +861,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint32[] memory blamePercents, ISSVNetworkCore.Cluster memory cluster ) external onlyOracle { - require( - requestedCompletedExitReports > 0, - "No requested pool withdrawn exit reports" - ); uint32 poolId = stakedPoolIds[poolIndex]; ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); ICasimirPool.PoolConfig memory poolConfig = pool.getConfig(); @@ -881,7 +870,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { "Pool not exiting" ); - requestedCompletedExitReports -= 1; stakedPoolIds.remove(poolIndex); uint64[] memory operatorIds = poolConfig.operatorIds; bytes memory publicKey = poolConfig.publicKey; @@ -931,20 +919,21 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ICasimirPool.PoolConfig memory poolConfig = pool.getConfig(); require( poolConfig.status == ICasimirPool.PoolStatus.PENDING || - poolConfig.status == ICasimirPool.PoolStatus.ACTIVE, + poolConfig.status == ICasimirPool.PoolStatus.ACTIVE, "Pool not active" ); - require( - poolConfig.reshares < 2, - "Pool already reshared twice" - ); + require(poolConfig.reshares < 2, "Pool already reshared twice"); pool.setReshares(poolConfig.reshares + 1); registry.removeOperatorPool(oldOperatorId, poolId, 0); registry.addOperatorPool(newOperatorId, poolId); - uint256 ssvAmount = retrieveFees(feeAmount, tokenAddresses[Token.SSV], processed); + uint256 ssvAmount = retrieveFees( + feeAmount, + tokenAddresses[Token.SSV], + processed + ); ssvToken.approve(address(ssvNetwork), ssvAmount); ssvNetwork.removeValidator( @@ -960,6 +949,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ssvAmount, cluster ); + + emit ReshareCompleted(poolId); } /** @@ -1190,7 +1181,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @param period The period to check * @return pendingWithdrawalEligibility The eligibility of a pending withdrawal */ - function getPendingWithdrawalEligibility(uint256 index, uint256 period) public view returns (bool) { + function getPendingWithdrawalEligibility( + uint256 index, + uint256 period + ) public view returns (bool) { if (requestedWithdrawals > index) { return requestedWithdrawalQueue[index].period <= period; } diff --git a/contracts/ethereum/src/v1/CasimirRegistry.sol b/contracts/ethereum/src/v1/CasimirRegistry.sol index 162ddeb1f..9008f56ca 100644 --- a/contracts/ethereum/src/v1/CasimirRegistry.sol +++ b/contracts/ethereum/src/v1/CasimirRegistry.sol @@ -14,10 +14,10 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { ICasimirManager private manager; ISSVNetworkViews private ssvNetworkViews; - uint256 requiredCollateral = 4 ether; - uint256 minimumCollateralDeposit = 100000000000000000; - uint256 totalCollateral; + uint256 private requiredCollateral = 4 ether; + uint256 private minimumCollateralDeposit = 100000000000000000; mapping(uint64 => Operator) private operators; + uint64[] private operatorIds; /*************/ /* Modifiers */ @@ -29,7 +29,7 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { modifier onlyOwnerOrPool(uint32 poolId) { require( msg.sender == owner() || - msg.sender == manager.getPoolAddress(poolId), + msg.sender == manager.getPoolAddress(poolId), "Only owner or the authorized pool can call this function" ); _; @@ -45,12 +45,19 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { * @param operatorId The operator ID */ function registerOperator(uint64 operatorId) external payable { - require(msg.value >= requiredCollateral, "Insufficient registration collateral"); - (address operatorOwner, , , ,) = ssvNetworkViews.getOperatorById(operatorId); - require(msg.sender == operatorOwner, "Only operator owner can register"); + require( + msg.value >= requiredCollateral, + "Insufficient registration collateral" + ); + (address operatorOwner, , , , ) = ssvNetworkViews.getOperatorById( + operatorId + ); + require( + msg.sender == operatorOwner, + "Only operator owner can register" + ); - totalCollateral += msg.value; - Operator storage operator = operators[operatorId]; + Operator storage operator = operators[operatorId]; operator.active = true; operator.collateral = int256(msg.value); @@ -62,12 +69,24 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { * @param operatorId The operator ID */ function depositCollateral(uint64 operatorId) external payable { - require(msg.value > minimumCollateralDeposit, "Insufficient collateral deposit"); + require( + msg.value > minimumCollateralDeposit, + "Insufficient collateral deposit" + ); Operator storage operator = operators[operatorId]; - (address operatorOwner, , , ,) = ssvNetworkViews.getOperatorById(operatorId); - require(msg.sender == operatorOwner, "Only operator owner can deposit collateral"); + (address operatorOwner, , , , ) = ssvNetworkViews.getOperatorById( + operatorId + ); + require( + msg.sender == operatorOwner, + "Only operator owner can deposit collateral" + ); operator.collateral += int256(msg.value); + + if (operator.collateral >= int256(requiredCollateral)) { + operator.active = true; + } } /** @@ -77,12 +96,18 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { */ function withdrawCollateral(uint64 operatorId, uint256 amount) external { Operator storage operator = operators[operatorId]; - (address operatorOwner, , , ,) = ssvNetworkViews.getOperatorById(operatorId); - require(msg.sender == operatorOwner, "Only operator owner can withdraw collateral"); - require(operator.collateral >= int256(amount), "Insufficient collateral"); + (address operatorOwner, , , , ) = ssvNetworkViews.getOperatorById(operatorId); + require( + msg.sender == operatorOwner, + "Not operator owner" + ); + require( + !operator.active && !operator.resharing || + operator.collateral >= int256(requiredCollateral), + "Active or resharing" + ); operator.collateral -= int256(amount); - totalCollateral -= amount; operatorOwner.send(amount); } @@ -91,12 +116,15 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { * @param operatorId The operator ID * @param poolId The pool ID */ - function addOperatorPool(uint64 operatorId, uint32 poolId) external onlyOwner { + function addOperatorPool( + uint64 operatorId, + uint32 poolId + ) external onlyOwner { Operator storage operator = operators[operatorId]; - require(operator.active, "Operator is not active"); + require(operator.active, "Operator not active"); + require(!operator.resharing, "Operator resharing"); require(operator.collateral >= 0, "Operator owes collateral"); - require(!operator.deregistering, "Operator is deregistering"); - require(!operator.pools[poolId], "Pool is already active for operator"); + require(!operator.pools[poolId], "Pool already active"); operator.pools[poolId] = true; operator.poolCount += 1; } @@ -107,13 +135,22 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { * @param poolId The pool ID * @param blameAmount The amount to recover from collateral */ - function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external onlyOwnerOrPool(poolId) { + function removeOperatorPool( + uint64 operatorId, + uint32 poolId, + uint256 blameAmount + ) external onlyOwnerOrPool(poolId) { Operator storage operator = operators[operatorId]; require(operator.pools[poolId], "Pool is not active for operator"); operator.pools[poolId] = false; operator.poolCount -= 1; + if (operator.poolCount == 0 && operator.resharing) { + operator.active = false; + operator.resharing = false; + } + if (blameAmount > 0) { uint256 recoverableCollateral; if (operator.collateral >= int256(blameAmount)) { @@ -122,16 +159,55 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { recoverableCollateral = uint256(operator.collateral); } operator.collateral -= int256(blameAmount); + + if (operator.collateral < 0) { + operator.resharing = true; + manager.requestReshares(operatorId); + } + manager.depositRecoveredBalance{value: recoverableCollateral}(poolId); } } /** - * @notice Get the collateral for an operator + * @notice Request deregistration for an operator + * @param operatorId The operator ID + */ + function requestDeregistration(uint64 operatorId) external onlyOwner { + Operator storage operator = operators[operatorId]; + require(operator.active, "Operator is not active"); + require(!operator.resharing, "Operator is resharing"); + operator.resharing = true; + manager.requestReshares(operatorId); + } + + /** + * @notice Get the collateral of an operator * @param operatorId The operator ID - * @return The collateral + * @return collateral The collateral */ - function getOperatorCollateral(uint64 operatorId) external view returns (int256) { + function getOperatorCollateral( + uint64 operatorId + ) external view returns (int256 collateral) { return operators[operatorId].collateral; - } + } + + /** + * @notice Get the eligibility of an operator + * @param operatorId The operator ID + * @return eligibility The eligibility + */ + function getOperatorEligibility( + uint64 operatorId + ) external view returns (bool eligibility) { + return operators[operatorId].active && !operators[operatorId].resharing; + } + + /** + * @notice Get the operator IDs + * @return operatorIds The operator IDs + */ + function getOperatorIds() external view returns (uint64[] memory) { + return operatorIds; + } } \ No newline at end of file diff --git a/contracts/ethereum/src/v1/CasimirViews.sol b/contracts/ethereum/src/v1/CasimirViews.sol index ca405a76a..71a7071c6 100644 --- a/contracts/ethereum/src/v1/CasimirViews.sol +++ b/contracts/ethereum/src/v1/CasimirViews.sol @@ -3,6 +3,7 @@ pragma solidity 0.8.18; import './interfaces/ICasimirViews.sol'; import './interfaces/ICasimirManager.sol'; +import './interfaces/ICasimirRegistry.sol'; contract CasimirViews is ICasimirViews { /*************/ @@ -18,9 +19,12 @@ contract CasimirViews is ICasimirViews { /** Manager contract */ ICasimirManager private immutable manager; + /** Registry contract */ + ICasimirRegistry private immutable registry; - constructor(address managerAddress) { + constructor(address managerAddress, address registryAddress) { manager = ICasimirManager(managerAddress); + registry = ICasimirRegistry(registryAddress); } /** @@ -49,6 +53,27 @@ contract CasimirViews is ICasimirViews { } } + /** + * @notice Get the active operator IDs + * @param startIndex The start index + * @param endIndex The end index + * @return activeOperatorIds The active operator IDs + */ + function getEligibleOperatorIds( + uint256 startIndex, + uint256 endIndex + ) external view returns (uint64[] memory activeOperatorIds) { + uint64[] memory operatorIds = registry.getOperatorIds(); + uint256 count = 0; + for (uint256 i = startIndex; i <= endIndex; i++) { + uint64 operatorId = operatorIds[i]; + if (registry.getOperatorCollateral(operatorId) > 0 && registry.getOperatorEligibility(operatorId)) { + activeOperatorIds[count] = operatorId; + count++; + } + } + } + /** * @notice Get the swept balance * @dev Should be called off-chain diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol index 244b17a55..1f64c1a41 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol @@ -48,7 +48,7 @@ interface ICasimirManager { event DepositRequested(uint32 poolId); event DepositInitiated(uint32 poolId); event DepositActivated(uint32 poolId); - event ReshareRequested(uint32 poolId); + event ResharesRequested(uint64 operatorId); event ReshareCompleted(uint32 poolId); event ExitRequested(uint32 poolId); event ForcedExitReportsRequested(uint256 count); @@ -105,6 +105,8 @@ interface ICasimirManager { function activateDeposits(uint256 count) external; function requestForcedExitReports(uint256 count) external; function requestCompletedExitReports(uint256 count) external; + function requestReshares(uint64 operatorId) external; + function reportForcedExits(uint32[] memory poolIds) external; function reportCompletedExit( uint256 poolIndex, uint32[] memory blamePercents, diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirRegistry.sol b/contracts/ethereum/src/v1/interfaces/ICasimirRegistry.sol index 2482edbb3..8b70fd102 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirRegistry.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirRegistry.sol @@ -10,10 +10,10 @@ interface ICasimirRegistry { struct Operator { bool active; + bool resharing; int256 collateral; uint256 poolCount; mapping(uint32 => bool active) pools; - bool deregistering; } function registerOperator(uint64 operatorId) external payable; @@ -21,5 +21,7 @@ interface ICasimirRegistry { function withdrawCollateral(uint64 operatorId, uint256 amount) external; function addOperatorPool(uint64 operatorId, uint32 poolId) external; function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external; - function getOperatorCollateral(uint64 operatorId) external view returns (int256); + function getOperatorCollateral(uint64 operatorId) external view returns (int256); + function getOperatorEligibility(uint64 operatorId) external view returns (bool eligibility); + function getOperatorIds() external view returns (uint64[] memory); } \ No newline at end of file From c4b552c0142a96c64476487d5aedd2e87d63557a Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Tue, 6 Jun 2023 20:44:45 -0400 Subject: [PATCH 57/78] Simplify deployments --- contracts/ethereum/docs/index.md | 151 ++++++++++++++---- contracts/ethereum/helpers/deploy.ts | 21 --- contracts/ethereum/package.json | 2 + contracts/ethereum/scripts/deploy.ts | 69 ++++---- contracts/ethereum/scripts/dev.ts | 93 ++++------- contracts/ethereum/scripts/multisig.ts | 17 ++ contracts/ethereum/src/v1/CasimirMultisig.sol | 4 +- .../src/v1/interfaces/ICasimirMultisig.sol | 2 +- contracts/ethereum/test/fixtures/shared.ts | 96 +++++------ 9 files changed, 245 insertions(+), 210 deletions(-) delete mode 100644 contracts/ethereum/helpers/deploy.ts create mode 100644 contracts/ethereum/scripts/multisig.ts diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 58dedd913..8dc360dd0 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -34,6 +34,14 @@ modifier onlyOracle() _Validate the caller is the manager oracle_ +### onlyOracleOrRegistry + +```solidity +modifier onlyOracleOrRegistry() +``` + +_Validate the caller is the oracle or registry_ + ### onlyOracleOrUpkeep ```solidity @@ -320,13 +328,13 @@ Activate a given count of the next pending pools function requestForcedExitReports(uint256 count) external ``` -Request reports for a given count of pools forced to exit +Request reports a given count of forced exits #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| count | uint256 | The number of pools forced to exit | +| count | uint256 | The number of forced exits | ### requestCompletedExitReports @@ -342,6 +350,20 @@ Request reports for a given count of completed exits | ---- | ---- | ----------- | | count | uint256 | The number of completed exits | +### requestReshares + +```solidity +function requestReshares(uint64 operatorId) external +``` + +Request reshares for an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + ### reportForcedExits ```solidity @@ -910,24 +932,6 @@ function getStatus() external view returns (enum ICasimirPool.PoolStatus) ## CasimirRegistry -### requiredCollateral - -```solidity -uint256 requiredCollateral -``` - -### minimumCollateralDeposit - -```solidity -uint256 minimumCollateralDeposit -``` - -### totalCollateral - -```solidity -uint256 totalCollateral -``` - ### onlyOwnerOrPool ```solidity @@ -1016,13 +1020,27 @@ Remove a pool from an operator | poolId | uint32 | The pool ID | | blameAmount | uint256 | The amount to recover from collateral | +### requestDeregistration + +```solidity +function requestDeregistration(uint64 operatorId) external +``` + +Request deregistration for an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + ### getOperatorCollateral ```solidity -function getOperatorCollateral(uint64 operatorId) external view returns (int256) +function getOperatorCollateral(uint64 operatorId) external view returns (int256 collateral) ``` -Get the collateral for an operator +Get the collateral of an operator #### Parameters @@ -1034,7 +1052,41 @@ Get the collateral for an operator | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | int256 | The collateral | +| collateral | int256 | The collateral | + +### getOperatorEligibility + +```solidity +function getOperatorEligibility(uint64 operatorId) external view returns (bool eligibility) +``` + +Get the eligibility of an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| eligibility | bool | The eligibility | + +### getOperatorIds + +```solidity +function getOperatorIds() external view returns (uint64[]) +``` + +Get the operator IDs + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint64[] | operatorIds The operator IDs | ## CasimirUpkeep @@ -1247,7 +1299,7 @@ Fulfill the request for testing ### constructor ```solidity -constructor(address managerAddress) public +constructor(address managerAddress, address registryAddress) public ``` ### getCompoundablePoolIds @@ -1273,6 +1325,27 @@ _Should be called off-chain_ | ---- | ---- | ----------- | | poolIds | uint32[5] | The next five compoundable pool IDs | +### getEligibleOperatorIds + +```solidity +function getEligibleOperatorIds(uint256 startIndex, uint256 endIndex) external view returns (uint64[] activeOperatorIds) +``` + +Get the active operator IDs + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| activeOperatorIds | uint64[] | The active operator IDs | + ### getSweptBalance ```solidity @@ -1359,10 +1432,10 @@ event DepositInitiated(uint32 poolId) event DepositActivated(uint32 poolId) ``` -### ReshareRequested +### ResharesRequested ```solidity -event ReshareRequested(uint32 poolId) +event ResharesRequested(uint64 operatorId) ``` ### ReshareCompleted @@ -1533,6 +1606,18 @@ function requestForcedExitReports(uint256 count) external function requestCompletedExitReports(uint256 count) external ``` +### requestReshares + +```solidity +function requestReshares(uint64 operatorId) external +``` + +### reportForcedExits + +```solidity +function reportForcedExits(uint32[] poolIds) external +``` + ### reportCompletedExit ```solidity @@ -1818,10 +1903,10 @@ event DeregistrationCompleted(uint64 operatorId) ```solidity struct Operator { bool active; + bool resharing; int256 collateral; uint256 poolCount; mapping(uint32 => bool) pools; - bool deregistering; } ``` @@ -1861,6 +1946,18 @@ function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmoun function getOperatorCollateral(uint64 operatorId) external view returns (int256) ``` +### getOperatorEligibility + +```solidity +function getOperatorEligibility(uint64 operatorId) external view returns (bool eligibility) +``` + +### getOperatorIds + +```solidity +function getOperatorIds() external view returns (uint64[]) +``` + ## ICasimirUpkeep ### RequestType diff --git a/contracts/ethereum/helpers/deploy.ts b/contracts/ethereum/helpers/deploy.ts deleted file mode 100644 index d4fb314c6..000000000 --- a/contracts/ethereum/helpers/deploy.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ethers, upgrades } from 'hardhat' - -async function deployContract(name: string, proxy?: boolean, args?: Record, options?: Record) { - if (!args) args = {} - if (!options) options = {} - const inputs = [] - const factory = await ethers.getContractFactory(name) - if (proxy) { - if (Object.keys(args).length) inputs.push([...Object.values(args)]) - if (Object.keys(options).length) inputs.push(options) - const proxy = await upgrades.deployProxy(factory, inputs) - return await proxy.deployed() - } else { - if (Object.keys(args).length) inputs.push(...Object.values(args)) - if (Object.keys(options).length) inputs.push(options) - const contract = await factory.deploy(...inputs) - return await contract.deployed() - } -} - -export { deployContract } \ No newline at end of file diff --git a/contracts/ethereum/package.json b/contracts/ethereum/package.json index 0a038926e..efcc19b6e 100644 --- a/contracts/ethereum/package.json +++ b/contracts/ethereum/package.json @@ -3,6 +3,8 @@ "scripts": { "node": "npx hardhat node", "dev": "npx hardhat run scripts/dev.ts", + "deploy": "npx hardhat run scripts/deploy.ts", + "deploy:multisig": "npx hardhat run scripts/multisig.ts", "docgen": "npx hardhat docgen", "test": "npx esno scripts/test.ts --clean \"$npm_config_clean\"", "clean": "npx hardhat clean", diff --git a/contracts/ethereum/scripts/deploy.ts b/contracts/ethereum/scripts/deploy.ts index 9668266e2..c70b066bc 100644 --- a/contracts/ethereum/scripts/deploy.ts +++ b/contracts/ethereum/scripts/deploy.ts @@ -1,49 +1,36 @@ -import { deployContract } from '@casimir/ethereum/helpers/deploy' -import { ContractConfig, DeploymentConfig } from '@casimir/types' +import { ethers } from 'hardhat' void async function () { - const config: DeploymentConfig = { - CasimirManager: { - address: '', - args: { - oracleAddress: process.env.ORACLE_ADDRESS, - beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, - linkFunctionsAddress: process.env.LINK_FUNCTIONS_ADDRESS, - linkRegistrarAddress: process.env.LINK_REGISTRAR_ADDRESS, - linkRegistryAddress: process.env.LINK_REGISTRY_ADDRESS, - linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, - ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, - ssvNetworkViewsAddress: process.env.SSV_NETWORK_VIEWS_ADDRESS, - ssvTokenAddress: process.env.SSV_TOKEN_ADDRESS, - swapFactoryAddress: process.env.SWAP_FACTORY_ADDRESS, - swapRouterAddress: process.env.SWAP_ROUTER_ADDRESS, - wethTokenAddress: process.env.WETH_TOKEN_ADDRESS - }, - options: {}, - proxy: false - }, - CasimirViews: { - address: '', - args: { - managerAddress: '' - }, - options: {}, - proxy: false - } + const managerArgs = { + oracleAddress: process.env.ORACLE_ADDRESS, + beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, + linkFunctionsAddress: process.env.LINK_FUNCTIONS_ADDRESS, + linkRegistrarAddress: process.env.LINK_REGISTRAR_ADDRESS, + linkRegistryAddress: process.env.LINK_REGISTRY_ADDRESS, + linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, + ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, + ssvNetworkViewsAddress: process.env.SSV_NETWORK_VIEWS_ADDRESS, + ssvTokenAddress: process.env.SSV_TOKEN_ADDRESS, + swapFactoryAddress: process.env.SWAP_FACTORY_ADDRESS, + swapRouterAddress: process.env.SWAP_ROUTER_ADDRESS, + wethTokenAddress: process.env.WETH_TOKEN_ADDRESS } + const managerFactory = await ethers.getContractFactory('CasimirManager') + const manager = await managerFactory.deploy(...Object.values(managerArgs)) + await manager.deployed() + console.log(`CasimirManager contract deployed to ${manager.address}`) - for (const name in config) { - if (name === 'CasimirViews') { - (config[name as keyof typeof config] as ContractConfig).args.managerAddress = config.CasimirManager.address - } + const registryAddress = await manager.getRegistryAddress() + console.log(`CasimirRegistry contract deployed to ${registryAddress}`) - const { args, options, proxy } = config[name as keyof typeof config] as ContractConfig + const upkeepAddress = await manager.getUpkeepAddress() + console.log(`CasimirUpkeep contract deployed to ${upkeepAddress}`) - const contract = await deployContract(name, proxy, args, options) - const { address } = contract - - console.log(`${name} contract deployed to ${address}`) - - ;(config[name as keyof DeploymentConfig] as ContractConfig).address = address + const viewsArgs = { + managerAddress: manager.address, + registryAddress } + const viewsFactory = await ethers.getContractFactory('CasimirViews') + const views = await viewsFactory.deploy(...Object.values(viewsArgs)) + console.log(`CasimirViews contract deployed to ${views.address}`) }() \ No newline at end of file diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 1d840c67e..cb0e68979 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -1,6 +1,4 @@ -import { deployContract } from '@casimir/ethereum/helpers/deploy' -import { ContractConfig, DeploymentConfig } from '@casimir/types' -import { CasimirUpkeep, CasimirManager, CasimirRegistry, ISSVNetworkViews } from '@casimir/ethereum/build/artifacts/types' +import { CasimirManager, CasimirRegistry, ISSVNetworkViews, CasimirViews, CasimirUpkeep } from '@casimir/ethereum/build/artifacts/types' import { ethers, network } from 'hardhat' import { fulfillReport, runUpkeep } from '@casimir/ethereum/helpers/upkeep' import { round } from '@casimir/ethereum/helpers/math' @@ -11,67 +9,46 @@ import ISSVNetworkViewsJson from '@casimir/ethereum/build/artifacts/scripts/reso void async function () { const [, , , , fourthUser, keeper, oracle] = await ethers.getSigners() - let config: DeploymentConfig = { - CasimirManager: { - address: '', - args: { - oracleAddress: oracle.address || process.env.ORACLE_ADDRESS, - beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, - linkFunctionsAddress: process.env.LINK_FUNCTIONS_ADDRESS, - linkRegistrarAddress: process.env.LINK_REGISTRAR_ADDRESS, - linkRegistryAddress: process.env.LINK_REGISTRY_ADDRESS, - linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, - ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, - ssvNetworkViewsAddress: process.env.SSV_NETWORK_VIEWS_ADDRESS, - ssvTokenAddress: process.env.SSV_TOKEN_ADDRESS, - swapFactoryAddress: process.env.SWAP_FACTORY_ADDRESS, - swapRouterAddress: process.env.SWAP_ROUTER_ADDRESS, - wethTokenAddress: process.env.WETH_TOKEN_ADDRESS - }, - options: {}, - proxy: false - }, - CasimirViews: { - address: '', - args: { - managerAddress: '' - }, - options: {}, - proxy: false - } - } - - /** Insert any mock external contracts first */ - if (process.env.MOCK_EXTERNAL_CONTRACTS === 'true') { - config = { - MockFunctionsOracle: { - address: '', - args: {}, - options: {}, - proxy: false - }, - ...config - } + const mockFunctionsOracleFactory = await ethers.getContractFactory('MockFunctionsOracle') + const mockFunctionsOracle = await mockFunctionsOracleFactory.deploy() + await mockFunctionsOracle.deployed() + console.log(`MockFunctionsOracle contract deployed to ${mockFunctionsOracle.address}`) + + const managerArgs = { + oracleAddress: oracle.address, + beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, + linkFunctionsAddress: mockFunctionsOracle.address, + linkRegistrarAddress: process.env.LINK_REGISTRAR_ADDRESS, + linkRegistryAddress: process.env.LINK_REGISTRY_ADDRESS, + linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, + ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, + ssvNetworkViewsAddress: process.env.SSV_NETWORK_VIEWS_ADDRESS, + ssvTokenAddress: process.env.SSV_TOKEN_ADDRESS, + swapFactoryAddress: process.env.SWAP_FACTORY_ADDRESS, + swapRouterAddress: process.env.SWAP_ROUTER_ADDRESS, + wethTokenAddress: process.env.WETH_TOKEN_ADDRESS } + const managerFactory = await ethers.getContractFactory('CasimirManager') + const manager = await managerFactory.deploy(...Object.values(managerArgs)) as CasimirManager + await manager.deployed() + console.log(`CasimirManager contract deployed to ${manager.address}`) - for (const name in config) { - if (name === 'CasimirManager') { - (config[name as keyof typeof config] as ContractConfig).args.linkFunctionsAddress = config.MockFunctionsOracle?.address - } - - const { args, options, proxy } = config[name as keyof typeof config] as ContractConfig - - const contract = await deployContract(name, proxy, args, options) - const { address } = contract + const registryAddress = await manager.getRegistryAddress() + console.log(`CasimirRegistry contract deployed to ${registryAddress}`) - console.log(`${name} contract deployed to ${address}`) + const upkeepAddress = await manager.getUpkeepAddress() + console.log(`CasimirUpkeep contract deployed to ${upkeepAddress}`) - ;(config[name as keyof DeploymentConfig] as ContractConfig).address = address + const viewsArgs = { + managerAddress: manager.address, + registryAddress } + const viewsFactory = await ethers.getContractFactory('CasimirViews') + const views = await viewsFactory.deploy(...Object.values(viewsArgs)) as CasimirViews + console.log(`CasimirViews contract deployed to ${views.address}`) - const manager = await ethers.getContractAt('CasimirManager', config.CasimirManager.address as string) as CasimirManager - const registry = await ethers.getContractAt('CasimirRegistry', await manager.getRegistryAddress()) as CasimirRegistry - const upkeep = await ethers.getContractAt('CasimirUpkeep', await manager.getUpkeepAddress()) as CasimirUpkeep + const registry = await ethers.getContractAt('CasimirRegistry', registryAddress) as CasimirRegistry + const upkeep = await ethers.getContractAt('CasimirUpkeep', upkeepAddress) as CasimirUpkeep const ssvNetworkViews = await ethers.getContractAt(ISSVNetworkViewsJson.abi, process.env.SSV_NETWORK_VIEWS_ADDRESS as string) as ISSVNetworkViews for (const operatorId of [1, 2, 3, 4]) { diff --git a/contracts/ethereum/scripts/multisig.ts b/contracts/ethereum/scripts/multisig.ts new file mode 100644 index 000000000..b663ef3ab --- /dev/null +++ b/contracts/ethereum/scripts/multisig.ts @@ -0,0 +1,17 @@ +import { ethers } from 'hardhat' + +void async function () { + const multisigArgs = { + owners: [ + process.env.OWNER_1_ADDRESS, + process.env.OWNER_2_ADDRESS, + process.env.OWNER_3_ADDRESS, + process.env.OWNER_4_ADDRESS, + process.env.OWNER_5_ADDRESS + ] + } + const multisigFactory = await ethers.getContractFactory('CasimirMultisig') + const multisig = await multisigFactory.deploy(...Object.values(multisigArgs)) + await multisig.deployed() + console.log(`CasimirMultisig contract deployed to ${multisig.address}`) +}() \ No newline at end of file diff --git a/contracts/ethereum/src/v1/CasimirMultisig.sol b/contracts/ethereum/src/v1/CasimirMultisig.sol index 2c59fa7e6..a227bd0f9 100644 --- a/contracts/ethereum/src/v1/CasimirMultisig.sol +++ b/contracts/ethereum/src/v1/CasimirMultisig.sol @@ -177,8 +177,8 @@ contract CasimirMultisig is ICasimirMultisig { address to, uint256 value, bytes memory data - ) public onlyOwner { - uint256 transactionIndex = transactions.length; + ) public onlyOwner returns (uint256 transactionIndex) { + transactionIndex = transactions.length; transactions.push( Transaction({ diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirMultisig.sol b/contracts/ethereum/src/v1/interfaces/ICasimirMultisig.sol index 6d5df7e44..5804c3f14 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirMultisig.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirMultisig.sol @@ -60,7 +60,7 @@ interface ICasimirMultisig { address to, uint value, bytes memory data - ) external; + ) external returns (uint256 transactionIndex); function confirmTransaction( uint256 transactionIndex diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index cde4762c6..b7b07b41d 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -1,79 +1,55 @@ import { ethers, network } from 'hardhat' import { loadFixture, time, setBalance } from '@nomicfoundation/hardhat-network-helpers' -import { deployContract } from '@casimir/ethereum/helpers/deploy' -import { CasimirManager, CasimirRegistry, CasimirUpkeep, ISSVNetworkViews } from '@casimir/ethereum/build/artifacts/types' +import { CasimirManager, CasimirRegistry, CasimirUpkeep, CasimirViews, ISSVNetworkViews } from '@casimir/ethereum/build/artifacts/types' import { fulfillReport, runUpkeep } from '@casimir/ethereum/helpers/upkeep' import { initiateDepositHandler, reportCompletedExitsHandler } from '@casimir/ethereum/helpers/oracle' import { round } from '@casimir/ethereum/helpers/math' -import { ContractConfig, DeploymentConfig } from '@casimir/types' import ISSVNetworkViewsJson from '@casimir/ethereum/build/artifacts/scripts/resources/ssv-network/contracts/ISSVNetworkViews.sol/ISSVNetworkViews.json' /** Fixture to deploy SSV manager contract */ export async function deploymentFixture() { const [owner, , , , , keeper, oracle] = await ethers.getSigners() - let config: DeploymentConfig = { - CasimirManager: { - address: '', - args: { - oracleAddress: oracle.address || process.env.ORACLE_ADDRESS, - beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, - linkFunctionsAddress: process.env.LINK_FUNCTIONS_ADDRESS, - linkRegistrarAddress: process.env.LINK_REGISTRAR_ADDRESS, - linkRegistryAddress: process.env.LINK_REGISTRY_ADDRESS, - linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, - ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, - ssvNetworkViewsAddress: process.env.SSV_NETWORK_VIEWS_ADDRESS, - ssvTokenAddress: process.env.SSV_TOKEN_ADDRESS, - swapFactoryAddress: process.env.SWAP_FACTORY_ADDRESS, - swapRouterAddress: process.env.SWAP_ROUTER_ADDRESS, - wethTokenAddress: process.env.WETH_TOKEN_ADDRESS - }, - options: {}, - proxy: false - }, - CasimirViews: { - address: '', - args: { - managerAddress: '' - }, - options: {}, - proxy: false - } - } - /** Insert any mock external contracts first */ - if (process.env.MOCK_EXTERNAL_CONTRACTS === 'true') { - config = { - MockFunctionsOracle: { - address: '', - args: {}, - options: {}, - proxy: false - }, - ...config - } + const mockFunctionsOracleFactory = await ethers.getContractFactory('MockFunctionsOracle') + const mockFunctionsOracle = await mockFunctionsOracleFactory.deploy() + await mockFunctionsOracle.deployed() + console.log(`MockFunctionsOracle contract deployed to ${mockFunctionsOracle.address}`) + + const managerArgs = { + oracleAddress: oracle.address, + beaconDepositAddress: process.env.BEACON_DEPOSIT_ADDRESS, + linkFunctionsAddress: mockFunctionsOracle.address, + linkRegistrarAddress: process.env.LINK_REGISTRAR_ADDRESS, + linkRegistryAddress: process.env.LINK_REGISTRY_ADDRESS, + linkTokenAddress: process.env.LINK_TOKEN_ADDRESS, + ssvNetworkAddress: process.env.SSV_NETWORK_ADDRESS, + ssvNetworkViewsAddress: process.env.SSV_NETWORK_VIEWS_ADDRESS, + ssvTokenAddress: process.env.SSV_TOKEN_ADDRESS, + swapFactoryAddress: process.env.SWAP_FACTORY_ADDRESS, + swapRouterAddress: process.env.SWAP_ROUTER_ADDRESS, + wethTokenAddress: process.env.WETH_TOKEN_ADDRESS } + const managerFactory = await ethers.getContractFactory('CasimirManager') + const manager = await managerFactory.deploy(...Object.values(managerArgs)) as CasimirManager + await manager.deployed() + console.log(`CasimirManager contract deployed to ${manager.address}`) - for (const name in config) { - if (name === 'CasimirManager') { - (config[name as keyof typeof config] as ContractConfig).args.linkFunctionsAddress = config.MockFunctionsOracle?.address - } else if (name === 'CasimirViews') { - (config[name as keyof typeof config] as ContractConfig).args.managerAddress = config.CasimirManager.address - } - - const { args, options, proxy } = config[name as keyof typeof config] as ContractConfig - - const contract = await deployContract(name, proxy, args, options) - const { address } = contract + const registryAddress = await manager.getRegistryAddress() + console.log(`CasimirRegistry contract deployed to ${registryAddress}`) - console.log(`${name} contract deployed to ${address}`) + const upkeepAddress = await manager.getUpkeepAddress() + console.log(`CasimirUpkeep contract deployed to ${upkeepAddress}`) - ;(config[name as keyof DeploymentConfig] as ContractConfig).address = address + const viewsArgs = { + managerAddress: manager.address, + registryAddress } + const viewsFactory = await ethers.getContractFactory('CasimirViews') + const views = await viewsFactory.deploy(...Object.values(viewsArgs)) as CasimirViews + console.log(`CasimirViews contract deployed to ${views.address}`) - const manager = await ethers.getContractAt('CasimirManager', config.CasimirManager.address as string) as CasimirManager - const registry = await ethers.getContractAt('CasimirRegistry', await manager.getRegistryAddress()) as CasimirRegistry - const upkeep = await ethers.getContractAt('CasimirUpkeep', await manager.getUpkeepAddress()) as CasimirUpkeep + const registry = await ethers.getContractAt('CasimirRegistry', registryAddress) as CasimirRegistry + const upkeep = await ethers.getContractAt('CasimirUpkeep', upkeepAddress) as CasimirUpkeep const ssvNetworkViews = await ethers.getContractAt(ISSVNetworkViewsJson.abi, process.env.SSV_NETWORK_VIEWS_ADDRESS as string) as ISSVNetworkViews for (const operatorId of [1, 2, 3, 4]) { @@ -90,7 +66,7 @@ export async function deploymentFixture() { await result.wait() } - return { manager: manager as CasimirManager, upkeep: upkeep as CasimirUpkeep, owner, keeper, oracle } + return { manager, upkeep, owner, keeper, oracle } } /** Fixture to stake 16 for the first user */ From e2bf69ff78e5a080021268cc9e87ae6a054885de Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Tue, 6 Jun 2023 21:57:07 -0400 Subject: [PATCH 58/78] Change custom getters to public variables where applicable --- apps/web/src/composables/ssv.ts | 6 +- contracts/ethereum/docs/index.md | 2490 ++++++++--------- contracts/ethereum/scripts/dev.ts | 6 +- contracts/ethereum/src/v1/CasimirManager.sol | 122 +- contracts/ethereum/src/v1/CasimirUpkeep.sol | 10 +- .../src/v1/interfaces/ICasimirManager.sol | 35 +- contracts/ethereum/test/fixtures/shared.ts | 10 +- contracts/ethereum/test/integration.ts | 6 +- 8 files changed, 1307 insertions(+), 1378 deletions(-) diff --git a/apps/web/src/composables/ssv.ts b/apps/web/src/composables/ssv.ts index 48f525c6e..2268e9506 100644 --- a/apps/web/src/composables/ssv.ts +++ b/apps/web/src/composables/ssv.ts @@ -46,7 +46,7 @@ export default function useSSV() { let signer = signerCreator(walletProvider) if (isWalletConnectSigner(signer)) signer = await signer const managerSigner = manager.connect(signer as ethers.Signer) - const fees = await managerSigner.getFeePercent() + const fees = await managerSigner.feePercent() const depositAmount = parseFloat(amount) * ((100 + fees) / 100) const value = ethers.utils.parseEther(depositAmount.toString()) const result = await managerSigner.depositStake({ value, type: 0 }) @@ -55,7 +55,7 @@ export default function useSSV() { async function getDepositFees() { const provider = new ethers.providers.JsonRpcProvider(ethereumURL) - const fees = await manager.connect(provider).getFeePercent() + const fees = await manager.connect(provider).feePercent() const feesRounded = Math.round(fees * 100) / 100 return feesRounded } @@ -64,7 +64,7 @@ export default function useSSV() { const { user } = useUsers() const provider = new ethers.providers.JsonRpcProvider(ethereumURL) const userStake = await manager.connect(provider).getUserStake(address) // to get user's stake balance - const poolStake = await manager.connect(provider).getTotalStake() // to get total stake balance + const poolStake = await manager.connect(provider).totalStake() // to get total stake balance const poolIds = readyOrStake === 'ready' ? await manager.connect(provider).getReadyPoolIds() : await manager.connect(provider).getStakedPoolIds() // to get ready (open) pool IDs OR to get staked (active) pool IDs console.log('userStake :>> ', ethers.utils.formatEther(userStake)) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 8dc360dd0..41e1d4bdf 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -1,125 +1,96 @@ # Solidity API -## CasimirManager +## CasimirMultisig -### upkeepRegistrationMinimum +### owners ```solidity -uint256 upkeepRegistrationMinimum +address[] owners ``` -Minimum balance for upkeep registration (0.1 LINK) - -### finalizableCompletedExits +### isOwner ```solidity -uint256 finalizableCompletedExits +mapping(address => bool) isOwner ``` -Exited pool count - -### onlyPool +### confirmationsRequired ```solidity -modifier onlyPool(uint32 poolId) +uint256 confirmationsRequired ``` -_Validate the caller is the authorized pool_ - -### onlyOracle +### isOwnerChangeConfirmed ```solidity -modifier onlyOracle() +mapping(uint256 => mapping(address => bool)) isOwnerChangeConfirmed ``` -_Validate the caller is the manager oracle_ - -### onlyOracleOrRegistry +### isTransactionConfirmed ```solidity -modifier onlyOracleOrRegistry() +mapping(uint256 => mapping(address => bool)) isTransactionConfirmed ``` -_Validate the caller is the oracle or registry_ - -### onlyOracleOrUpkeep +### ownerChanges ```solidity -modifier onlyOracleOrUpkeep() +struct ICasimirMultisig.OwnerChange[] ownerChanges ``` -_Validate the caller is the oracle or upkeep_ - -### onlyRegistry +### transactions ```solidity -modifier onlyRegistry() +struct ICasimirMultisig.Transaction[] transactions ``` -_Validate the caller is the registry_ - -### onlyUpkeep +### onlyOwner ```solidity -modifier onlyUpkeep() +modifier onlyOwner() ``` -_Validate the caller is the upkeep contract_ - -### validDeposit +### ownerChangeExists ```solidity -modifier validDeposit() +modifier ownerChangeExists(uint256 changeId) ``` -_Validate a deposit_ - -### validWithdrawal +### ownerChangeNotExecuted ```solidity -modifier validWithdrawal(uint256 amount) +modifier ownerChangeNotExecuted(uint256 changeId) ``` -_Validate a withdrawal_ - -### validDistribution +### ownerChangeNotConfirmed ```solidity -modifier validDistribution(uint256 amount) +modifier ownerChangeNotConfirmed(uint256 changeId) ``` -_Validate a distribution_ - -#### Parameters +### transactionExists -| Name | Type | Description | -| ---- | ---- | ----------- | -| amount | uint256 | The amount to validate | +```solidity +modifier transactionExists(uint256 transactionIndex) +``` -### constructor +### transactionNotExecuted ```solidity -constructor(address _oracleAddress, address beaconDepositAddress, address linkFunctionsAddress, address linkRegistrarAddress, address linkRegistryAddress, address linkTokenAddress, address ssvNetworkAddress, address ssvNetworkViewsAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public +modifier transactionNotExecuted(uint256 transactionIndex) ``` -Constructor +### transactionNotConfirmed -#### Parameters +```solidity +modifier transactionNotConfirmed(uint256 transactionIndex) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| _oracleAddress | address | The manager oracle address | -| beaconDepositAddress | address | The Beacon deposit address | -| linkFunctionsAddress | address | The Chainlink functions oracle address | -| linkRegistrarAddress | address | The Chainlink keeper registrar address | -| linkRegistryAddress | address | The Chainlink keeper registry address | -| linkTokenAddress | address | The Chainlink token address | -| ssvNetworkAddress | address | The SSV network address | -| ssvNetworkViewsAddress | address | The SSV network views address | -| ssvTokenAddress | address | The SSV token address | -| swapFactoryAddress | address | The Uniswap factory address | -| swapRouterAddress | address | The Uniswap router address | -| wethTokenAddress | address | The WETH contract address | +### constructor + +```solidity +constructor(address[] _owners) public +``` ### receive @@ -127,2455 +98,2484 @@ Constructor receive() external payable ``` -Receive and deposit validator tips - -### depositStake +### submitOwnerChange ```solidity -function depositStake() external payable +function submitOwnerChange(address owner, bool add) public ``` -Deposit user stake - -### depositRewards +### confirmOwnerChange ```solidity -function depositRewards() external payable +function confirmOwnerChange(uint256 changeId) public ``` -Deposit a given amount of rewards - -### depositExitedBalance +### executeOwnerChange ```solidity -function depositExitedBalance(uint32 poolId) external payable +function executeOwnerChange(uint256 changeId) public ``` -Deposit exited balance from a given pool ID - -#### Parameters +### revokeOwnerChangeConfirmation -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | +```solidity +function revokeOwnerChangeConfirmation(uint256 changeId) public +``` -### depositRecoveredBalance +### submitTransaction ```solidity -function depositRecoveredBalance(uint32 poolId) external payable +function submitTransaction(address to, uint256 value, bytes data) public returns (uint256 transactionIndex) ``` -Deposit recovered balance for a given pool from an operator - -#### Parameters +### confirmTransaction -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | +```solidity +function confirmTransaction(uint256 transactionIndex) public +``` -### depositClusterBalance +### executeTransaction ```solidity -function depositClusterBalance(uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external +function executeTransaction(uint256 transactionIndex) public ``` -Deposit to a cluster balance - -#### Parameters +### revokeTransactionConfirmation -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorIds | uint64[] | The operator IDs | -| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | -| feeAmount | uint256 | The fee amount to deposit | -| processed | bool | Whether the fee amount is already processed | +```solidity +function revokeTransactionConfirmation(uint256 transactionIndex) public +``` -### depositUpkeepBalance +### adjustConfirmationsRequired ```solidity -function depositUpkeepBalance(uint256 feeAmount, bool processed) external +function adjustConfirmationsRequired() internal ``` -Deposit to the upkeep balance - -#### Parameters +### getOwners -| Name | Type | Description | -| ---- | ---- | ----------- | -| feeAmount | uint256 | The fee amount to deposit | -| processed | bool | Whether the fee amount is already processed | +```solidity +function getOwners() public view returns (address[]) +``` -### depositReservedFees +### getOwnerChangeCount ```solidity -function depositReservedFees() external payable +function getOwnerChangeCount() public view returns (uint256) ``` -Deposit reserved fees - -### withdrawReservedFees +### getOwnerChange ```solidity -function withdrawReservedFees(uint256 amount) external +function getOwnerChange(uint256 changeId) public view returns (address owner, bool add, bool executed, uint256 confirmations) ``` -Withdraw a given amount of reserved fees - -#### Parameters +### getTransactionCount -| Name | Type | Description | -| ---- | ---- | ----------- | -| amount | uint256 | The amount of fees to withdraw | +```solidity +function getTransactionCount() public view returns (uint256) +``` -### rebalanceStake +### getTransaction ```solidity -function rebalanceStake(uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, uint256 completedExits) external +function getTransaction(uint256 transactionIndex) public view returns (address to, uint256 value, bytes data, bool executed, uint256 confirmations) ``` -Rebalance the rewards to stake ratio and redistribute swept rewards +## ICasimirMultisig -#### Parameters +### Deposit -| Name | Type | Description | -| ---- | ---- | ----------- | -| activeBalance | uint256 | The active balance | -| sweptBalance | uint256 | The swept balance | -| activatedDeposits | uint256 | The count of activated deposits | -| completedExits | uint256 | The count of withdrawn exits | +```solidity +event Deposit(address sender, uint256 amount, uint256 balance) +``` -### compoundRewards +### SubmitOwnerChange ```solidity -function compoundRewards(uint32[5] poolIds) external +event SubmitOwnerChange(address owner, uint256 changeId, bool add) ``` -Compound rewards given a list of pool IDs - -#### Parameters +### ConfirmOwnerChange -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolIds | uint32[5] | The list of pool IDs | +```solidity +event ConfirmOwnerChange(address owner, uint256 changeId) +``` -### requestWithdrawal +### RevokeOwnerChangeConfirmation ```solidity -function requestWithdrawal(uint256 amount) external +event RevokeOwnerChangeConfirmation(address owner, uint256 changeId) ``` -Request to withdraw user stake - -#### Parameters +### ExecuteOwnerChange -| Name | Type | Description | -| ---- | ---- | ----------- | -| amount | uint256 | The amount of stake to withdraw | +```solidity +event ExecuteOwnerChange(address owner, uint256 changeId) +``` -### fulfillWithdrawals +### SubmitTransaction ```solidity -function fulfillWithdrawals(uint256 count) external +event SubmitTransaction(address owner, uint256 txIndex, address to, uint256 value, bytes data) ``` -Fulfill a given count of pending withdrawals +### ConfirmTransaction -#### Parameters +```solidity +event ConfirmTransaction(address owner, uint256 txIndex) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| count | uint256 | The number of withdrawals to complete | +### RevokeTransactionConfirmation -### initiateDeposit +```solidity +event RevokeTransactionConfirmation(address owner, uint256 txIndex) +``` + +### ExecuteTransaction ```solidity -function initiateDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external +event ExecuteTransaction(address owner, uint256 txIndex) ``` -Initiate the next ready pool +### OwnerChange -#### Parameters +```solidity +struct OwnerChange { + address owner; + bool add; + bool executed; + uint256 confirmations; +} +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositDataRoot | bytes32 | The deposit data root | -| publicKey | bytes | The validator public key | -| signature | bytes | The signature | -| withdrawalCredentials | bytes | The withdrawal credentials | -| operatorIds | uint64[] | The operator IDs | -| shares | bytes | The operator shares | -| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | -| feeAmount | uint256 | The fee amount to deposit | -| processed | bool | | +### Transaction -### activateDeposits +```solidity +struct Transaction { + address to; + uint256 value; + bytes data; + bool executed; + uint256 confirmations; +} +``` + +### receive ```solidity -function activateDeposits(uint256 count) external +receive() external payable ``` -Activate a given count of the next pending pools +### submitOwnerChange -#### Parameters +```solidity +function submitOwnerChange(address owner, bool add) external +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| count | uint256 | The number of pools to activate | +### confirmOwnerChange -### requestForcedExitReports +```solidity +function confirmOwnerChange(uint256 changeId) external +``` + +### executeOwnerChange ```solidity -function requestForcedExitReports(uint256 count) external +function executeOwnerChange(uint256 changeId) external ``` -Request reports a given count of forced exits +### revokeOwnerChangeConfirmation -#### Parameters +```solidity +function revokeOwnerChangeConfirmation(uint256 changeId) external +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| count | uint256 | The number of forced exits | +### submitTransaction -### requestCompletedExitReports +```solidity +function submitTransaction(address to, uint256 value, bytes data) external returns (uint256 transactionIndex) +``` + +### confirmTransaction ```solidity -function requestCompletedExitReports(uint256 count) external +function confirmTransaction(uint256 transactionIndex) external ``` -Request reports for a given count of completed exits +### executeTransaction -#### Parameters +```solidity +function executeTransaction(uint256 transactionIndex) external +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| count | uint256 | The number of completed exits | +### revokeTransactionConfirmation -### requestReshares +```solidity +function revokeTransactionConfirmation(uint256 transactionIndex) external +``` + +### getOwners ```solidity -function requestReshares(uint64 operatorId) external +function getOwners() external view returns (address[]) ``` -Request reshares for an operator +### getOwnerChangeCount -#### Parameters +```solidity +function getOwnerChangeCount() external view returns (uint256) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +### getOwnerChange -### reportForcedExits +```solidity +function getOwnerChange(uint256 changeId) external view returns (address owner, bool add, bool executed, uint256 confirmations) +``` + +### getTransactionCount ```solidity -function reportForcedExits(uint32[] poolIds) external +function getTransactionCount() external view returns (uint256) ``` -Report pool forced (unrequested) exits +### getTransaction -#### Parameters +```solidity +function getTransaction(uint256 transactionIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 confirmations) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolIds | uint32[] | The pool IDs | +## CasimirManager -### reportCompletedExit +### upkeepRegistrationMinimum ```solidity -function reportCompletedExit(uint256 poolIndex, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external +uint256 upkeepRegistrationMinimum ``` -Report a completed exit +Minimum balance for upkeep registration (0.1 LINK) -#### Parameters +### finalizableCompletedExits -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolIndex | uint256 | The staked pool index | -| blamePercents | uint32[] | The operator blame percents (0 if balance is 32 ether) | -| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | +```solidity +uint256 finalizableCompletedExits +``` -### reportReshare +Exited pool count + +### onlyPool ```solidity -function reportReshare(uint32 poolId, uint64[] operatorIds, uint64[] oldOperatorIds, uint64 newOperatorId, uint64 oldOperatorId, bytes shares, struct ISSVNetworkCore.Cluster cluster, struct ISSVNetworkCore.Cluster oldCluster, uint256 feeAmount, bool processed) external +modifier onlyPool(uint32 poolId) ``` -Report a reshare +_Validate the caller is the authorized pool_ -#### Parameters +### onlyOracle -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | -| operatorIds | uint64[] | The operator IDs | -| oldOperatorIds | uint64[] | The old operator IDs | -| newOperatorId | uint64 | The new operator ID | -| oldOperatorId | uint64 | The old operator ID | -| shares | bytes | The operator shares | -| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | -| oldCluster | struct ISSVNetworkCore.Cluster | The old SSV cluster snapshot | -| feeAmount | uint256 | The fee amount to deposit | -| processed | bool | Whether the fee amount is already processed | +```solidity +modifier onlyOracle() +``` -### withdrawUpkeepBalance +_Validate the caller is the manager oracle_ + +### onlyOracleOrRegistry ```solidity -function withdrawUpkeepBalance() external +modifier onlyOracleOrRegistry() ``` -Cancel upkeep and withdraw the upkeep balance +_Validate the caller is the oracle or registry_ -### withdrawLINKBalance +### onlyOracleOrUpkeep ```solidity -function withdrawLINKBalance(uint256 amount) external +modifier onlyOracleOrUpkeep() ``` -Withdraw a given amount from the LINK balance +_Validate the caller is the oracle or upkeep_ -#### Parameters +### onlyRegistry -| Name | Type | Description | -| ---- | ---- | ----------- | -| amount | uint256 | The amount to withdraw | +```solidity +modifier onlyRegistry() +``` -### withdrawSSVBalance +_Validate the caller is the registry_ + +### onlyUpkeep ```solidity -function withdrawSSVBalance(uint256 amount) external +modifier onlyUpkeep() ``` -Withdraw a given amount from the SSV balance +_Validate the caller is the upkeep contract_ + +### validDeposit + +```solidity +modifier validDeposit() +``` + +_Validate a deposit_ + +### validWithdrawal + +```solidity +modifier validWithdrawal(uint256 amount) +``` + +_Validate a withdrawal_ + +### validDistribution + +```solidity +modifier validDistribution(uint256 amount) +``` + +_Validate a distribution_ #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| amount | uint256 | The amount to withdraw | +| amount | uint256 | The amount to validate | -### setFunctionsAddress +### constructor ```solidity -function setFunctionsAddress(address functionsAddress) external +constructor(address _oracleAddress, address beaconDepositAddress, address linkFunctionsAddress, address linkRegistrarAddress, address linkRegistryAddress, address linkTokenAddress, address ssvNetworkAddress, address ssvNetworkViewsAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public ``` -Update the functions oracle address +Constructor #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| functionsAddress | address | New functions oracle address | +| _oracleAddress | address | The manager oracle address | +| beaconDepositAddress | address | The Beacon deposit address | +| linkFunctionsAddress | address | The Chainlink functions oracle address | +| linkRegistrarAddress | address | The Chainlink keeper registrar address | +| linkRegistryAddress | address | The Chainlink keeper registry address | +| linkTokenAddress | address | The Chainlink token address | +| ssvNetworkAddress | address | The SSV network address | +| ssvNetworkViewsAddress | address | The SSV network views address | +| ssvTokenAddress | address | The SSV token address | +| swapFactoryAddress | address | The Uniswap factory address | +| swapRouterAddress | address | The Uniswap router address | +| wethTokenAddress | address | The WETH contract address | -### getUserStake +### receive ```solidity -function getUserStake(address userAddress) public view returns (uint256 userStake) +receive() external payable ``` -Get the total user stake for a given user address +Receive and deposit validator tips + +### depositStake + +```solidity +function depositStake() external payable +``` + +Deposit user stake + +### depositRewards + +```solidity +function depositRewards() external payable +``` + +Deposit a given amount of rewards + +### depositExitedBalance + +```solidity +function depositExitedBalance(uint32 poolId) external payable +``` + +Deposit exited balance from a given pool ID #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| userAddress | address | The user address | +| poolId | uint32 | The pool ID | -#### Return Values +### depositRecoveredBalance + +```solidity +function depositRecoveredBalance(uint32 poolId) external payable +``` + +Deposit recovered balance for a given pool from an operator + +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| userStake | uint256 | The total user stake | +| poolId | uint32 | The pool ID | -### getTotalStake +### depositClusterBalance ```solidity -function getTotalStake() public view returns (uint256 totalStake) +function depositClusterBalance(uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external ``` -Get the total stake +Deposit to a cluster balance -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| totalStake | uint256 | The total stake | +| operatorIds | uint64[] | The operator IDs | +| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | +| feeAmount | uint256 | The fee amount to deposit | +| processed | bool | Whether the fee amount is already processed | -### getBufferedBalance +### depositUpkeepBalance ```solidity -function getBufferedBalance() public view returns (uint256 bufferedBalance) +function depositUpkeepBalance(uint256 feeAmount, bool processed) external ``` -Get the buffered balance +Deposit to the upkeep balance -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| bufferedBalance | uint256 | The buffered balance | +| feeAmount | uint256 | The fee amount to deposit | +| processed | bool | Whether the fee amount is already processed | -### getReadyBalance +### depositReservedFees ```solidity -function getReadyBalance() public view returns (uint256 readyBalance) +function depositReservedFees() external payable ``` -Get the ready balance +Deposit reserved fees -#### Return Values +### withdrawReservedFees + +```solidity +function withdrawReservedFees(uint256 amount) external +``` + +Withdraw a given amount of reserved fees + +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| readyBalance | uint256 | The ready balance | +| amount | uint256 | The amount of fees to withdraw | -### getWithdrawableBalance +### rebalanceStake ```solidity -function getWithdrawableBalance() public view returns (uint256) +function rebalanceStake(uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, uint256 completedExits) external ``` -Get the withdrawable balanace +Rebalance the rewards to stake ratio and redistribute swept rewards -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | withdrawableBalance The withdrawable balanace | +| activeBalance | uint256 | The active balance | +| sweptBalance | uint256 | The swept balance | +| activatedDeposits | uint256 | The count of activated deposits | +| completedExits | uint256 | The count of withdrawn exits | -### getReservedFeeBalance +### compoundRewards ```solidity -function getReservedFeeBalance() public view returns (uint256) +function compoundRewards(uint32[5] poolIds) external ``` -Get the reserved fee balance +Compound rewards given a list of pool IDs -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | reservedFeeBalance The reserved fee balance | +| poolIds | uint32[5] | The list of pool IDs | -### getExpectedEffectiveBalance +### requestWithdrawal ```solidity -function getExpectedEffectiveBalance() public view returns (uint256 expectedEffectiveBalance) +function requestWithdrawal(uint256 amount) external ``` -Get the expected effective balance +Request to withdraw user stake -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| expectedEffectiveBalance | uint256 | The expected effective balance | +| amount | uint256 | The amount of stake to withdraw | -### getLatestActiveBalance +### fulfillWithdrawals ```solidity -function getLatestActiveBalance() public view returns (uint256) +function fulfillWithdrawals(uint256 count) external ``` -Get the latest active balance +Fulfill a given count of pending withdrawals -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | latestActiveBalance The latest active balance | +| count | uint256 | The number of withdrawals to complete | -### getLatestActiveBalanceAfterFees +### initiateDeposit ```solidity -function getLatestActiveBalanceAfterFees() public view returns (uint256) +function initiateDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external ``` -Get the latest active balance after fees +Initiate the next ready pool -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | latestActiveBalanceAfterFees The latest active balance after fees | +| depositDataRoot | bytes32 | The deposit data root | +| publicKey | bytes | The validator public key | +| signature | bytes | The signature | +| withdrawalCredentials | bytes | The withdrawal credentials | +| operatorIds | uint64[] | The operator IDs | +| shares | bytes | The operator shares | +| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | +| feeAmount | uint256 | The fee amount to deposit | +| processed | bool | | -### getFinalizableCompletedExits +### activateDeposits ```solidity -function getFinalizableCompletedExits() public view returns (uint256) +function activateDeposits(uint256 count) external ``` -Get the finalizable completed exit count of the current reporting period +Activate a given count of the next pending pools -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | finalizableCompletedExits The finalizable completed exit count of the current reporting period | +| count | uint256 | The number of pools to activate | -### getReportPeriod +### requestForcedExitReports ```solidity -function getReportPeriod() public view returns (uint256) +function requestForcedExitReports(uint256 count) external ``` -Get the report period +Request reports a given count of forced exits -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | reportPeriod The report period | +| count | uint256 | The number of forced exits | -### getPendingWithdrawalEligibility +### requestCompletedExitReports ```solidity -function getPendingWithdrawalEligibility(uint256 index, uint256 period) public view returns (bool) +function requestCompletedExitReports(uint256 count) external ``` -Get the eligibility of a pending withdrawal +Request reports for a given count of completed exits #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| index | uint256 | The index of the pending withdrawal | -| period | uint256 | The period to check | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | pendingWithdrawalEligibility The eligibility of a pending withdrawal | +| count | uint256 | The number of completed exits | -### getPendingWithdrawalBalance +### requestReshares ```solidity -function getPendingWithdrawalBalance() public view returns (uint256) +function requestReshares(uint64 operatorId) external ``` -Get the total pending user withdrawal amount +Request reshares for an operator -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | requestedWithdrawalBalance The total pending user withdrawal amount | +| operatorId | uint64 | The operator ID | -### getPendingWithdrawals +### reportForcedExits ```solidity -function getPendingWithdrawals() public view returns (uint256) +function reportForcedExits(uint32[] poolIds) external ``` -Get the total pending withdrawal count +Report pool forced (unrequested) exits -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | requestedWithdrawals The total pending withdrawal count | +| poolIds | uint32[] | The pool IDs | -### getFeePercent +### reportCompletedExit ```solidity -function getFeePercent() public view returns (uint32) +function reportCompletedExit(uint256 poolIndex, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external ``` -Get the total fee percentage +Report a completed exit -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32 | feePercent The total fee percentage | +| poolIndex | uint256 | The staked pool index | +| blamePercents | uint32[] | The operator blame percents (0 if balance is 32 ether) | +| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | -### getRequestedExits +### reportReshare ```solidity -function getRequestedExits() external view returns (uint256) +function reportReshare(uint32 poolId, uint64[] operatorIds, uint64[] oldOperatorIds, uint64 newOperatorId, uint64 oldOperatorId, bytes shares, struct ISSVNetworkCore.Cluster cluster, struct ISSVNetworkCore.Cluster oldCluster, uint256 feeAmount, bool processed) external ``` -Get the count of pools requested to exit +Report a reshare -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | requestedExits The count of pools requested to exit | +| poolId | uint32 | The pool ID | +| operatorIds | uint64[] | The operator IDs | +| oldOperatorIds | uint64[] | The old operator IDs | +| newOperatorId | uint64 | The new operator ID | +| oldOperatorId | uint64 | The old operator ID | +| shares | bytes | The operator shares | +| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | +| oldCluster | struct ISSVNetworkCore.Cluster | The old SSV cluster snapshot | +| feeAmount | uint256 | The fee amount to deposit | +| processed | bool | Whether the fee amount is already processed | -### getReadyPoolIds +### withdrawUpkeepBalance ```solidity -function getReadyPoolIds() external view returns (uint32[]) +function withdrawUpkeepBalance() external ``` -Get the ready pool IDs - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32[] | readyPoolIds The ready pool IDs | +Cancel upkeep and withdraw the upkeep balance -### getPendingPoolIds +### withdrawLINKBalance ```solidity -function getPendingPoolIds() external view returns (uint32[]) +function withdrawLINKBalance(uint256 amount) external ``` -Get the pending pool IDs +Withdraw a given amount from the LINK balance -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32[] | pendingPoolIds The pending pool IDs | +| amount | uint256 | The amount to withdraw | -### getStakedPoolIds +### withdrawSSVBalance ```solidity -function getStakedPoolIds() external view returns (uint32[]) +function withdrawSSVBalance(uint256 amount) external ``` -Get the staked pool IDs +Withdraw a given amount from the SSV balance -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32[] | stakedPoolIds The staked pool IDs | +| amount | uint256 | The amount to withdraw | -### getPrepoolBalance +### setFunctionsAddress ```solidity -function getPrepoolBalance() external view returns (uint256) +function setFunctionsAddress(address functionsAddress) external ``` -Get the pre-pool balance +Update the functions oracle address -#### Return Values +#### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | prepoolBalance The pre-pool balance | +| functionsAddress | address | New functions oracle address | -### getPoolAddress +### getUserStake ```solidity -function getPoolAddress(uint32 poolId) external view returns (address) +function getUserStake(address userAddress) public view returns (uint256 userStake) ``` -Get a pool's address by ID +Get the total user stake for a given user address #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | +| userAddress | address | The user address | #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | address | poolAddress The pool address | +| userStake | uint256 | The total user stake | -### getPoolDetails +### totalStake ```solidity -function getPoolDetails(uint32 poolId) external view returns (struct ICasimirManager.PoolDetails poolDetails) +function totalStake() public view returns (uint256 totalStake) ``` -Get a pool's details by ID +Get the total stake -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | +| totalStake | uint256 | The total stake | + +### getBufferedBalance + +```solidity +function getBufferedBalance() public view returns (uint256 bufferedBalance) +``` + +Get the buffered balance #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| poolDetails | struct ICasimirManager.PoolDetails | The pool details | +| bufferedBalance | uint256 | The buffered balance | -### getRegistryAddress +### getReadyBalance ```solidity -function getRegistryAddress() external view returns (address registryAddress) +function getReadyBalance() public view returns (uint256 readyBalance) ``` -Get the registry address +Get the ready balance #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| registryAddress | address | The registry address | +| readyBalance | uint256 | The ready balance | -### getUpkeepId +### getWithdrawableBalance ```solidity -function getUpkeepId() external view returns (uint256) +function getWithdrawableBalance() public view returns (uint256) ``` -Get the upkeep ID +Get the withdrawable balanace #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | upkeepId The upkeep ID | +| [0] | uint256 | withdrawableBalance The withdrawable balanace | -### getUpkeepAddress +### getReservedFeeBalance ```solidity -function getUpkeepAddress() external view returns (address upkeepAddress) +function getReservedFeeBalance() public view returns (uint256) ``` -Get the upkeep address +Get the reserved fee balance #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| upkeepAddress | address | The upkeep address | +| [0] | uint256 | reservedFeeBalance The reserved fee balance | -### getUpkeepBalance +### getExpectedEffectiveBalance ```solidity -function getUpkeepBalance() external view returns (uint256 upkeepBalance) +function getExpectedEffectiveBalance() public view returns (uint256 expectedEffectiveBalance) ``` -Get the upkeep balance +Get the expected effective balance #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| upkeepBalance | uint256 | The upkeep balance | - -## CasimirPool +| expectedEffectiveBalance | uint256 | The expected effective balance | -### poolCapacity +### latestActiveBalance ```solidity -uint256 poolCapacity +function latestActiveBalance() public view returns (uint256) ``` -### constructor +Get the latest active balance -```solidity -constructor(address registryAddress, uint32 poolId, bytes publicKey, uint64[] operatorIds) public -``` +#### Return Values -### depositRewards +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | latestActiveBalance The latest active balance | + +### latestActiveBalanceAfterFees ```solidity -function depositRewards() external +function latestActiveBalanceAfterFees() public view returns (uint256) ``` -### withdrawBalance +Get the latest active balance after fees -```solidity -function withdrawBalance(uint32[] blamePercents) external -``` +#### Return Values -### setOperatorIds +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | latestActiveBalanceAfterFees The latest active balance after fees | + +### finalizableCompletedExits ```solidity -function setOperatorIds(uint64[] operatorIds) external +function finalizableCompletedExits() public view returns (uint256) ``` -### setReshares +Get the finalizable completed exit count of the current reporting period -```solidity -function setReshares(uint256 reshares) external -``` +#### Return Values -### setStatus +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | finalizableCompletedExits The finalizable completed exit count of the current reporting period | + +### reportPeriod ```solidity -function setStatus(enum ICasimirPool.PoolStatus status) external +function reportPeriod() public view returns (uint256) ``` -### getBalance +Get the report period -```solidity -function getBalance() external view returns (uint256) -``` +#### Return Values -### getConfig +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | reportPeriod The report period | + +### getPendingWithdrawalEligibility ```solidity -function getConfig() external view returns (struct ICasimirPool.PoolConfig) +function getPendingWithdrawalEligibility(uint256 index, uint256 period) public view returns (bool) ``` -### getOperatorIds +Get the eligibility of a pending withdrawal -```solidity -function getOperatorIds() external view returns (uint64[]) -``` +#### Parameters -### getPublicKey +| Name | Type | Description | +| ---- | ---- | ----------- | +| index | uint256 | The index of the pending withdrawal | +| period | uint256 | The period to check | -```solidity -function getPublicKey() external view returns (bytes) -``` +#### Return Values -### getStatus +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bool | pendingWithdrawalEligibility The eligibility of a pending withdrawal | + +### requestedWithdrawalBalance ```solidity -function getStatus() external view returns (enum ICasimirPool.PoolStatus) +function requestedWithdrawalBalance() public view returns (uint256) ``` -## CasimirRegistry +Get the total pending user withdrawal amount -### onlyOwnerOrPool +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | requestedWithdrawalBalance The total pending user withdrawal amount | + +### requestedWithdrawals ```solidity -modifier onlyOwnerOrPool(uint32 poolId) +function requestedWithdrawals() public view returns (uint256) ``` -_Validate the caller is owner or the authorized pool_ +Get the total pending withdrawal count -### constructor +#### Return Values -```solidity -constructor(address ssvNetworkViewsAddress) public -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | requestedWithdrawals The total pending withdrawal count | -### registerOperator +### feePercent ```solidity -function registerOperator(uint64 operatorId) external payable +function feePercent() public view returns (uint32) ``` -Register an operator with the set +Get the total fee percentage -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +| [0] | uint32 | feePercent The total fee percentage | -### depositCollateral +### requestedExits ```solidity -function depositCollateral(uint64 operatorId) external payable +function requestedExits() external view returns (uint256) ``` -Deposit collateral for an operator +Get the count of pools requested to exit -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +| [0] | uint256 | requestedExits The count of pools requested to exit | -### withdrawCollateral +### getReadyPoolIds ```solidity -function withdrawCollateral(uint64 operatorId, uint256 amount) external +function getReadyPoolIds() external view returns (uint32[]) ``` -Withdraw collateral for an operator +Get the ready pool IDs -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | -| amount | uint256 | The amount to withdraw | +| [0] | uint32[] | readyPoolIds The ready pool IDs | -### addOperatorPool +### getPendingPoolIds ```solidity -function addOperatorPool(uint64 operatorId, uint32 poolId) external +function getPendingPoolIds() external view returns (uint32[]) ``` -Add a pool to an operator +Get the pending pool IDs -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | -| poolId | uint32 | The pool ID | +| [0] | uint32[] | pendingPoolIds The pending pool IDs | -### removeOperatorPool +### getStakedPoolIds ```solidity -function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external +function getStakedPoolIds() external view returns (uint32[]) ``` -Remove a pool from an operator +Get the staked pool IDs -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | -| poolId | uint32 | The pool ID | -| blameAmount | uint256 | The amount to recover from collateral | +| [0] | uint32[] | stakedPoolIds The staked pool IDs | -### requestDeregistration +### prepoolBalance ```solidity -function requestDeregistration(uint64 operatorId) external +function prepoolBalance() external view returns (uint256) ``` -Request deregistration for an operator +Get the pre-pool balance -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +| [0] | uint256 | prepoolBalance The pre-pool balance | -### getOperatorCollateral +### getPoolAddress ```solidity -function getOperatorCollateral(uint64 operatorId) external view returns (int256 collateral) +function getPoolAddress(uint32 poolId) external view returns (address) ``` -Get the collateral of an operator +Get a pool's address by ID #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +| poolId | uint32 | The pool ID | #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| collateral | int256 | The collateral | +| [0] | address | poolAddress The pool address | -### getOperatorEligibility +### getPoolDetails ```solidity -function getOperatorEligibility(uint64 operatorId) external view returns (bool eligibility) +function getPoolDetails(uint32 poolId) external view returns (struct ICasimirManager.PoolDetails poolDetails) ``` -Get the eligibility of an operator +Get a pool's details by ID #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +| poolId | uint32 | The pool ID | #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| eligibility | bool | The eligibility | +| poolDetails | struct ICasimirManager.PoolDetails | The pool details | -### getOperatorIds +### getRegistryAddress ```solidity -function getOperatorIds() external view returns (uint64[]) +function getRegistryAddress() external view returns (address registryAddress) ``` -Get the operator IDs +Get the registry address #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint64[] | operatorIds The operator IDs | - -## CasimirUpkeep +| registryAddress | address | The registry address | -### reportHeartbeat +### getUpkeepId ```solidity -uint256 reportHeartbeat +function getUpkeepId() external view returns (uint256) ``` -Oracle heartbeat - -### poolCapacity +Get the upkeep ID -```solidity -uint256 poolCapacity -``` +#### Return Values -Pool capacity +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | upkeepId The upkeep ID | -### reportPeriod +### getUpkeepAddress ```solidity -uint256 reportPeriod +function getUpkeepAddress() external view returns (address upkeepAddress) ``` -Current report period +Get the upkeep address -### reportRemainingRequests +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| upkeepAddress | address | The upkeep address | + +### getUpkeepBalance ```solidity -uint256 reportRemainingRequests +function getUpkeepBalance() external view returns (uint256 upkeepBalance) ``` -Current report remaining request count +Get the upkeep balance -### reportRequestBlock +#### Return Values -```solidity -uint256 reportRequestBlock -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| upkeepBalance | uint256 | The upkeep balance | -Current report block +## CasimirPool -### reportCompoundablePoolIds +### poolCapacity ```solidity -uint32[5] reportCompoundablePoolIds +uint256 poolCapacity ``` -Current report compoundable pools - -### finalizableCompoundablePoolIds +### constructor ```solidity -uint32[5] finalizableCompoundablePoolIds +constructor(address registryAddress, uint32 poolId, bytes publicKey, uint64[] operatorIds) public ``` -Finalizable compoundable pools - -### requestCBOR +### depositRewards ```solidity -bytes requestCBOR +function depositRewards() external ``` -Binary request source code - -### fulfillGasLimit +### withdrawBalance ```solidity -uint32 fulfillGasLimit +function withdrawBalance(uint32[] blamePercents) external ``` -Fulfillment gas limit - -### constructor +### setOperatorIds ```solidity -constructor(address linkFunctionsAddress) public +function setOperatorIds(uint64[] operatorIds) external ``` -Constructor - -#### Parameters +### setReshares -| Name | Type | Description | -| ---- | ---- | ----------- | -| linkFunctionsAddress | address | The functions oracle contract address | +```solidity +function setReshares(uint256 reshares) external +``` -### generateRequest +### setStatus ```solidity -function generateRequest(string source, bytes secrets, string[] args) public pure returns (bytes) +function setStatus(enum ICasimirPool.PoolStatus status) external ``` -Generate a new Functions.Request(off-chain, saving gas) - -#### Parameters +### getBalance -| Name | Type | Description | -| ---- | ---- | ----------- | -| source | string | JavaScript source code | -| secrets | bytes | Encrypted secrets payload | -| args | string[] | List of arguments accessible from within the source code | +```solidity +function getBalance() external view returns (uint256) +``` -### setRequest +### getConfig ```solidity -function setRequest(uint32 _fulfillGasLimit, uint64 _linkSubscriptionId, bytes _requestCBOR) external +function getConfig() external view returns (struct ICasimirPool.PoolConfig) ``` -Set the bytes representing the CBOR-encoded Functions.Request - -#### Parameters +### getOperatorIds -| Name | Type | Description | -| ---- | ---- | ----------- | -| _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | -| _linkSubscriptionId | uint64 | The functions billing subscription ID used to pay for Functions requests | -| _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | +```solidity +function getOperatorIds() external view returns (uint64[]) +``` -### checkUpkeep +### getPublicKey ```solidity -function checkUpkeep(bytes) public view returns (bool upkeepNeeded, bytes) +function getPublicKey() external view returns (bytes) ``` -Check if the upkeep is needed +### getStatus -#### Return Values +```solidity +function getStatus() external view returns (enum ICasimirPool.PoolStatus) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| upkeepNeeded | bool | True if the upkeep is needed | -| [1] | bytes | | +## CasimirRegistry -### performUpkeep +### onlyOwnerOrPool ```solidity -function performUpkeep(bytes) external +modifier onlyOwnerOrPool(uint32 poolId) ``` -Perform the upkeep +_Validate the caller is owner or the authorized pool_ -### fulfillRequest +### constructor ```solidity -function fulfillRequest(bytes32 requestId, bytes response, bytes _error) internal +constructor(address ssvNetworkViewsAddress) public ``` -Callback that is invoked once the DON has resolved the request or hit an error +### registerOperator + +```solidity +function registerOperator(uint64 operatorId) external payable +``` + +Register an operator with the set #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| requestId | bytes32 | The request ID, returned by sendRequest() | -| response | bytes | Aggregated response from the user code | -| _error | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | +| operatorId | uint64 | The operator ID | -### setOracleAddress +### depositCollateral ```solidity -function setOracleAddress(address newOracleAddress) external +function depositCollateral(uint64 operatorId) external payable ``` -Update the functions oracle address +Deposit collateral for an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| newOracleAddress | address | New oracle address | +| operatorId | uint64 | The operator ID | -### encodeResponse +### withdrawCollateral ```solidity -function encodeResponse(uint128 activeBalance, uint32 activatedDeposits, uint32 completedExits, uint32 slashedExits) external pure returns (bytes) +function withdrawCollateral(uint64 operatorId, uint256 amount) external ``` -Encode the response for testing +Withdraw collateral for an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| activeBalance | uint128 | Active balance | -| activatedDeposits | uint32 | Count of new deposits | -| completedExits | uint32 | Count of new exits | -| slashedExits | uint32 | Count of new slashedExits | +| operatorId | uint64 | The operator ID | +| amount | uint256 | The amount to withdraw | -### mockFulfillRequest +### addOperatorPool ```solidity -function mockFulfillRequest(bytes32 requestId, bytes response, bytes err) external +function addOperatorPool(uint64 operatorId, uint32 poolId) external ``` -Fulfill the request for testing +Add a pool to an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| requestId | bytes32 | The request ID, returned by sendRequest() | -| response | bytes | Aggregated response from the user code | -| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | - -## CasimirViews - -### constructor - -```solidity -constructor(address managerAddress, address registryAddress) public -``` +| operatorId | uint64 | The operator ID | +| poolId | uint32 | The pool ID | -### getCompoundablePoolIds +### removeOperatorPool ```solidity -function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5] poolIds) +function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external ``` -Get the next five compoundable pool IDs - -_Should be called off-chain_ +Remove a pool from an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolIds | uint32[5] | The next five compoundable pool IDs | +| operatorId | uint64 | The operator ID | +| poolId | uint32 | The pool ID | +| blameAmount | uint256 | The amount to recover from collateral | -### getEligibleOperatorIds +### requestDeregistration ```solidity -function getEligibleOperatorIds(uint256 startIndex, uint256 endIndex) external view returns (uint64[] activeOperatorIds) +function requestDeregistration(uint64 operatorId) external ``` -Get the active operator IDs +Request deregistration for an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| activeOperatorIds | uint64[] | The active operator IDs | +| operatorId | uint64 | The operator ID | -### getSweptBalance +### getOperatorCollateral ```solidity -function getSweptBalance(uint256 startIndex, uint256 endIndex) public view returns (uint256 balance) +function getOperatorCollateral(uint64 operatorId) external view returns (int256 collateral) ``` -Get the swept balance - -_Should be called off-chain_ +Get the collateral of an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | +| operatorId | uint64 | The operator ID | #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| balance | uint256 | The swept balance | - -## ICasimirManager - -### Token - -```solidity -enum Token { - LINK, - SSV, - WETH -} -``` - -### PoolDetails - -```solidity -struct PoolDetails { - uint32 id; - uint256 balance; - bytes publicKey; - uint64[] operatorIds; - enum ICasimirPool.PoolStatus status; -} -``` +| collateral | int256 | The collateral | -### User +### getOperatorEligibility ```solidity -struct User { - uint256 stake0; - uint256 stakeRatioSum0; - uint256 actionPeriodTimestamp; - uint256 actionCount; -} +function getOperatorEligibility(uint64 operatorId) external view returns (bool eligibility) ``` -### Withdrawal - -```solidity -struct Withdrawal { - address user; - uint256 amount; - uint256 period; -} -``` +Get the eligibility of an operator -### DepositRequested +#### Parameters -```solidity -event DepositRequested(uint32 poolId) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | -### DepositInitiated +#### Return Values -```solidity -event DepositInitiated(uint32 poolId) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| eligibility | bool | The eligibility | -### DepositActivated +### getOperatorIds ```solidity -event DepositActivated(uint32 poolId) +function getOperatorIds() external view returns (uint64[]) ``` -### ResharesRequested +Get the operator IDs -```solidity -event ResharesRequested(uint64 operatorId) -``` +#### Return Values -### ReshareCompleted +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint64[] | operatorIds The operator IDs | -```solidity -event ReshareCompleted(uint32 poolId) -``` +## CasimirUpkeep -### ExitRequested +### reportHeartbeat ```solidity -event ExitRequested(uint32 poolId) +uint256 reportHeartbeat ``` -### ForcedExitReportsRequested - -```solidity -event ForcedExitReportsRequested(uint256 count) -``` +Oracle heartbeat -### SlashedExitReportsRequested +### poolCapacity ```solidity -event SlashedExitReportsRequested(uint256 count) +uint256 poolCapacity ``` -### CompletedExitReportsRequested - -```solidity -event CompletedExitReportsRequested(uint256 count) -``` +Pool capacity -### ExitCompleted +### reportPeriod ```solidity -event ExitCompleted(uint32 poolId) +uint256 reportPeriod ``` -### StakeDeposited - -```solidity -event StakeDeposited(address sender, uint256 amount) -``` +Current report period -### StakeRebalanced +### reportRemainingRequests ```solidity -event StakeRebalanced(uint256 amount) +uint256 reportRemainingRequests ``` -### RewardsDeposited - -```solidity -event RewardsDeposited(uint256 amount) -``` +Current report remaining request count -### TipsDeposited +### reportRequestBlock ```solidity -event TipsDeposited(uint256 amount) +uint256 reportRequestBlock ``` -### WithdrawalRequested +Current report block + +### reportCompoundablePoolIds ```solidity -event WithdrawalRequested(address sender, uint256 amount) +uint32[5] reportCompoundablePoolIds ``` -### WithdrawalInitiated +Current report compoundable pools + +### finalizableCompoundablePoolIds ```solidity -event WithdrawalInitiated(address sender, uint256 amount) +uint32[5] finalizableCompoundablePoolIds ``` -### WithdrawalFulfilled +Finalizable compoundable pools + +### requestCBOR ```solidity -event WithdrawalFulfilled(address sender, uint256 amount) +bytes requestCBOR ``` -### depositStake +Binary request source code + +### fulfillGasLimit ```solidity -function depositStake() external payable +uint32 fulfillGasLimit ``` -### depositRewards +Fulfillment gas limit + +### constructor ```solidity -function depositRewards() external payable +constructor(address linkFunctionsAddress) public ``` -### depositExitedBalance +Constructor -```solidity -function depositExitedBalance(uint32 poolId) external payable -``` +#### Parameters -### depositRecoveredBalance +| Name | Type | Description | +| ---- | ---- | ----------- | +| linkFunctionsAddress | address | The functions oracle contract address | + +### generateRequest ```solidity -function depositRecoveredBalance(uint32 poolId) external payable +function generateRequest(string source, bytes secrets, string[] args) public pure returns (bytes) ``` -### depositReservedFees +Generate a new Functions.Request(off-chain, saving gas) -```solidity -function depositReservedFees() external payable -``` +#### Parameters -### depositClusterBalance +| Name | Type | Description | +| ---- | ---- | ----------- | +| source | string | JavaScript source code | +| secrets | bytes | Encrypted secrets payload | +| args | string[] | List of arguments accessible from within the source code | + +### setRequest ```solidity -function depositClusterBalance(uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external +function setRequest(uint32 _fulfillGasLimit, uint64 _linkSubscriptionId, bytes _requestCBOR) external ``` -### depositUpkeepBalance +Set the bytes representing the CBOR-encoded Functions.Request -```solidity -function depositUpkeepBalance(uint256 feeAmount, bool processed) external -``` +#### Parameters -### rebalanceStake +| Name | Type | Description | +| ---- | ---- | ----------- | +| _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | +| _linkSubscriptionId | uint64 | The functions billing subscription ID used to pay for Functions requests | +| _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | + +### checkUpkeep ```solidity -function rebalanceStake(uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, uint256 completedExits) external +function checkUpkeep(bytes) public view returns (bool upkeepNeeded, bytes) ``` -### compoundRewards +Check if the upkeep is needed -```solidity -function compoundRewards(uint32[5] poolIds) external -``` +#### Return Values -### requestWithdrawal +| Name | Type | Description | +| ---- | ---- | ----------- | +| upkeepNeeded | bool | True if the upkeep is needed | +| [1] | bytes | | + +### performUpkeep ```solidity -function requestWithdrawal(uint256 amount) external +function performUpkeep(bytes) external ``` -### fulfillWithdrawals +Perform the upkeep + +### fulfillRequest ```solidity -function fulfillWithdrawals(uint256 count) external +function fulfillRequest(bytes32 requestId, bytes response, bytes _error) internal ``` -### initiateDeposit +Callback that is invoked once the DON has resolved the request or hit an error -```solidity -function initiateDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external -``` +#### Parameters -### activateDeposits +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| _error | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | + +### setOracleAddress ```solidity -function activateDeposits(uint256 count) external +function setOracleAddress(address newOracleAddress) external ``` -### requestForcedExitReports +Update the functions oracle address -```solidity -function requestForcedExitReports(uint256 count) external -``` +#### Parameters -### requestCompletedExitReports +| Name | Type | Description | +| ---- | ---- | ----------- | +| newOracleAddress | address | New oracle address | + +### encodeResponse ```solidity -function requestCompletedExitReports(uint256 count) external +function encodeResponse(uint128 activeBalance, uint32 activatedDeposits, uint32 completedExits, uint32 slashedExits) external pure returns (bytes) ``` -### requestReshares +Encode the response for testing -```solidity -function requestReshares(uint64 operatorId) external -``` +#### Parameters -### reportForcedExits +| Name | Type | Description | +| ---- | ---- | ----------- | +| activeBalance | uint128 | Active balance | +| activatedDeposits | uint32 | Count of new deposits | +| completedExits | uint32 | Count of new exits | +| slashedExits | uint32 | Count of new slashedExits | + +### mockFulfillRequest ```solidity -function reportForcedExits(uint32[] poolIds) external +function mockFulfillRequest(bytes32 requestId, bytes response, bytes err) external ``` -### reportCompletedExit +Fulfill the request for testing -```solidity -function reportCompletedExit(uint256 poolIndex, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external -``` +#### Parameters -### reportReshare +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | -```solidity -function reportReshare(uint32 poolId, uint64[] operatorIds, uint64[] oldOperatorIds, uint64 newOperatorId, uint64 oldOperatorId, bytes shares, struct ISSVNetworkCore.Cluster cluster, struct ISSVNetworkCore.Cluster oldCluster, uint256 feeAmount, bool processed) external -``` +## CasimirViews -### withdrawLINKBalance +### constructor ```solidity -function withdrawLINKBalance(uint256 amount) external +constructor(address managerAddress, address registryAddress) public ``` -### withdrawSSVBalance +### getCompoundablePoolIds ```solidity -function withdrawSSVBalance(uint256 amount) external +function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5] poolIds) ``` -### setFunctionsAddress +Get the next five compoundable pool IDs -```solidity -function setFunctionsAddress(address functionsAddress) external -``` +_Should be called off-chain_ -### getFeePercent +#### Parameters -```solidity -function getFeePercent() external view returns (uint32) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | -### getRequestedExits +#### Return Values -```solidity -function getRequestedExits() external view returns (uint256) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolIds | uint32[5] | The next five compoundable pool IDs | -### getReadyPoolIds +### getEligibleOperatorIds ```solidity -function getReadyPoolIds() external view returns (uint32[]) +function getEligibleOperatorIds(uint256 startIndex, uint256 endIndex) external view returns (uint64[] activeOperatorIds) ``` -### getPendingPoolIds +Get the active operator IDs -```solidity -function getPendingPoolIds() external view returns (uint32[]) -``` +#### Parameters -### getStakedPoolIds +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | -```solidity -function getStakedPoolIds() external view returns (uint32[]) -``` +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| activeOperatorIds | uint64[] | The active operator IDs | -### getTotalStake +### getSweptBalance ```solidity -function getTotalStake() external view returns (uint256) +function getSweptBalance(uint256 startIndex, uint256 endIndex) public view returns (uint256 balance) ``` -### getBufferedBalance +Get the swept balance -```solidity -function getBufferedBalance() external view returns (uint256) -``` +_Should be called off-chain_ -### getExpectedEffectiveBalance +#### Parameters -```solidity -function getExpectedEffectiveBalance() external view returns (uint256) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values -### getFinalizableCompletedExits +| Name | Type | Description | +| ---- | ---- | ----------- | +| balance | uint256 | The swept balance | + +## ICasimirManager + +### Token ```solidity -function getFinalizableCompletedExits() external view returns (uint256) +enum Token { + LINK, + SSV, + WETH +} ``` -### getLatestActiveBalance +### PoolDetails ```solidity -function getLatestActiveBalance() external view returns (uint256) +struct PoolDetails { + uint32 id; + uint256 balance; + bytes publicKey; + uint64[] operatorIds; + enum ICasimirPool.PoolStatus status; +} ``` -### getLatestActiveBalanceAfterFees +### User ```solidity -function getLatestActiveBalanceAfterFees() external view returns (uint256) +struct User { + uint256 stake0; + uint256 stakeRatioSum0; + uint256 actionPeriodTimestamp; + uint256 actionCount; +} ``` -### getReportPeriod +### Withdrawal ```solidity -function getReportPeriod() external view returns (uint256) +struct Withdrawal { + address user; + uint256 amount; + uint256 period; +} ``` -### getPendingWithdrawalEligibility +### DepositRequested ```solidity -function getPendingWithdrawalEligibility(uint256 index, uint256 period) external view returns (bool) +event DepositRequested(uint32 poolId) ``` -### getWithdrawableBalance +### DepositInitiated ```solidity -function getWithdrawableBalance() external view returns (uint256) +event DepositInitiated(uint32 poolId) ``` -### getPrepoolBalance +### DepositActivated ```solidity -function getPrepoolBalance() external view returns (uint256) +event DepositActivated(uint32 poolId) ``` -### getUserStake +### ResharesRequested ```solidity -function getUserStake(address userAddress) external view returns (uint256) +event ResharesRequested(uint64 operatorId) ``` -### getPendingWithdrawalBalance +### ReshareCompleted ```solidity -function getPendingWithdrawalBalance() external view returns (uint256) +event ReshareCompleted(uint32 poolId) ``` -### getPendingWithdrawals +### ExitRequested ```solidity -function getPendingWithdrawals() external view returns (uint256) +event ExitRequested(uint32 poolId) ``` -### getPoolAddress +### ForcedExitReportsRequested ```solidity -function getPoolAddress(uint32 poolId) external view returns (address) +event ForcedExitReportsRequested(uint256 count) ``` -### getPoolDetails +### SlashedExitReportsRequested ```solidity -function getPoolDetails(uint32 poolId) external view returns (struct ICasimirManager.PoolDetails) +event SlashedExitReportsRequested(uint256 count) ``` -### getRegistryAddress +### CompletedExitReportsRequested ```solidity -function getRegistryAddress() external view returns (address) +event CompletedExitReportsRequested(uint256 count) ``` -### getUpkeepId +### ExitCompleted ```solidity -function getUpkeepId() external view returns (uint256) +event ExitCompleted(uint32 poolId) ``` -### getUpkeepAddress +### StakeDeposited ```solidity -function getUpkeepAddress() external view returns (address) +event StakeDeposited(address sender, uint256 amount) ``` -### getUpkeepBalance +### StakeRebalanced ```solidity -function getUpkeepBalance() external view returns (uint256 upkeepBalance) +event StakeRebalanced(uint256 amount) ``` -## ICasimirPool - -### PoolConfig +### RewardsDeposited ```solidity -struct PoolConfig { - uint32 poolId; - bytes publicKey; - uint64[] operatorIds; - uint256 reshares; - enum ICasimirPool.PoolStatus status; -} +event RewardsDeposited(uint256 amount) ``` -### PoolStatus +### TipsDeposited ```solidity -enum PoolStatus { - PENDING, - ACTIVE, - EXITING_FORCED, - EXITING_REQUESTED, - WITHDRAWN -} +event TipsDeposited(uint256 amount) ``` -### depositRewards +### WithdrawalRequested ```solidity -function depositRewards() external +event WithdrawalRequested(address sender, uint256 amount) ``` -### withdrawBalance +### WithdrawalInitiated ```solidity -function withdrawBalance(uint32[] blamePercents) external +event WithdrawalInitiated(address sender, uint256 amount) ``` -### setOperatorIds +### WithdrawalFulfilled ```solidity -function setOperatorIds(uint64[] operatorIds) external +event WithdrawalFulfilled(address sender, uint256 amount) ``` -### setReshares +### depositStake ```solidity -function setReshares(uint256 reshares) external +function depositStake() external payable ``` -### setStatus +### depositRewards ```solidity -function setStatus(enum ICasimirPool.PoolStatus status) external +function depositRewards() external payable ``` -### getBalance +### depositExitedBalance ```solidity -function getBalance() external view returns (uint256) +function depositExitedBalance(uint32 poolId) external payable ``` -### getConfig +### depositRecoveredBalance ```solidity -function getConfig() external view returns (struct ICasimirPool.PoolConfig) +function depositRecoveredBalance(uint32 poolId) external payable ``` -### getOperatorIds +### depositReservedFees ```solidity -function getOperatorIds() external view returns (uint64[]) +function depositReservedFees() external payable ``` -### getPublicKey +### depositClusterBalance ```solidity -function getPublicKey() external view returns (bytes) +function depositClusterBalance(uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external ``` -### getStatus +### depositUpkeepBalance ```solidity -function getStatus() external view returns (enum ICasimirPool.PoolStatus) +function depositUpkeepBalance(uint256 feeAmount, bool processed) external ``` -## ICasimirRegistry - -### OperatorRegistered +### rebalanceStake ```solidity -event OperatorRegistered(uint64 operatorId) +function rebalanceStake(uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, uint256 completedExits) external ``` -### DeregistrationRequested +### compoundRewards ```solidity -event DeregistrationRequested(uint64 operatorId) +function compoundRewards(uint32[5] poolIds) external ``` -### DeregistrationCompleted +### requestWithdrawal ```solidity -event DeregistrationCompleted(uint64 operatorId) +function requestWithdrawal(uint256 amount) external ``` -### Operator +### fulfillWithdrawals ```solidity -struct Operator { - bool active; - bool resharing; - int256 collateral; - uint256 poolCount; - mapping(uint32 => bool) pools; -} +function fulfillWithdrawals(uint256 count) external ``` -### registerOperator +### initiateDeposit ```solidity -function registerOperator(uint64 operatorId) external payable +function initiateDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external ``` -### depositCollateral +### activateDeposits ```solidity -function depositCollateral(uint64 operatorId) external payable +function activateDeposits(uint256 count) external ``` -### withdrawCollateral +### requestForcedExitReports ```solidity -function withdrawCollateral(uint64 operatorId, uint256 amount) external +function requestForcedExitReports(uint256 count) external ``` -### addOperatorPool +### requestCompletedExitReports ```solidity -function addOperatorPool(uint64 operatorId, uint32 poolId) external +function requestCompletedExitReports(uint256 count) external ``` -### removeOperatorPool +### requestReshares ```solidity -function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external +function requestReshares(uint64 operatorId) external ``` -### getOperatorCollateral +### reportForcedExits ```solidity -function getOperatorCollateral(uint64 operatorId) external view returns (int256) +function reportForcedExits(uint32[] poolIds) external ``` -### getOperatorEligibility +### reportCompletedExit ```solidity -function getOperatorEligibility(uint64 operatorId) external view returns (bool eligibility) +function reportCompletedExit(uint256 poolIndex, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external ``` -### getOperatorIds +### reportReshare ```solidity -function getOperatorIds() external view returns (uint64[]) +function reportReshare(uint32 poolId, uint64[] operatorIds, uint64[] oldOperatorIds, uint64 newOperatorId, uint64 oldOperatorId, bytes shares, struct ISSVNetworkCore.Cluster cluster, struct ISSVNetworkCore.Cluster oldCluster, uint256 feeAmount, bool processed) external ``` -## ICasimirUpkeep - -### RequestType +### withdrawLINKBalance ```solidity -enum RequestType { - NONE, - BALANCES, - DETAILS -} +function withdrawLINKBalance(uint256 amount) external ``` -### ReportStatus +### withdrawSSVBalance ```solidity -enum ReportStatus { - FINALIZED, - REQUESTING, - PROCESSING -} +function withdrawSSVBalance(uint256 amount) external ``` -### OCRResponse +### setFunctionsAddress ```solidity -event OCRResponse(bytes32 requestId, bytes result, bytes err) +function setFunctionsAddress(address functionsAddress) external ``` -### UpkeepPerformed +### feePercent ```solidity -event UpkeepPerformed(enum ICasimirUpkeep.ReportStatus status) +function feePercent() external view returns (uint32) ``` -### checkUpkeep +### requestedExits ```solidity -function checkUpkeep(bytes checkData) external returns (bool upkeepNeeded, bytes performData) +function requestedExits() external view returns (uint256) ``` -method that is simulated by the keepers to see if any work actually -needs to be performed. This method does does not actually need to be -executable, and since it is only ever simulated it can consume lots of gas. - -_To ensure that it is never called, you may want to add the -cannotExecute modifier from KeeperBase to your implementation of this -method._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| checkData | bytes | specified in the upkeep registration so it is always the same for a registered upkeep. This can easily be broken down into specific arguments using `abi.decode`, so multiple upkeeps can be registered on the same contract and easily differentiated by the contract. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| upkeepNeeded | bool | boolean to indicate whether the keeper should call performUpkeep or not. | -| performData | bytes | bytes that the keeper should call performUpkeep with, if upkeep is needed. If you would like to encode data to decode later, try `abi.encode`. | - -### performUpkeep +### getReadyPoolIds ```solidity -function performUpkeep(bytes performData) external +function getReadyPoolIds() external view returns (uint32[]) ``` -method that is actually executed by the keepers, via the registry. -The data returned by the checkUpkeep simulation will be passed into -this method to actually be executed. - -_The input to this method should not be trusted, and the caller of the -method should not even be restricted to any single registry. Anyone should -be able call it, and the input should be validated, there is no guarantee -that the data passed in is the performData returned from checkUpkeep. This -could happen due to malicious keepers, racing keepers, or simply a state -change while the performUpkeep transaction is waiting for confirmation. -Always validate the data passed in._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| performData | bytes | is the data which was passed back from the checkData simulation. If it is encoded, it can easily be decoded into other types by calling `abi.decode`. This data should not be trusted, and should be validated against the contract's current state. | - -### setOracleAddress +### getPendingPoolIds ```solidity -function setOracleAddress(address oracleAddress) external +function getPendingPoolIds() external view returns (uint32[]) ``` -### mockFulfillRequest +### getStakedPoolIds ```solidity -function mockFulfillRequest(bytes32 requestId, bytes result, bytes err) external +function getStakedPoolIds() external view returns (uint32[]) ``` -## ICasimirViews - -### getCompoundablePoolIds +### totalStake ```solidity -function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5]) +function totalStake() external view returns (uint256) ``` -### getSweptBalance +### getBufferedBalance ```solidity -function getSweptBalance(uint256 startIndex, uint256 endIndex) external view returns (uint256) +function getBufferedBalance() external view returns (uint256) ``` -## Types32Array - -### remove +### getExpectedEffectiveBalance ```solidity -function remove(uint32[] uint32Array, uint256 index) internal +function getExpectedEffectiveBalance() external view returns (uint256) ``` -_Remove a uint32 element from the array_ +### finalizableCompletedExits -#### Parameters +```solidity +function finalizableCompletedExits() external view returns (uint256) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| uint32Array | uint32[] | The array of uint32 | -| index | uint256 | | +### latestActiveBalance -## TypesBytesArray +```solidity +function latestActiveBalance() external view returns (uint256) +``` -### remove +### latestActiveBalanceAfterFees ```solidity -function remove(bytes[] bytesArray, uint256 index) internal +function latestActiveBalanceAfterFees() external view returns (uint256) ``` -_Remove a bytes element from the array_ +### reportPeriod -#### Parameters +```solidity +function reportPeriod() external view returns (uint256) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| bytesArray | bytes[] | The array of bytes | -| index | uint256 | The index of the element to remove | +### getPendingWithdrawalEligibility -## TypesWithdrawalArray +```solidity +function getPendingWithdrawalEligibility(uint256 index, uint256 period) external view returns (bool) +``` -### remove +### getWithdrawableBalance ```solidity -function remove(struct ICasimirManager.Withdrawal[] withdrawals, uint256 index) internal +function getWithdrawableBalance() external view returns (uint256) ``` -_Remove a withdrawal from the array_ +### prepoolBalance -#### Parameters +```solidity +function prepoolBalance() external view returns (uint256) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| withdrawals | struct ICasimirManager.Withdrawal[] | The array of withdrawals | -| index | uint256 | The index of the withdrawal to remove | +### getUserStake -## TypesAddress +```solidity +function getUserStake(address userAddress) external view returns (uint256) +``` -### send +### requestedWithdrawalBalance ```solidity -function send(address user, uint256 amount) internal +function requestedWithdrawalBalance() external view returns (uint256) ``` -_Send ETH to a user_ +### requestedWithdrawals -#### Parameters +```solidity +function requestedWithdrawals() external view returns (uint256) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| user | address | The user address | -| amount | uint256 | The amount of stake to send | +### getPoolAddress -## IDepositContract +```solidity +function getPoolAddress(uint32 poolId) external view returns (address) +``` -### DepositEvent +### getPoolDetails ```solidity -event DepositEvent(bytes pubkey, bytes withdrawal_credentials, bytes amount, bytes signature, bytes index) +function getPoolDetails(uint32 poolId) external view returns (struct ICasimirManager.PoolDetails) ``` -A processed deposit event. - -### deposit +### getRegistryAddress ```solidity -function deposit(bytes pubkey, bytes withdrawal_credentials, bytes signature, bytes32 deposit_data_root) external payable +function getRegistryAddress() external view returns (address) ``` -Submit a Phase 0 DepositData object. - -#### Parameters +### getUpkeepId -| Name | Type | Description | -| ---- | ---- | ----------- | -| pubkey | bytes | A BLS12-381 public key. | -| withdrawal_credentials | bytes | Commitment to a public key for withdrawals. | -| signature | bytes | A BLS12-381 signature. | -| deposit_data_root | bytes32 | The SHA-256 hash of the SSZ-encoded DepositData object. Used as a protection against malformed input. | +```solidity +function getUpkeepId() external view returns (uint256) +``` -### get_deposit_root +### getUpkeepAddress ```solidity -function get_deposit_root() external view returns (bytes32) +function getUpkeepAddress() external view returns (address) ``` -Query the current deposit root hash. +### getUpkeepBalance -#### Return Values +```solidity +function getUpkeepBalance() external view returns (uint256 upkeepBalance) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes32 | The deposit root hash. | +## ICasimirPool -### get_deposit_count +### PoolConfig ```solidity -function get_deposit_count() external view returns (bytes) +struct PoolConfig { + uint32 poolId; + bytes publicKey; + uint64[] operatorIds; + uint256 reshares; + enum ICasimirPool.PoolStatus status; +} ``` -Query the current deposit count. +### PoolStatus -#### Return Values +```solidity +enum PoolStatus { + PENDING, + ACTIVE, + EXITING_FORCED, + EXITING_REQUESTED, + WITHDRAWN +} +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes | The deposit count encoded as a little endian 64-bit number. | +### depositRewards -## IWETH9 +```solidity +function depositRewards() external +``` -### deposit +### withdrawBalance ```solidity -function deposit() external payable +function withdrawBalance(uint32[] blamePercents) external ``` -Deposit ether to get wrapped ether - -### withdraw +### setOperatorIds ```solidity -function withdraw(uint256) external +function setOperatorIds(uint64[] operatorIds) external ``` -Withdraw wrapped ether to get ether +### setReshares -## KeeperRegistrarInterface +```solidity +function setReshares(uint256 reshares) external +``` -### RegistrationParams +### setStatus ```solidity -struct RegistrationParams { - string name; - bytes encryptedEmail; - address upkeepContract; - uint32 gasLimit; - address adminAddress; - bytes checkData; - bytes offchainConfig; - uint96 amount; -} +function setStatus(enum ICasimirPool.PoolStatus status) external ``` -### registerUpkeep +### getBalance ```solidity -function registerUpkeep(struct KeeperRegistrarInterface.RegistrationParams requestParams) external returns (uint256) +function getBalance() external view returns (uint256) ``` -## CasimirMultisig - -### owners +### getConfig ```solidity -address[] owners +function getConfig() external view returns (struct ICasimirPool.PoolConfig) ``` -### isOwner +### getOperatorIds ```solidity -mapping(address => bool) isOwner +function getOperatorIds() external view returns (uint64[]) ``` -### confirmationsRequired +### getPublicKey ```solidity -uint256 confirmationsRequired +function getPublicKey() external view returns (bytes) ``` -### isOwnerChangeConfirmed +### getStatus ```solidity -mapping(uint256 => mapping(address => bool)) isOwnerChangeConfirmed +function getStatus() external view returns (enum ICasimirPool.PoolStatus) ``` -### isTransactionConfirmed +## ICasimirRegistry + +### OperatorRegistered ```solidity -mapping(uint256 => mapping(address => bool)) isTransactionConfirmed +event OperatorRegistered(uint64 operatorId) ``` -### ownerChanges +### DeregistrationRequested ```solidity -struct ICasimirMultisig.OwnerChange[] ownerChanges +event DeregistrationRequested(uint64 operatorId) ``` -### transactions +### DeregistrationCompleted ```solidity -struct ICasimirMultisig.Transaction[] transactions +event DeregistrationCompleted(uint64 operatorId) ``` -### onlyOwner +### Operator ```solidity -modifier onlyOwner() +struct Operator { + bool active; + bool resharing; + int256 collateral; + uint256 poolCount; + mapping(uint32 => bool) pools; +} ``` -### ownerChangeExists +### registerOperator ```solidity -modifier ownerChangeExists(uint256 changeId) +function registerOperator(uint64 operatorId) external payable ``` -### ownerChangeNotExecuted +### depositCollateral ```solidity -modifier ownerChangeNotExecuted(uint256 changeId) +function depositCollateral(uint64 operatorId) external payable ``` -### ownerChangeNotConfirmed +### withdrawCollateral ```solidity -modifier ownerChangeNotConfirmed(uint256 changeId) +function withdrawCollateral(uint64 operatorId, uint256 amount) external ``` -### transactionExists +### addOperatorPool ```solidity -modifier transactionExists(uint256 transactionIndex) +function addOperatorPool(uint64 operatorId, uint32 poolId) external ``` -### transactionNotExecuted +### removeOperatorPool ```solidity -modifier transactionNotExecuted(uint256 transactionIndex) +function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external ``` -### transactionNotConfirmed +### getOperatorCollateral ```solidity -modifier transactionNotConfirmed(uint256 transactionIndex) +function getOperatorCollateral(uint64 operatorId) external view returns (int256) ``` -### constructor +### getOperatorEligibility ```solidity -constructor(address[] _owners) public +function getOperatorEligibility(uint64 operatorId) external view returns (bool eligibility) ``` -### receive +### getOperatorIds ```solidity -receive() external payable +function getOperatorIds() external view returns (uint64[]) ``` -### submitOwnerChange +## ICasimirUpkeep + +### RequestType ```solidity -function submitOwnerChange(address owner, bool add) public +enum RequestType { + NONE, + BALANCES, + DETAILS +} ``` -### confirmOwnerChange +### ReportStatus ```solidity -function confirmOwnerChange(uint256 changeId) public +enum ReportStatus { + FINALIZED, + REQUESTING, + PROCESSING +} ``` -### executeOwnerChange +### OCRResponse ```solidity -function executeOwnerChange(uint256 changeId) public +event OCRResponse(bytes32 requestId, bytes result, bytes err) ``` -### revokeOwnerChangeConfirmation +### UpkeepPerformed ```solidity -function revokeOwnerChangeConfirmation(uint256 changeId) public +event UpkeepPerformed(enum ICasimirUpkeep.ReportStatus status) ``` -### submitTransaction +### checkUpkeep ```solidity -function submitTransaction(address to, uint256 value, bytes data) public +function checkUpkeep(bytes checkData) external returns (bool upkeepNeeded, bytes performData) ``` -### confirmTransaction +method that is simulated by the keepers to see if any work actually +needs to be performed. This method does does not actually need to be +executable, and since it is only ever simulated it can consume lots of gas. -```solidity -function confirmTransaction(uint256 transactionIndex) public -``` +_To ensure that it is never called, you may want to add the +cannotExecute modifier from KeeperBase to your implementation of this +method._ -### executeTransaction +#### Parameters -```solidity -function executeTransaction(uint256 transactionIndex) public -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| checkData | bytes | specified in the upkeep registration so it is always the same for a registered upkeep. This can easily be broken down into specific arguments using `abi.decode`, so multiple upkeeps can be registered on the same contract and easily differentiated by the contract. | -### revokeTransactionConfirmation +#### Return Values -```solidity -function revokeTransactionConfirmation(uint256 transactionIndex) public -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| upkeepNeeded | bool | boolean to indicate whether the keeper should call performUpkeep or not. | +| performData | bytes | bytes that the keeper should call performUpkeep with, if upkeep is needed. If you would like to encode data to decode later, try `abi.encode`. | -### adjustConfirmationsRequired +### performUpkeep ```solidity -function adjustConfirmationsRequired() internal +function performUpkeep(bytes performData) external ``` -### getOwners +method that is actually executed by the keepers, via the registry. +The data returned by the checkUpkeep simulation will be passed into +this method to actually be executed. -```solidity -function getOwners() public view returns (address[]) -``` +_The input to this method should not be trusted, and the caller of the +method should not even be restricted to any single registry. Anyone should +be able call it, and the input should be validated, there is no guarantee +that the data passed in is the performData returned from checkUpkeep. This +could happen due to malicious keepers, racing keepers, or simply a state +change while the performUpkeep transaction is waiting for confirmation. +Always validate the data passed in._ -### getOwnerChangeCount +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| performData | bytes | is the data which was passed back from the checkData simulation. If it is encoded, it can easily be decoded into other types by calling `abi.decode`. This data should not be trusted, and should be validated against the contract's current state. | + +### setOracleAddress ```solidity -function getOwnerChangeCount() public view returns (uint256) +function setOracleAddress(address oracleAddress) external ``` -### getOwnerChange +### mockFulfillRequest ```solidity -function getOwnerChange(uint256 changeId) public view returns (address owner, bool add, bool executed, uint256 confirmations) +function mockFulfillRequest(bytes32 requestId, bytes result, bytes err) external ``` -### getTransactionCount +## ICasimirViews + +### getCompoundablePoolIds ```solidity -function getTransactionCount() public view returns (uint256) +function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5]) ``` -### getTransaction +### getSweptBalance ```solidity -function getTransaction(uint256 transactionIndex) public view returns (address to, uint256 value, bytes data, bool executed, uint256 confirmations) +function getSweptBalance(uint256 startIndex, uint256 endIndex) external view returns (uint256) ``` -## ICasimirMultisig +## Types32Array -### Deposit +### remove ```solidity -event Deposit(address sender, uint256 amount, uint256 balance) +function remove(uint32[] uint32Array, uint256 index) internal ``` -### SubmitOwnerChange +_Remove a uint32 element from the array_ -```solidity -event SubmitOwnerChange(address owner, uint256 changeId, bool add) -``` +#### Parameters -### ConfirmOwnerChange +| Name | Type | Description | +| ---- | ---- | ----------- | +| uint32Array | uint32[] | The array of uint32 | +| index | uint256 | | -```solidity -event ConfirmOwnerChange(address owner, uint256 changeId) -``` +## TypesBytesArray -### RevokeOwnerChangeConfirmation +### remove ```solidity -event RevokeOwnerChangeConfirmation(address owner, uint256 changeId) +function remove(bytes[] bytesArray, uint256 index) internal ``` -### ExecuteOwnerChange +_Remove a bytes element from the array_ -```solidity -event ExecuteOwnerChange(address owner, uint256 changeId) -``` +#### Parameters -### SubmitTransaction +| Name | Type | Description | +| ---- | ---- | ----------- | +| bytesArray | bytes[] | The array of bytes | +| index | uint256 | The index of the element to remove | -```solidity -event SubmitTransaction(address owner, uint256 txIndex, address to, uint256 value, bytes data) -``` +## TypesWithdrawalArray -### ConfirmTransaction +### remove ```solidity -event ConfirmTransaction(address owner, uint256 txIndex) +function remove(struct ICasimirManager.Withdrawal[] withdrawals, uint256 index) internal ``` -### RevokeTransactionConfirmation +_Remove a withdrawal from the array_ -```solidity -event RevokeTransactionConfirmation(address owner, uint256 txIndex) -``` +#### Parameters -### ExecuteTransaction +| Name | Type | Description | +| ---- | ---- | ----------- | +| withdrawals | struct ICasimirManager.Withdrawal[] | The array of withdrawals | +| index | uint256 | The index of the withdrawal to remove | -```solidity -event ExecuteTransaction(address owner, uint256 txIndex) -``` +## TypesAddress -### OwnerChange +### send ```solidity -struct OwnerChange { - address owner; - bool add; - bool executed; - uint256 confirmations; -} +function send(address user, uint256 amount) internal ``` -### Transaction +_Send ETH to a user_ -```solidity -struct Transaction { - address to; - uint256 value; - bytes data; - bool executed; - uint256 confirmations; -} -``` +#### Parameters -### receive +| Name | Type | Description | +| ---- | ---- | ----------- | +| user | address | The user address | +| amount | uint256 | The amount of stake to send | -```solidity -receive() external payable -``` +## IDepositContract -### submitOwnerChange +### DepositEvent ```solidity -function submitOwnerChange(address owner, bool add) external +event DepositEvent(bytes pubkey, bytes withdrawal_credentials, bytes amount, bytes signature, bytes index) ``` -### confirmOwnerChange +A processed deposit event. + +### deposit ```solidity -function confirmOwnerChange(uint256 changeId) external +function deposit(bytes pubkey, bytes withdrawal_credentials, bytes signature, bytes32 deposit_data_root) external payable ``` -### executeOwnerChange +Submit a Phase 0 DepositData object. -```solidity -function executeOwnerChange(uint256 changeId) external -``` +#### Parameters -### revokeOwnerChangeConfirmation +| Name | Type | Description | +| ---- | ---- | ----------- | +| pubkey | bytes | A BLS12-381 public key. | +| withdrawal_credentials | bytes | Commitment to a public key for withdrawals. | +| signature | bytes | A BLS12-381 signature. | +| deposit_data_root | bytes32 | The SHA-256 hash of the SSZ-encoded DepositData object. Used as a protection against malformed input. | + +### get_deposit_root ```solidity -function revokeOwnerChangeConfirmation(uint256 changeId) external +function get_deposit_root() external view returns (bytes32) ``` -### submitTransaction +Query the current deposit root hash. -```solidity -function submitTransaction(address to, uint256 value, bytes data) external -``` +#### Return Values -### confirmTransaction +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes32 | The deposit root hash. | + +### get_deposit_count ```solidity -function confirmTransaction(uint256 transactionIndex) external +function get_deposit_count() external view returns (bytes) ``` -### executeTransaction +Query the current deposit count. -```solidity -function executeTransaction(uint256 transactionIndex) external -``` +#### Return Values -### revokeTransactionConfirmation +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes | The deposit count encoded as a little endian 64-bit number. | -```solidity -function revokeTransactionConfirmation(uint256 transactionIndex) external -``` +## IWETH9 -### getOwners +### deposit ```solidity -function getOwners() external view returns (address[]) +function deposit() external payable ``` -### getOwnerChangeCount +Deposit ether to get wrapped ether + +### withdraw ```solidity -function getOwnerChangeCount() external view returns (uint256) +function withdraw(uint256) external ``` -### getOwnerChange +Withdraw wrapped ether to get ether -```solidity -function getOwnerChange(uint256 changeId) external view returns (address owner, bool add, bool executed, uint256 confirmations) -``` +## KeeperRegistrarInterface -### getTransactionCount +### RegistrationParams ```solidity -function getTransactionCount() external view returns (uint256) +struct RegistrationParams { + string name; + bytes encryptedEmail; + address upkeepContract; + uint32 gasLimit; + address adminAddress; + bytes checkData; + bytes offchainConfig; + uint96 amount; +} ``` -### getTransaction +### registerUpkeep ```solidity -function getTransaction(uint256 transactionIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 confirmations) +function registerUpkeep(struct KeeperRegistrarInterface.RegistrationParams requestParams) external returns (uint256) ``` ## MockFunctionsOracle @@ -3050,10 +3050,10 @@ Get the manager active (consensus) deposits | ---- | ---- | ----------- | | activeDeposits | uint256 | The manager active (consensus) deposits | -### getLatestActiveBalance +### latestActiveBalance ```solidity -function getLatestActiveBalance() public view returns (uint256) +function latestActiveBalance() public view returns (uint256) ``` Get the latest manager active (consensus) balance @@ -3064,10 +3064,10 @@ Get the latest manager active (consensus) balance | ---- | ---- | ----------- | | [0] | uint256 | activeBalance The latest manager active (consensus) balance | -### getLatestActiveBalanceAfterFees +### latestActiveBalanceAfterFees ```solidity -function getLatestActiveBalanceAfterFees() public view returns (uint256) +function latestActiveBalanceAfterFees() public view returns (uint256) ``` Get the manager latest active (consensus) balance after fees @@ -3078,10 +3078,10 @@ Get the manager latest active (consensus) balance after fees | ---- | ---- | ----------- | | [0] | uint256 | activeBalanceAfterFees The manager latest active (consensus) balance after fees | -### getPendingWithdrawals +### requestedWithdrawals ```solidity -function getPendingWithdrawals() public view returns (uint256) +function requestedWithdrawals() public view returns (uint256) ``` Get the total pending withdrawals @@ -3106,10 +3106,10 @@ Get the pending withdrawal queue | ---- | ---- | ----------- | | [0] | struct ICasimirManager.Withdrawal[] | pendingWithdrawalQueue The pending withdrawal queue | -### getFeePercent +### feePercent ```solidity -function getFeePercent() public view returns (uint32) +function feePercent() public view returns (uint32) ``` Get the total fee percentage @@ -3856,10 +3856,10 @@ function setFeePercents(uint32 ethFeePercent, uint32 linkFeePercent, uint32 ssvF function setFunctionsAddress(address functionsAddress) external ``` -### getFeePercent +### feePercent ```solidity -function getFeePercent() external view returns (uint32) +function feePercent() external view returns (uint32) ``` ### getETHFeePercent @@ -3928,16 +3928,16 @@ function getBufferedBalance() external view returns (uint256) function getActiveDeposits() external view returns (uint256) ``` -### getLatestActiveBalance +### latestActiveBalance ```solidity -function getLatestActiveBalance() external view returns (uint256) +function latestActiveBalance() external view returns (uint256) ``` -### getLatestActiveBalanceAfterFees +### latestActiveBalanceAfterFees ```solidity -function getLatestActiveBalanceAfterFees() external view returns (uint256) +function latestActiveBalanceAfterFees() external view returns (uint256) ``` ### getExitedBalance @@ -3964,10 +3964,10 @@ function getSweptBalance() external view returns (uint256) function getUserStake(address userAddress) external view returns (uint256) ``` -### getPendingWithdrawals +### requestedWithdrawals ```solidity -function getPendingWithdrawals() external view returns (uint256) +function requestedWithdrawals() external view returns (uint256) ``` ### getPendingWithdrawalQueue diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index cb0e68979..21d35f8dd 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -67,7 +67,7 @@ void async function () { /** Stake 320 from the fourth user */ setTimeout(async () => { - const depositAmount = 320 * ((100 + await manager.getFeePercent()) / 100) + const depositAmount = 320 * ((100 + await manager.feePercent()) / 100) const stake = await manager.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await stake?.wait() }, 1000) @@ -92,7 +92,7 @@ void async function () { let nextActiveBalance = round( parseFloat( ethers.utils.formatEther( - (await manager.getLatestActiveBalance()).add((await manager.getPendingPoolIds()).length * 32) + (await manager.latestActiveBalance()).add((await manager.getPendingPoolIds()).length * 32) ) ) + rewardAmount ) @@ -127,7 +127,7 @@ void async function () { nextActiveBalance = round( parseFloat( ethers.utils.formatEther( - (await manager.getLatestActiveBalance()).add((await manager.getPendingPoolIds()).length * 32) + (await manager.latestActiveBalance()).add((await manager.getPendingPoolIds()).length * 32) ) ) - rewardAmount ) diff --git a/contracts/ethereum/src/v1/CasimirManager.sol b/contracts/ethereum/src/v1/CasimirManager.sol index d63e7bcb2..2987b8c8a 100644 --- a/contracts/ethereum/src/v1/CasimirManager.sol +++ b/contracts/ethereum/src/v1/CasimirManager.sol @@ -89,38 +89,40 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Uniswap router contract */ ISwapRouter private immutable swapRouter; - /********************/ - /* Dynamic State */ - /********************/ + /*********/ + /* State */ + /*********/ - /** Upkeep ID */ - uint256 private upkeepId; - /** Current report period */ - uint32 private reportPeriod; + /** Total fee percentage */ + uint32 public feePercent = 5; /** Last pool ID created */ uint32 private lastPoolId; + /** Current report period */ + uint32 public reportPeriod; + /** Upkeep ID */ + uint256 public upkeepId; /** Latest active balance */ - uint256 private latestActiveBalance; + uint256 public latestActiveBalance; /** Latest active balance after fees */ - uint256 private latestActiveBalanceAfterFees; + uint256 public latestActiveBalanceAfterFees; /** Latest active rewards */ int256 private latestActiveRewardBalance; + /** Exited pool count */ + uint256 public finalizableCompletedExits; /** Exited balance */ uint256 private finalizableExitedBalance; - /** Exited pool count */ - uint256 finalizableCompletedExits; /** Token addresses */ mapping(Token => address) private tokenAddresses; /** All users */ mapping(address => User) private users; /** Sum of scaled rewards to balance ratios (intial value required) */ uint256 private stakeRatioSum = 1000 ether; + /** Total pending withdrawals count */ + uint256 public requestedWithdrawals; + /** Total pending withdrawal amount */ + uint256 public requestedWithdrawalBalance; /** Pending withdrawals */ Withdrawal[] private requestedWithdrawalQueue; - /** Total pending withdrawal amount */ - uint256 private requestedWithdrawalBalance; - /** Total pending withdrawals count */ - uint256 private requestedWithdrawals; /** All pool addresses */ mapping(uint32 => address) private poolAddresses; /** Validator tip balance */ @@ -128,10 +130,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Pool recovered balances */ mapping(uint32 => uint256) private recoveredBalances; /** Total deposits not yet in pools */ - uint256 private prepoolBalance; + uint256 public prepoolBalance; /** Total exited deposits */ uint256 private exitedBalance; - /** Total reserved (execution) fees */ + /** Total reserved fees */ uint256 private reservedFeeBalance; /** IDs of pools ready for initiation */ uint32[] private readyPoolIds; @@ -141,12 +143,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint32[] private stakedPoolIds; /** Active pool count */ uint256 private totalDeposits; + /** Exiting pool count */ + uint256 public requestedExits; /** Slashed pool count */ uint256 private forcedExits; - /** Exiting pool count */ - uint256 private requestedExits; - /** Total fee percentage */ - uint32 private feePercent = 5; /*************/ /* Modifiers */ @@ -1143,38 +1143,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { expectedEffectiveBalance = stakedPoolIds.length * poolCapacity; } - /** - * @notice Get the latest active balance - * @return latestActiveBalance The latest active balance - */ - function getLatestActiveBalance() public view returns (uint256) { - return latestActiveBalance; - } - - /** - * @notice Get the latest active balance after fees - * @return latestActiveBalanceAfterFees The latest active balance after fees - */ - function getLatestActiveBalanceAfterFees() public view returns (uint256) { - return latestActiveBalanceAfterFees; - } - - /** - * @notice Get the finalizable completed exit count of the current reporting period - * @return finalizableCompletedExits The finalizable completed exit count of the current reporting period - */ - function getFinalizableCompletedExits() public view returns (uint256) { - return finalizableCompletedExits; - } - - /** - * @notice Get the report period - * @return reportPeriod The report period - */ - function getReportPeriod() public view returns (uint256) { - return reportPeriod; - } - /** * @notice Get the eligibility of a pending withdrawal * @param index The index of the pending withdrawal @@ -1191,38 +1159,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { return false; } - /** - * @notice Get the total pending user withdrawal amount - * @return requestedWithdrawalBalance The total pending user withdrawal amount - */ - function getPendingWithdrawalBalance() public view returns (uint256) { - return requestedWithdrawalBalance; - } - - /** - * @notice Get the total pending withdrawal count - * @return requestedWithdrawals The total pending withdrawal count - */ - function getPendingWithdrawals() public view returns (uint256) { - return requestedWithdrawals; - } - - /** - * @notice Get the total fee percentage - * @return feePercent The total fee percentage - */ - function getFeePercent() public view returns (uint32) { - return feePercent; - } - - /** - * @notice Get the count of pools requested to exit - * @return requestedExits The count of pools requested to exit - */ - function getRequestedExits() external view returns (uint256) { - return requestedExits; - } - /** * @notice Get the ready pool IDs * @return readyPoolIds The ready pool IDs @@ -1247,14 +1183,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { return stakedPoolIds; } - /** - * @notice Get the pre-pool balance - * @return prepoolBalance The pre-pool balance - */ - function getPrepoolBalance() external view returns (uint256) { - return prepoolBalance; - } - /** * @notice Get a pool's address by ID * @param poolId The pool ID @@ -1297,14 +1225,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { registryAddress = address(registry); } - /** - * @notice Get the upkeep ID - * @return upkeepId The upkeep ID - */ - function getUpkeepId() external view returns (uint256) { - return upkeepId; - } - /** * @notice Get the upkeep address * @return upkeepAddress The upkeep address diff --git a/contracts/ethereum/src/v1/CasimirUpkeep.sol b/contracts/ethereum/src/v1/CasimirUpkeep.sol index 3b7a574cc..25148edb0 100644 --- a/contracts/ethereum/src/v1/CasimirUpkeep.sol +++ b/contracts/ethereum/src/v1/CasimirUpkeep.sol @@ -43,7 +43,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /** Current report status */ ReportStatus private reportStatus; /** Current report period */ - uint256 reportPeriod; + uint32 reportPeriod; /** Current report remaining request count */ uint256 reportRemainingRequests; /** Current report block */ @@ -150,7 +150,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { bool heartbeatLapsed = (block.timestamp - reportTimestamp) >= reportHeartbeat; upkeepNeeded = checkActive && heartbeatLapsed; } else if (reportStatus == ReportStatus.PROCESSING) { - bool finalizeReport = reportCompletedExits == manager.getFinalizableCompletedExits(); + bool finalizeReport = reportCompletedExits == manager.finalizableCompletedExits(); upkeepNeeded = finalizeReport; } } @@ -167,7 +167,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { reportRequestBlock = block.number; reportTimestamp = block.timestamp; - reportPeriod = manager.getReportPeriod(); + reportPeriod = manager.reportPeriod(); Functions.Request memory req; reportRemainingRequests = 2; @@ -177,9 +177,9 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { } } else { if ( - manager.getPendingWithdrawalBalance() > 0 && + manager.requestedWithdrawalBalance() > 0 && manager.getPendingWithdrawalEligibility(0, reportPeriod) && - manager.getPendingWithdrawalBalance() <= manager.getWithdrawableBalance() + manager.requestedWithdrawalBalance() <= manager.getWithdrawableBalance() ) { manager.fulfillWithdrawals(5); } diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol index 1f64c1a41..e95a1a5a4 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol @@ -9,7 +9,6 @@ interface ICasimirManager { /* Enumerators */ /***************/ - /** Token abbreviation */ enum Token { LINK, SSV, @@ -64,7 +63,7 @@ interface ICasimirManager { event WithdrawalFulfilled(address sender, uint256 amount); /*************/ - /* Functions */ + /* Mutations */ /*************/ function depositStake() external payable; @@ -127,28 +126,38 @@ interface ICasimirManager { function withdrawLINKBalance(uint256 amount) external; function withdrawSSVBalance(uint256 amount) external; function setFunctionsAddress(address functionsAddress) external; - function getFeePercent() external view returns (uint32); - function getRequestedExits() external view returns (uint256); + + /*************/ + /* Variables */ + /*************/ + + function upkeepId() external view returns (uint256); + function latestActiveBalance() external view returns (uint256); + function latestActiveBalanceAfterFees() external view returns (uint256); + function feePercent() external view returns (uint32); + function requestedExits() external view returns (uint256); + function requestedWithdrawals() external view returns (uint256); + function requestedWithdrawalBalance() external view returns (uint256); + function finalizableCompletedExits() external view returns (uint256); + function reportPeriod() external view returns (uint32); + function prepoolBalance() external view returns (uint256); + + /***********/ + /* Getters */ + /***********/ + + function getTotalStake() external view returns (uint256); function getReadyPoolIds() external view returns (uint32[] memory); function getPendingPoolIds() external view returns (uint32[] memory); function getStakedPoolIds() external view returns (uint32[] memory); - function getTotalStake() external view returns (uint256); function getBufferedBalance() external view returns (uint256); function getExpectedEffectiveBalance() external view returns (uint256); - function getFinalizableCompletedExits() external view returns (uint256); - function getLatestActiveBalance() external view returns (uint256); - function getLatestActiveBalanceAfterFees() external view returns (uint256); - function getReportPeriod() external view returns (uint256); function getPendingWithdrawalEligibility(uint256 index, uint256 period) external view returns (bool); function getWithdrawableBalance() external view returns (uint256); - function getPrepoolBalance() external view returns (uint256); function getUserStake(address userAddress) external view returns (uint256); - function getPendingWithdrawalBalance() external view returns (uint256); - function getPendingWithdrawals() external view returns (uint256); function getPoolAddress(uint32 poolId) external view returns (address); function getPoolDetails(uint32 poolId) external view returns (PoolDetails memory); function getRegistryAddress() external view returns (address); - function getUpkeepId() external view returns (uint256); function getUpkeepAddress() external view returns (address); function getUpkeepBalance() external view returns (uint256 upkeepBalance); } diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index b7b07b41d..9bc22fb47 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -74,7 +74,7 @@ export async function firstUserDepositFixture() { const { manager, upkeep, owner, keeper, oracle } = await loadFixture(deploymentFixture) const [, firstUser] = await ethers.getSigners() - const depositAmount = round(16 * ((100 + await manager.getFeePercent()) / 100), 10) + const depositAmount = round(16 * ((100 + await manager.feePercent()) / 100), 10) const deposit = await manager.connect(firstUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await deposit.wait() @@ -86,7 +86,7 @@ export async function secondUserDepositFixture() { const { manager, upkeep, owner, firstUser, keeper, oracle } = await loadFixture(firstUserDepositFixture) const [, , secondUser] = await ethers.getSigners() - const depositAmount = round(24 * ((100 + await manager.getFeePercent()) / 100), 10) + const depositAmount = round(24 * ((100 + await manager.feePercent()) / 100), 10) const deposit = await manager.connect(secondUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await deposit.wait() @@ -194,7 +194,7 @@ export async function thirdUserDepositFixture() { const { manager, upkeep, owner, firstUser, secondUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(sweepPostSecondUserDepositFixture) const [, , , thirdUser] = await ethers.getSigners() - const depositAmount = round(24 * ((100 + await manager.getFeePercent()) / 100), 10) + const depositAmount = round(24 * ((100 + await manager.feePercent()) / 100), 10) const deposit = await manager.connect(thirdUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await deposit.wait() @@ -300,7 +300,7 @@ export async function sweepPostThirdUserDepositFixture() { /** Fixture to partial withdraw 0.3 to the first user */ export async function firstUserPartialWithdrawalFixture() { const { manager, upkeep, firstUser, secondUser, thirdUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(sweepPostThirdUserDepositFixture) - const prepoolBalance = await manager.getPrepoolBalance() + const prepoolBalance = await manager.prepoolBalance() const withdraw = await manager.connect(firstUser).requestWithdrawal(prepoolBalance) await withdraw.wait() @@ -334,7 +334,7 @@ export async function fourthUserDepositFixture() { const { manager, upkeep, firstUser, secondUser, thirdUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(firstUserPartialWithdrawalFixture) const [, , , , fourthUser] = await ethers.getSigners() - const depositAmount = round(72 * ((100 + await manager.getFeePercent()) / 100), 10) + const depositAmount = round(72 * ((100 + await manager.feePercent()) / 100), 10) const deposit = await manager.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await deposit.wait() diff --git a/contracts/ethereum/test/integration.ts b/contracts/ethereum/test/integration.ts index 561dc6353..0997bd280 100644 --- a/contracts/ethereum/test/integration.ts +++ b/contracts/ethereum/test/integration.ts @@ -135,13 +135,13 @@ describe('Casimir manager', async function () { it('A loss is reported and brings the active stake below expected', async function () { const { manager } = await loadFixture(activeBalanceLossFixture) - const activeBalance = await manager.getLatestActiveBalance() + const activeBalance = await manager.latestActiveBalance() expect(ethers.utils.formatEther(activeBalance)).equal('126.0') }) it('Gains are reported and bring the active stake back to expected', async function () { const { manager } = await loadFixture(activeBalanceRecoveryFixture) - const activeBalance = await manager.getLatestActiveBalance() + const activeBalance = await manager.latestActiveBalance() expect(ethers.utils.formatEther(activeBalance)).equal('128.0') }) @@ -175,7 +175,7 @@ describe('Casimir manager', async function () { console.log('👤 Second user stake', ethers.utils.formatEther(secondStake)) console.log('👤 Third user stake', ethers.utils.formatEther(thirdStake)) console.log('👤 Fourth user stake', ethers.utils.formatEther(fourthStake)) - const openDeposits = await manager.getPrepoolBalance() + const openDeposits = await manager.prepoolBalance() console.log('📦 Open deposits', ethers.utils.formatEther(openDeposits)) const dust = stake.sub(firstStake.add(secondStake).add(thirdStake).add(fourthStake)) if (dust !== ethers.utils.parseEther('0.0')) { From 85b0c1fe4add3227c294b6f2f701296bf32032e8 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Wed, 7 Jun 2023 00:46:29 -0400 Subject: [PATCH 59/78] Add users test --- contracts/ethereum/docs/index.md | 2336 ++++++++--------- contracts/ethereum/src/v1/CasimirManager.sol | 15 +- contracts/ethereum/src/v1/CasimirUpkeep.sol | 10 +- .../src/v1/interfaces/ICasimirManager.sol | 1 + contracts/ethereum/test/fixtures/shared.ts | 17 +- contracts/ethereum/test/integration.ts | 2 +- contracts/ethereum/test/users.ts | 135 + 7 files changed, 1287 insertions(+), 1229 deletions(-) create mode 100644 contracts/ethereum/test/users.ts diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 41e1d4bdf..54cfbcf1c 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -1,601 +1,328 @@ # Solidity API -## CasimirMultisig +## CasimirManager -### owners +### upkeepRegistrationMinimum ```solidity -address[] owners +uint256 upkeepRegistrationMinimum ``` -### isOwner +Minimum balance for upkeep registration (0.1 LINK) + +### feePercent ```solidity -mapping(address => bool) isOwner +uint32 feePercent ``` -### confirmationsRequired +Total fee percentage + +### reportPeriod ```solidity -uint256 confirmationsRequired +uint32 reportPeriod ``` -### isOwnerChangeConfirmed +Current report period + +### upkeepId ```solidity -mapping(uint256 => mapping(address => bool)) isOwnerChangeConfirmed +uint256 upkeepId ``` -### isTransactionConfirmed +Upkeep ID + +### latestActiveBalance ```solidity -mapping(uint256 => mapping(address => bool)) isTransactionConfirmed +uint256 latestActiveBalance ``` -### ownerChanges +Latest active balance + +### latestActiveBalanceAfterFees ```solidity -struct ICasimirMultisig.OwnerChange[] ownerChanges +uint256 latestActiveBalanceAfterFees ``` -### transactions +Latest active balance after fees + +### finalizableCompletedExits ```solidity -struct ICasimirMultisig.Transaction[] transactions +uint256 finalizableCompletedExits ``` -### onlyOwner +Exited pool count + +### requestedWithdrawals ```solidity -modifier onlyOwner() +uint256 requestedWithdrawals ``` -### ownerChangeExists +Total pending withdrawals count + +### requestedWithdrawalBalance ```solidity -modifier ownerChangeExists(uint256 changeId) +uint256 requestedWithdrawalBalance ``` -### ownerChangeNotExecuted +Total pending withdrawal amount + +### prepoolBalance ```solidity -modifier ownerChangeNotExecuted(uint256 changeId) +uint256 prepoolBalance ``` -### ownerChangeNotConfirmed +Total deposits not yet in pools + +### requestedExits ```solidity -modifier ownerChangeNotConfirmed(uint256 changeId) +uint256 requestedExits ``` -### transactionExists +Exiting pool count + +### onlyPool ```solidity -modifier transactionExists(uint256 transactionIndex) +modifier onlyPool(uint32 poolId) ``` -### transactionNotExecuted +_Validate the caller is the authorized pool_ + +### onlyOracle ```solidity -modifier transactionNotExecuted(uint256 transactionIndex) +modifier onlyOracle() ``` -### transactionNotConfirmed +_Validate the caller is the manager oracle_ + +### onlyOracleOrRegistry ```solidity -modifier transactionNotConfirmed(uint256 transactionIndex) +modifier onlyOracleOrRegistry() ``` -### constructor +_Validate the caller is the oracle or registry_ + +### onlyOracleOrUpkeep ```solidity -constructor(address[] _owners) public +modifier onlyOracleOrUpkeep() ``` -### receive +_Validate the caller is the oracle or upkeep_ + +### onlyRegistry ```solidity -receive() external payable +modifier onlyRegistry() ``` -### submitOwnerChange +_Validate the caller is the registry_ + +### onlyUpkeep ```solidity -function submitOwnerChange(address owner, bool add) public +modifier onlyUpkeep() ``` -### confirmOwnerChange +_Validate the caller is the upkeep contract_ + +### validDeposit ```solidity -function confirmOwnerChange(uint256 changeId) public +modifier validDeposit() ``` -### executeOwnerChange +_Validate a deposit_ + +### validWithdrawal ```solidity -function executeOwnerChange(uint256 changeId) public +modifier validWithdrawal(uint256 amount) ``` -### revokeOwnerChangeConfirmation +_Validate a withdrawal_ + +### validDistribution ```solidity -function revokeOwnerChangeConfirmation(uint256 changeId) public +modifier validDistribution(uint256 amount) ``` -### submitTransaction +_Validate a distribution_ -```solidity -function submitTransaction(address to, uint256 value, bytes data) public returns (uint256 transactionIndex) -``` +#### Parameters -### confirmTransaction +| Name | Type | Description | +| ---- | ---- | ----------- | +| amount | uint256 | The amount to validate | + +### constructor ```solidity -function confirmTransaction(uint256 transactionIndex) public +constructor(address _oracleAddress, address beaconDepositAddress, address linkFunctionsAddress, address linkRegistrarAddress, address linkRegistryAddress, address linkTokenAddress, address ssvNetworkAddress, address ssvNetworkViewsAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public ``` -### executeTransaction +Constructor -```solidity -function executeTransaction(uint256 transactionIndex) public -``` +#### Parameters -### revokeTransactionConfirmation +| Name | Type | Description | +| ---- | ---- | ----------- | +| _oracleAddress | address | The manager oracle address | +| beaconDepositAddress | address | The Beacon deposit address | +| linkFunctionsAddress | address | The Chainlink functions oracle address | +| linkRegistrarAddress | address | The Chainlink keeper registrar address | +| linkRegistryAddress | address | The Chainlink keeper registry address | +| linkTokenAddress | address | The Chainlink token address | +| ssvNetworkAddress | address | The SSV network address | +| ssvNetworkViewsAddress | address | The SSV network views address | +| ssvTokenAddress | address | The SSV token address | +| swapFactoryAddress | address | The Uniswap factory address | +| swapRouterAddress | address | The Uniswap router address | +| wethTokenAddress | address | The WETH contract address | + +### receive ```solidity -function revokeTransactionConfirmation(uint256 transactionIndex) public +receive() external payable ``` -### adjustConfirmationsRequired +Receive and deposit validator tips + +### depositStake ```solidity -function adjustConfirmationsRequired() internal +function depositStake() external payable ``` -### getOwners +Deposit user stake + +### depositRewards ```solidity -function getOwners() public view returns (address[]) +function depositRewards() external payable ``` -### getOwnerChangeCount +Deposit a given amount of rewards + +### depositExitedBalance ```solidity -function getOwnerChangeCount() public view returns (uint256) +function depositExitedBalance(uint32 poolId) external payable ``` -### getOwnerChange +Deposit exited balance from a given pool ID -```solidity -function getOwnerChange(uint256 changeId) public view returns (address owner, bool add, bool executed, uint256 confirmations) -``` +#### Parameters -### getTransactionCount +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolId | uint32 | The pool ID | + +### depositRecoveredBalance ```solidity -function getTransactionCount() public view returns (uint256) +function depositRecoveredBalance(uint32 poolId) external payable ``` -### getTransaction +Deposit recovered balance for a given pool from an operator -```solidity -function getTransaction(uint256 transactionIndex) public view returns (address to, uint256 value, bytes data, bool executed, uint256 confirmations) -``` +#### Parameters -## ICasimirMultisig +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolId | uint32 | The pool ID | -### Deposit +### depositClusterBalance ```solidity -event Deposit(address sender, uint256 amount, uint256 balance) +function depositClusterBalance(uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external ``` -### SubmitOwnerChange +Deposit to a cluster balance -```solidity -event SubmitOwnerChange(address owner, uint256 changeId, bool add) -``` +#### Parameters -### ConfirmOwnerChange +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorIds | uint64[] | The operator IDs | +| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | +| feeAmount | uint256 | The fee amount to deposit | +| processed | bool | Whether the fee amount is already processed | + +### depositUpkeepBalance ```solidity -event ConfirmOwnerChange(address owner, uint256 changeId) +function depositUpkeepBalance(uint256 feeAmount, bool processed) external ``` -### RevokeOwnerChangeConfirmation +Deposit to the upkeep balance -```solidity -event RevokeOwnerChangeConfirmation(address owner, uint256 changeId) -``` +#### Parameters -### ExecuteOwnerChange +| Name | Type | Description | +| ---- | ---- | ----------- | +| feeAmount | uint256 | The fee amount to deposit | +| processed | bool | Whether the fee amount is already processed | + +### depositReservedFees ```solidity -event ExecuteOwnerChange(address owner, uint256 changeId) +function depositReservedFees() external payable ``` -### SubmitTransaction +Deposit reserved fees + +### withdrawReservedFees ```solidity -event SubmitTransaction(address owner, uint256 txIndex, address to, uint256 value, bytes data) +function withdrawReservedFees(uint256 amount) external ``` -### ConfirmTransaction +Withdraw a given amount of reserved fees -```solidity -event ConfirmTransaction(address owner, uint256 txIndex) -``` +#### Parameters -### RevokeTransactionConfirmation +| Name | Type | Description | +| ---- | ---- | ----------- | +| amount | uint256 | The amount of fees to withdraw | + +### rebalanceStake ```solidity -event RevokeTransactionConfirmation(address owner, uint256 txIndex) +function rebalanceStake(uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, uint256 completedExits) external ``` -### ExecuteTransaction +Rebalance the rewards to stake ratio and redistribute swept rewards + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| activeBalance | uint256 | The active balance | +| sweptBalance | uint256 | The swept balance | +| activatedDeposits | uint256 | The count of activated deposits | +| completedExits | uint256 | The count of withdrawn exits | + +### compoundRewards ```solidity -event ExecuteTransaction(address owner, uint256 txIndex) +function compoundRewards(uint32[5] poolIds) external ``` -### OwnerChange - -```solidity -struct OwnerChange { - address owner; - bool add; - bool executed; - uint256 confirmations; -} -``` - -### Transaction - -```solidity -struct Transaction { - address to; - uint256 value; - bytes data; - bool executed; - uint256 confirmations; -} -``` - -### receive - -```solidity -receive() external payable -``` - -### submitOwnerChange - -```solidity -function submitOwnerChange(address owner, bool add) external -``` - -### confirmOwnerChange - -```solidity -function confirmOwnerChange(uint256 changeId) external -``` - -### executeOwnerChange - -```solidity -function executeOwnerChange(uint256 changeId) external -``` - -### revokeOwnerChangeConfirmation - -```solidity -function revokeOwnerChangeConfirmation(uint256 changeId) external -``` - -### submitTransaction - -```solidity -function submitTransaction(address to, uint256 value, bytes data) external returns (uint256 transactionIndex) -``` - -### confirmTransaction - -```solidity -function confirmTransaction(uint256 transactionIndex) external -``` - -### executeTransaction - -```solidity -function executeTransaction(uint256 transactionIndex) external -``` - -### revokeTransactionConfirmation - -```solidity -function revokeTransactionConfirmation(uint256 transactionIndex) external -``` - -### getOwners - -```solidity -function getOwners() external view returns (address[]) -``` - -### getOwnerChangeCount - -```solidity -function getOwnerChangeCount() external view returns (uint256) -``` - -### getOwnerChange - -```solidity -function getOwnerChange(uint256 changeId) external view returns (address owner, bool add, bool executed, uint256 confirmations) -``` - -### getTransactionCount - -```solidity -function getTransactionCount() external view returns (uint256) -``` - -### getTransaction - -```solidity -function getTransaction(uint256 transactionIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 confirmations) -``` - -## CasimirManager - -### upkeepRegistrationMinimum - -```solidity -uint256 upkeepRegistrationMinimum -``` - -Minimum balance for upkeep registration (0.1 LINK) - -### finalizableCompletedExits - -```solidity -uint256 finalizableCompletedExits -``` - -Exited pool count - -### onlyPool - -```solidity -modifier onlyPool(uint32 poolId) -``` - -_Validate the caller is the authorized pool_ - -### onlyOracle - -```solidity -modifier onlyOracle() -``` - -_Validate the caller is the manager oracle_ - -### onlyOracleOrRegistry - -```solidity -modifier onlyOracleOrRegistry() -``` - -_Validate the caller is the oracle or registry_ - -### onlyOracleOrUpkeep - -```solidity -modifier onlyOracleOrUpkeep() -``` - -_Validate the caller is the oracle or upkeep_ - -### onlyRegistry - -```solidity -modifier onlyRegistry() -``` - -_Validate the caller is the registry_ - -### onlyUpkeep - -```solidity -modifier onlyUpkeep() -``` - -_Validate the caller is the upkeep contract_ - -### validDeposit - -```solidity -modifier validDeposit() -``` - -_Validate a deposit_ - -### validWithdrawal - -```solidity -modifier validWithdrawal(uint256 amount) -``` - -_Validate a withdrawal_ - -### validDistribution - -```solidity -modifier validDistribution(uint256 amount) -``` - -_Validate a distribution_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| amount | uint256 | The amount to validate | - -### constructor - -```solidity -constructor(address _oracleAddress, address beaconDepositAddress, address linkFunctionsAddress, address linkRegistrarAddress, address linkRegistryAddress, address linkTokenAddress, address ssvNetworkAddress, address ssvNetworkViewsAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public -``` - -Constructor - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _oracleAddress | address | The manager oracle address | -| beaconDepositAddress | address | The Beacon deposit address | -| linkFunctionsAddress | address | The Chainlink functions oracle address | -| linkRegistrarAddress | address | The Chainlink keeper registrar address | -| linkRegistryAddress | address | The Chainlink keeper registry address | -| linkTokenAddress | address | The Chainlink token address | -| ssvNetworkAddress | address | The SSV network address | -| ssvNetworkViewsAddress | address | The SSV network views address | -| ssvTokenAddress | address | The SSV token address | -| swapFactoryAddress | address | The Uniswap factory address | -| swapRouterAddress | address | The Uniswap router address | -| wethTokenAddress | address | The WETH contract address | - -### receive - -```solidity -receive() external payable -``` - -Receive and deposit validator tips - -### depositStake - -```solidity -function depositStake() external payable -``` - -Deposit user stake - -### depositRewards - -```solidity -function depositRewards() external payable -``` - -Deposit a given amount of rewards - -### depositExitedBalance - -```solidity -function depositExitedBalance(uint32 poolId) external payable -``` - -Deposit exited balance from a given pool ID - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | - -### depositRecoveredBalance - -```solidity -function depositRecoveredBalance(uint32 poolId) external payable -``` - -Deposit recovered balance for a given pool from an operator - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | - -### depositClusterBalance - -```solidity -function depositClusterBalance(uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external -``` - -Deposit to a cluster balance - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorIds | uint64[] | The operator IDs | -| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | -| feeAmount | uint256 | The fee amount to deposit | -| processed | bool | Whether the fee amount is already processed | - -### depositUpkeepBalance - -```solidity -function depositUpkeepBalance(uint256 feeAmount, bool processed) external -``` - -Deposit to the upkeep balance - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| feeAmount | uint256 | The fee amount to deposit | -| processed | bool | Whether the fee amount is already processed | - -### depositReservedFees - -```solidity -function depositReservedFees() external payable -``` - -Deposit reserved fees - -### withdrawReservedFees - -```solidity -function withdrawReservedFees(uint256 amount) external -``` - -Withdraw a given amount of reserved fees - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| amount | uint256 | The amount of fees to withdraw | - -### rebalanceStake - -```solidity -function rebalanceStake(uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, uint256 completedExits) external -``` - -Rebalance the rewards to stake ratio and redistribute swept rewards - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| activeBalance | uint256 | The active balance | -| sweptBalance | uint256 | The swept balance | -| activatedDeposits | uint256 | The count of activated deposits | -| completedExits | uint256 | The count of withdrawn exits | - -### compoundRewards - -```solidity -function compoundRewards(uint32[5] poolIds) external -``` - -Compound rewards given a list of pool IDs +Compound rewards given a list of pool IDs #### Parameters @@ -832,10 +559,10 @@ Get the total user stake for a given user address | ---- | ---- | ----------- | | userStake | uint256 | The total user stake | -### totalStake +### getTotalStake ```solidity -function totalStake() public view returns (uint256 totalStake) +function getTotalStake() public view returns (uint256 totalStake) ``` Get the total stake @@ -916,62 +643,6 @@ Get the expected effective balance | ---- | ---- | ----------- | | expectedEffectiveBalance | uint256 | The expected effective balance | -### latestActiveBalance - -```solidity -function latestActiveBalance() public view returns (uint256) -``` - -Get the latest active balance - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | latestActiveBalance The latest active balance | - -### latestActiveBalanceAfterFees - -```solidity -function latestActiveBalanceAfterFees() public view returns (uint256) -``` - -Get the latest active balance after fees - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | latestActiveBalanceAfterFees The latest active balance after fees | - -### finalizableCompletedExits - -```solidity -function finalizableCompletedExits() public view returns (uint256) -``` - -Get the finalizable completed exit count of the current reporting period - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | finalizableCompletedExits The finalizable completed exit count of the current reporting period | - -### reportPeriod - -```solidity -function reportPeriod() public view returns (uint256) -``` - -Get the report period - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | reportPeriod The report period | - ### getPendingWithdrawalEligibility ```solidity @@ -993,62 +664,6 @@ Get the eligibility of a pending withdrawal | ---- | ---- | ----------- | | [0] | bool | pendingWithdrawalEligibility The eligibility of a pending withdrawal | -### requestedWithdrawalBalance - -```solidity -function requestedWithdrawalBalance() public view returns (uint256) -``` - -Get the total pending user withdrawal amount - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | requestedWithdrawalBalance The total pending user withdrawal amount | - -### requestedWithdrawals - -```solidity -function requestedWithdrawals() public view returns (uint256) -``` - -Get the total pending withdrawal count - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | requestedWithdrawals The total pending withdrawal count | - -### feePercent - -```solidity -function feePercent() public view returns (uint32) -``` - -Get the total fee percentage - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32 | feePercent The total fee percentage | - -### requestedExits - -```solidity -function requestedExits() external view returns (uint256) -``` - -Get the count of pools requested to exit - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | requestedExits The count of pools requested to exit | - ### getReadyPoolIds ```solidity @@ -1075,35 +690,21 @@ Get the pending pool IDs | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint32[] | pendingPoolIds The pending pool IDs | - -### getStakedPoolIds - -```solidity -function getStakedPoolIds() external view returns (uint32[]) -``` - -Get the staked pool IDs - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32[] | stakedPoolIds The staked pool IDs | +| [0] | uint32[] | pendingPoolIds The pending pool IDs | -### prepoolBalance +### getStakedPoolIds ```solidity -function prepoolBalance() external view returns (uint256) +function getStakedPoolIds() external view returns (uint32[]) ``` -Get the pre-pool balance +Get the staked pool IDs #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint256 | prepoolBalance The pre-pool balance | +| [0] | uint32[] | stakedPoolIds The staked pool IDs | ### getPoolAddress @@ -1159,20 +760,6 @@ Get the registry address | ---- | ---- | ----------- | | registryAddress | address | The registry address | -### getUpkeepId - -```solidity -function getUpkeepId() external view returns (uint256) -``` - -Get the upkeep ID - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | upkeepId The upkeep ID | - ### getUpkeepAddress ```solidity @@ -1291,1291 +878,1636 @@ _Validate the caller is owner or the authorized pool_ constructor(address ssvNetworkViewsAddress) public ``` -### registerOperator +### registerOperator + +```solidity +function registerOperator(uint64 operatorId) external payable +``` + +Register an operator with the set + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +### depositCollateral + +```solidity +function depositCollateral(uint64 operatorId) external payable +``` + +Deposit collateral for an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +### withdrawCollateral + +```solidity +function withdrawCollateral(uint64 operatorId, uint256 amount) external +``` + +Withdraw collateral for an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | +| amount | uint256 | The amount to withdraw | + +### addOperatorPool + +```solidity +function addOperatorPool(uint64 operatorId, uint32 poolId) external +``` + +Add a pool to an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | +| poolId | uint32 | The pool ID | + +### removeOperatorPool + +```solidity +function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external +``` + +Remove a pool from an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | +| poolId | uint32 | The pool ID | +| blameAmount | uint256 | The amount to recover from collateral | + +### requestDeregistration + +```solidity +function requestDeregistration(uint64 operatorId) external +``` + +Request deregistration for an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +### getOperatorCollateral + +```solidity +function getOperatorCollateral(uint64 operatorId) external view returns (int256 collateral) +``` + +Get the collateral of an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| collateral | int256 | The collateral | + +### getOperatorEligibility + +```solidity +function getOperatorEligibility(uint64 operatorId) external view returns (bool eligibility) +``` + +Get the eligibility of an operator + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| eligibility | bool | The eligibility | + +### getOperatorIds + +```solidity +function getOperatorIds() external view returns (uint64[]) +``` + +Get the operator IDs + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint64[] | operatorIds The operator IDs | + +## CasimirUpkeep + +### reportHeartbeat + +```solidity +uint256 reportHeartbeat +``` + +Oracle heartbeat + +### poolCapacity + +```solidity +uint256 poolCapacity +``` + +Pool capacity + +### reportPeriod + +```solidity +uint32 reportPeriod +``` + +Current report period + +### reportRemainingRequests + +```solidity +uint256 reportRemainingRequests +``` + +Current report remaining request count + +### reportRequestBlock + +```solidity +uint256 reportRequestBlock +``` + +Current report block + +### reportCompoundablePoolIds + +```solidity +uint32[5] reportCompoundablePoolIds +``` + +Current report compoundable pools + +### finalizableCompoundablePoolIds + +```solidity +uint32[5] finalizableCompoundablePoolIds +``` + +Finalizable compoundable pools + +### requestCBOR + +```solidity +bytes requestCBOR +``` + +Binary request source code + +### fulfillGasLimit + +```solidity +uint32 fulfillGasLimit +``` + +Fulfillment gas limit + +### constructor + +```solidity +constructor(address linkFunctionsAddress) public +``` + +Constructor + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| linkFunctionsAddress | address | The functions oracle contract address | + +### generateRequest + +```solidity +function generateRequest(string source, bytes secrets, string[] args) public pure returns (bytes) +``` + +Generate a new Functions.Request(off-chain, saving gas) + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| source | string | JavaScript source code | +| secrets | bytes | Encrypted secrets payload | +| args | string[] | List of arguments accessible from within the source code | + +### setRequest ```solidity -function registerOperator(uint64 operatorId) external payable +function setRequest(uint32 _fulfillGasLimit, uint64 _linkSubscriptionId, bytes _requestCBOR) external ``` -Register an operator with the set +Set the bytes representing the CBOR-encoded Functions.Request #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +| _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | +| _linkSubscriptionId | uint64 | The functions billing subscription ID used to pay for Functions requests | +| _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | -### depositCollateral +### checkUpkeep ```solidity -function depositCollateral(uint64 operatorId) external payable +function checkUpkeep(bytes) public view returns (bool upkeepNeeded, bytes) ``` -Deposit collateral for an operator +Check if the upkeep is needed -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +| upkeepNeeded | bool | True if the upkeep is needed | +| [1] | bytes | | -### withdrawCollateral +### performUpkeep ```solidity -function withdrawCollateral(uint64 operatorId, uint256 amount) external +function performUpkeep(bytes) external ``` -Withdraw collateral for an operator +Perform the upkeep + +### fulfillRequest + +```solidity +function fulfillRequest(bytes32 requestId, bytes response, bytes _error) internal +``` + +Callback that is invoked once the DON has resolved the request or hit an error #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | -| amount | uint256 | The amount to withdraw | +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| _error | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | -### addOperatorPool +### setOracleAddress ```solidity -function addOperatorPool(uint64 operatorId, uint32 poolId) external +function setOracleAddress(address newOracleAddress) external ``` -Add a pool to an operator +Update the functions oracle address #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | -| poolId | uint32 | The pool ID | +| newOracleAddress | address | New oracle address | -### removeOperatorPool +### encodeResponse ```solidity -function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external +function encodeResponse(uint128 activeBalance, uint32 activatedDeposits, uint32 completedExits, uint32 slashedExits) external pure returns (bytes) ``` -Remove a pool from an operator +Encode the response for testing #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | -| poolId | uint32 | The pool ID | -| blameAmount | uint256 | The amount to recover from collateral | +| activeBalance | uint128 | Active balance | +| activatedDeposits | uint32 | Count of new deposits | +| completedExits | uint32 | Count of new exits | +| slashedExits | uint32 | Count of new slashedExits | -### requestDeregistration +### mockFulfillRequest ```solidity -function requestDeregistration(uint64 operatorId) external +function mockFulfillRequest(bytes32 requestId, bytes response, bytes err) external ``` -Request deregistration for an operator +Fulfill the request for testing #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | -### getOperatorCollateral +## CasimirViews + +### constructor ```solidity -function getOperatorCollateral(uint64 operatorId) external view returns (int256 collateral) +constructor(address managerAddress, address registryAddress) public ``` -Get the collateral of an operator +### getCompoundablePoolIds + +```solidity +function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5] poolIds) +``` + +Get the next five compoundable pool IDs + +_Should be called off-chain_ #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| collateral | int256 | The collateral | +| poolIds | uint32[5] | The next five compoundable pool IDs | -### getOperatorEligibility +### getEligibleOperatorIds ```solidity -function getOperatorEligibility(uint64 operatorId) external view returns (bool eligibility) +function getEligibleOperatorIds(uint256 startIndex, uint256 endIndex) external view returns (uint64[] activeOperatorIds) ``` -Get the eligibility of an operator +Get the active operator IDs #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| eligibility | bool | The eligibility | +| activeOperatorIds | uint64[] | The active operator IDs | -### getOperatorIds +### getSweptBalance ```solidity -function getOperatorIds() external view returns (uint64[]) +function getSweptBalance(uint256 startIndex, uint256 endIndex) public view returns (uint256 balance) ``` -Get the operator IDs +Get the swept balance + +_Should be called off-chain_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | uint64[] | operatorIds The operator IDs | +| balance | uint256 | The swept balance | -## CasimirUpkeep +## ICasimirManager -### reportHeartbeat +### Token ```solidity -uint256 reportHeartbeat +enum Token { + LINK, + SSV, + WETH +} ``` -Oracle heartbeat - -### poolCapacity +### PoolDetails ```solidity -uint256 poolCapacity +struct PoolDetails { + uint32 id; + uint256 balance; + bytes publicKey; + uint64[] operatorIds; + enum ICasimirPool.PoolStatus status; +} ``` -Pool capacity - -### reportPeriod +### User ```solidity -uint256 reportPeriod +struct User { + uint256 stake0; + uint256 stakeRatioSum0; + uint256 actionPeriodTimestamp; + uint256 actionCount; +} ``` -Current report period - -### reportRemainingRequests +### Withdrawal ```solidity -uint256 reportRemainingRequests +struct Withdrawal { + address user; + uint256 amount; + uint256 period; +} ``` -Current report remaining request count - -### reportRequestBlock +### DepositRequested ```solidity -uint256 reportRequestBlock +event DepositRequested(uint32 poolId) ``` -Current report block - -### reportCompoundablePoolIds +### DepositInitiated ```solidity -uint32[5] reportCompoundablePoolIds +event DepositInitiated(uint32 poolId) ``` -Current report compoundable pools +### DepositActivated -### finalizableCompoundablePoolIds +```solidity +event DepositActivated(uint32 poolId) +``` + +### ResharesRequested ```solidity -uint32[5] finalizableCompoundablePoolIds +event ResharesRequested(uint64 operatorId) ``` -Finalizable compoundable pools +### ReshareCompleted -### requestCBOR +```solidity +event ReshareCompleted(uint32 poolId) +``` + +### ExitRequested ```solidity -bytes requestCBOR +event ExitRequested(uint32 poolId) ``` -Binary request source code +### ForcedExitReportsRequested -### fulfillGasLimit +```solidity +event ForcedExitReportsRequested(uint256 count) +``` + +### SlashedExitReportsRequested ```solidity -uint32 fulfillGasLimit +event SlashedExitReportsRequested(uint256 count) ``` -Fulfillment gas limit +### CompletedExitReportsRequested -### constructor +```solidity +event CompletedExitReportsRequested(uint256 count) +``` + +### ExitCompleted ```solidity -constructor(address linkFunctionsAddress) public +event ExitCompleted(uint32 poolId) ``` -Constructor +### StakeDeposited -#### Parameters +```solidity +event StakeDeposited(address sender, uint256 amount) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| linkFunctionsAddress | address | The functions oracle contract address | +### StakeRebalanced -### generateRequest +```solidity +event StakeRebalanced(uint256 amount) +``` + +### RewardsDeposited ```solidity -function generateRequest(string source, bytes secrets, string[] args) public pure returns (bytes) +event RewardsDeposited(uint256 amount) ``` -Generate a new Functions.Request(off-chain, saving gas) +### TipsDeposited -#### Parameters +```solidity +event TipsDeposited(uint256 amount) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| source | string | JavaScript source code | -| secrets | bytes | Encrypted secrets payload | -| args | string[] | List of arguments accessible from within the source code | +### WithdrawalRequested -### setRequest +```solidity +event WithdrawalRequested(address sender, uint256 amount) +``` + +### WithdrawalInitiated ```solidity -function setRequest(uint32 _fulfillGasLimit, uint64 _linkSubscriptionId, bytes _requestCBOR) external +event WithdrawalInitiated(address sender, uint256 amount) ``` -Set the bytes representing the CBOR-encoded Functions.Request - -#### Parameters +### WithdrawalFulfilled -| Name | Type | Description | -| ---- | ---- | ----------- | -| _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | -| _linkSubscriptionId | uint64 | The functions billing subscription ID used to pay for Functions requests | -| _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | +```solidity +event WithdrawalFulfilled(address sender, uint256 amount) +``` -### checkUpkeep +### depositStake ```solidity -function checkUpkeep(bytes) public view returns (bool upkeepNeeded, bytes) +function depositStake() external payable ``` -Check if the upkeep is needed - -#### Return Values +### depositRewards -| Name | Type | Description | -| ---- | ---- | ----------- | -| upkeepNeeded | bool | True if the upkeep is needed | -| [1] | bytes | | +```solidity +function depositRewards() external payable +``` -### performUpkeep +### depositExitedBalance ```solidity -function performUpkeep(bytes) external +function depositExitedBalance(uint32 poolId) external payable ``` -Perform the upkeep - -### fulfillRequest +### depositRecoveredBalance ```solidity -function fulfillRequest(bytes32 requestId, bytes response, bytes _error) internal +function depositRecoveredBalance(uint32 poolId) external payable ``` -Callback that is invoked once the DON has resolved the request or hit an error - -#### Parameters +### depositReservedFees -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The request ID, returned by sendRequest() | -| response | bytes | Aggregated response from the user code | -| _error | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | +```solidity +function depositReservedFees() external payable +``` -### setOracleAddress +### depositClusterBalance ```solidity -function setOracleAddress(address newOracleAddress) external +function depositClusterBalance(uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external ``` -Update the functions oracle address - -#### Parameters +### depositUpkeepBalance -| Name | Type | Description | -| ---- | ---- | ----------- | -| newOracleAddress | address | New oracle address | +```solidity +function depositUpkeepBalance(uint256 feeAmount, bool processed) external +``` -### encodeResponse +### rebalanceStake ```solidity -function encodeResponse(uint128 activeBalance, uint32 activatedDeposits, uint32 completedExits, uint32 slashedExits) external pure returns (bytes) +function rebalanceStake(uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, uint256 completedExits) external ``` -Encode the response for testing - -#### Parameters +### compoundRewards -| Name | Type | Description | -| ---- | ---- | ----------- | -| activeBalance | uint128 | Active balance | -| activatedDeposits | uint32 | Count of new deposits | -| completedExits | uint32 | Count of new exits | -| slashedExits | uint32 | Count of new slashedExits | +```solidity +function compoundRewards(uint32[5] poolIds) external +``` -### mockFulfillRequest +### requestWithdrawal ```solidity -function mockFulfillRequest(bytes32 requestId, bytes response, bytes err) external +function requestWithdrawal(uint256 amount) external ``` -Fulfill the request for testing +### fulfillWithdrawals -#### Parameters +```solidity +function fulfillWithdrawals(uint256 count) external +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The request ID, returned by sendRequest() | -| response | bytes | Aggregated response from the user code | -| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | +### initiateDeposit -## CasimirViews +```solidity +function initiateDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external +``` -### constructor +### activateDeposits ```solidity -constructor(address managerAddress, address registryAddress) public +function activateDeposits(uint256 count) external ``` -### getCompoundablePoolIds +### requestForcedExitReports ```solidity -function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5] poolIds) +function requestForcedExitReports(uint256 count) external ``` -Get the next five compoundable pool IDs +### requestCompletedExitReports -_Should be called off-chain_ +```solidity +function requestCompletedExitReports(uint256 count) external +``` -#### Parameters +### requestReshares -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | +```solidity +function requestReshares(uint64 operatorId) external +``` -#### Return Values +### reportForcedExits -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolIds | uint32[5] | The next five compoundable pool IDs | +```solidity +function reportForcedExits(uint32[] poolIds) external +``` -### getEligibleOperatorIds +### reportCompletedExit ```solidity -function getEligibleOperatorIds(uint256 startIndex, uint256 endIndex) external view returns (uint64[] activeOperatorIds) +function reportCompletedExit(uint256 poolIndex, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external ``` -Get the active operator IDs +### reportReshare -#### Parameters +```solidity +function reportReshare(uint32 poolId, uint64[] operatorIds, uint64[] oldOperatorIds, uint64 newOperatorId, uint64 oldOperatorId, bytes shares, struct ISSVNetworkCore.Cluster cluster, struct ISSVNetworkCore.Cluster oldCluster, uint256 feeAmount, bool processed) external +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | +### withdrawLINKBalance -#### Return Values +```solidity +function withdrawLINKBalance(uint256 amount) external +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| activeOperatorIds | uint64[] | The active operator IDs | +### withdrawSSVBalance -### getSweptBalance +```solidity +function withdrawSSVBalance(uint256 amount) external +``` + +### setFunctionsAddress ```solidity -function getSweptBalance(uint256 startIndex, uint256 endIndex) public view returns (uint256 balance) +function setFunctionsAddress(address functionsAddress) external ``` -Get the swept balance +### upkeepId -_Should be called off-chain_ +```solidity +function upkeepId() external view returns (uint256) +``` -#### Parameters +### latestActiveBalance -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | +```solidity +function latestActiveBalance() external view returns (uint256) +``` -#### Return Values +### latestActiveBalanceAfterFees -| Name | Type | Description | -| ---- | ---- | ----------- | -| balance | uint256 | The swept balance | +```solidity +function latestActiveBalanceAfterFees() external view returns (uint256) +``` -## ICasimirManager +### feePercent -### Token +```solidity +function feePercent() external view returns (uint32) +``` + +### requestedExits ```solidity -enum Token { - LINK, - SSV, - WETH -} +function requestedExits() external view returns (uint256) ``` -### PoolDetails +### requestedWithdrawals ```solidity -struct PoolDetails { - uint32 id; - uint256 balance; - bytes publicKey; - uint64[] operatorIds; - enum ICasimirPool.PoolStatus status; -} +function requestedWithdrawals() external view returns (uint256) ``` -### User +### requestedWithdrawalBalance ```solidity -struct User { - uint256 stake0; - uint256 stakeRatioSum0; - uint256 actionPeriodTimestamp; - uint256 actionCount; -} +function requestedWithdrawalBalance() external view returns (uint256) ``` -### Withdrawal +### finalizableCompletedExits ```solidity -struct Withdrawal { - address user; - uint256 amount; - uint256 period; -} +function finalizableCompletedExits() external view returns (uint256) ``` -### DepositRequested +### reportPeriod ```solidity -event DepositRequested(uint32 poolId) +function reportPeriod() external view returns (uint32) ``` -### DepositInitiated +### prepoolBalance ```solidity -event DepositInitiated(uint32 poolId) +function prepoolBalance() external view returns (uint256) ``` -### DepositActivated +### getTotalStake ```solidity -event DepositActivated(uint32 poolId) +function getTotalStake() external view returns (uint256) ``` -### ResharesRequested +### getReadyPoolIds ```solidity -event ResharesRequested(uint64 operatorId) +function getReadyPoolIds() external view returns (uint32[]) ``` -### ReshareCompleted +### getPendingPoolIds ```solidity -event ReshareCompleted(uint32 poolId) +function getPendingPoolIds() external view returns (uint32[]) ``` -### ExitRequested +### getStakedPoolIds ```solidity -event ExitRequested(uint32 poolId) +function getStakedPoolIds() external view returns (uint32[]) ``` -### ForcedExitReportsRequested +### getBufferedBalance ```solidity -event ForcedExitReportsRequested(uint256 count) +function getBufferedBalance() external view returns (uint256) ``` -### SlashedExitReportsRequested +### getExpectedEffectiveBalance ```solidity -event SlashedExitReportsRequested(uint256 count) +function getExpectedEffectiveBalance() external view returns (uint256) ``` -### CompletedExitReportsRequested +### getPendingWithdrawalEligibility ```solidity -event CompletedExitReportsRequested(uint256 count) +function getPendingWithdrawalEligibility(uint256 index, uint256 period) external view returns (bool) ``` -### ExitCompleted +### getWithdrawableBalance ```solidity -event ExitCompleted(uint32 poolId) +function getWithdrawableBalance() external view returns (uint256) ``` -### StakeDeposited +### getUserStake ```solidity -event StakeDeposited(address sender, uint256 amount) +function getUserStake(address userAddress) external view returns (uint256) ``` -### StakeRebalanced +### getPoolAddress ```solidity -event StakeRebalanced(uint256 amount) +function getPoolAddress(uint32 poolId) external view returns (address) ``` -### RewardsDeposited +### getPoolDetails ```solidity -event RewardsDeposited(uint256 amount) +function getPoolDetails(uint32 poolId) external view returns (struct ICasimirManager.PoolDetails) ``` -### TipsDeposited +### getRegistryAddress ```solidity -event TipsDeposited(uint256 amount) +function getRegistryAddress() external view returns (address) ``` -### WithdrawalRequested +### getUpkeepAddress ```solidity -event WithdrawalRequested(address sender, uint256 amount) +function getUpkeepAddress() external view returns (address) ``` -### WithdrawalInitiated +### getUpkeepBalance ```solidity -event WithdrawalInitiated(address sender, uint256 amount) +function getUpkeepBalance() external view returns (uint256 upkeepBalance) ``` -### WithdrawalFulfilled +## ICasimirPool + +### PoolConfig ```solidity -event WithdrawalFulfilled(address sender, uint256 amount) +struct PoolConfig { + uint32 poolId; + bytes publicKey; + uint64[] operatorIds; + uint256 reshares; + enum ICasimirPool.PoolStatus status; +} ``` -### depositStake +### PoolStatus ```solidity -function depositStake() external payable +enum PoolStatus { + PENDING, + ACTIVE, + EXITING_FORCED, + EXITING_REQUESTED, + WITHDRAWN +} ``` ### depositRewards ```solidity -function depositRewards() external payable +function depositRewards() external ``` -### depositExitedBalance +### withdrawBalance ```solidity -function depositExitedBalance(uint32 poolId) external payable +function withdrawBalance(uint32[] blamePercents) external ``` -### depositRecoveredBalance +### setOperatorIds ```solidity -function depositRecoveredBalance(uint32 poolId) external payable +function setOperatorIds(uint64[] operatorIds) external ``` -### depositReservedFees +### setReshares ```solidity -function depositReservedFees() external payable +function setReshares(uint256 reshares) external ``` -### depositClusterBalance +### setStatus ```solidity -function depositClusterBalance(uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external +function setStatus(enum ICasimirPool.PoolStatus status) external ``` -### depositUpkeepBalance +### getBalance ```solidity -function depositUpkeepBalance(uint256 feeAmount, bool processed) external +function getBalance() external view returns (uint256) ``` -### rebalanceStake +### getConfig ```solidity -function rebalanceStake(uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, uint256 completedExits) external +function getConfig() external view returns (struct ICasimirPool.PoolConfig) ``` -### compoundRewards +### getOperatorIds ```solidity -function compoundRewards(uint32[5] poolIds) external +function getOperatorIds() external view returns (uint64[]) ``` -### requestWithdrawal +### getPublicKey ```solidity -function requestWithdrawal(uint256 amount) external +function getPublicKey() external view returns (bytes) ``` -### fulfillWithdrawals +### getStatus ```solidity -function fulfillWithdrawals(uint256 count) external +function getStatus() external view returns (enum ICasimirPool.PoolStatus) ``` -### initiateDeposit +## ICasimirRegistry + +### OperatorRegistered ```solidity -function initiateDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external +event OperatorRegistered(uint64 operatorId) ``` -### activateDeposits +### DeregistrationRequested ```solidity -function activateDeposits(uint256 count) external +event DeregistrationRequested(uint64 operatorId) ``` -### requestForcedExitReports +### DeregistrationCompleted ```solidity -function requestForcedExitReports(uint256 count) external +event DeregistrationCompleted(uint64 operatorId) ``` -### requestCompletedExitReports +### Operator ```solidity -function requestCompletedExitReports(uint256 count) external +struct Operator { + bool active; + bool resharing; + int256 collateral; + uint256 poolCount; + mapping(uint32 => bool) pools; +} ``` -### requestReshares +### registerOperator ```solidity -function requestReshares(uint64 operatorId) external +function registerOperator(uint64 operatorId) external payable ``` -### reportForcedExits +### depositCollateral ```solidity -function reportForcedExits(uint32[] poolIds) external +function depositCollateral(uint64 operatorId) external payable ``` -### reportCompletedExit +### withdrawCollateral ```solidity -function reportCompletedExit(uint256 poolIndex, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external +function withdrawCollateral(uint64 operatorId, uint256 amount) external ``` -### reportReshare +### addOperatorPool ```solidity -function reportReshare(uint32 poolId, uint64[] operatorIds, uint64[] oldOperatorIds, uint64 newOperatorId, uint64 oldOperatorId, bytes shares, struct ISSVNetworkCore.Cluster cluster, struct ISSVNetworkCore.Cluster oldCluster, uint256 feeAmount, bool processed) external +function addOperatorPool(uint64 operatorId, uint32 poolId) external ``` -### withdrawLINKBalance +### removeOperatorPool ```solidity -function withdrawLINKBalance(uint256 amount) external +function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external ``` -### withdrawSSVBalance +### getOperatorCollateral ```solidity -function withdrawSSVBalance(uint256 amount) external +function getOperatorCollateral(uint64 operatorId) external view returns (int256) ``` -### setFunctionsAddress +### getOperatorEligibility ```solidity -function setFunctionsAddress(address functionsAddress) external +function getOperatorEligibility(uint64 operatorId) external view returns (bool eligibility) ``` -### feePercent +### getOperatorIds ```solidity -function feePercent() external view returns (uint32) +function getOperatorIds() external view returns (uint64[]) ``` -### requestedExits +## ICasimirUpkeep + +### RequestType ```solidity -function requestedExits() external view returns (uint256) +enum RequestType { + NONE, + BALANCES, + DETAILS +} ``` -### getReadyPoolIds +### ReportStatus ```solidity -function getReadyPoolIds() external view returns (uint32[]) +enum ReportStatus { + FINALIZED, + REQUESTING, + PROCESSING +} ``` -### getPendingPoolIds +### OCRResponse ```solidity -function getPendingPoolIds() external view returns (uint32[]) +event OCRResponse(bytes32 requestId, bytes result, bytes err) ``` -### getStakedPoolIds +### UpkeepPerformed ```solidity -function getStakedPoolIds() external view returns (uint32[]) +event UpkeepPerformed(enum ICasimirUpkeep.ReportStatus status) ``` -### totalStake +### checkUpkeep ```solidity -function totalStake() external view returns (uint256) +function checkUpkeep(bytes checkData) external returns (bool upkeepNeeded, bytes performData) ``` -### getBufferedBalance +method that is simulated by the keepers to see if any work actually +needs to be performed. This method does does not actually need to be +executable, and since it is only ever simulated it can consume lots of gas. -```solidity -function getBufferedBalance() external view returns (uint256) -``` +_To ensure that it is never called, you may want to add the +cannotExecute modifier from KeeperBase to your implementation of this +method._ -### getExpectedEffectiveBalance +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| checkData | bytes | specified in the upkeep registration so it is always the same for a registered upkeep. This can easily be broken down into specific arguments using `abi.decode`, so multiple upkeeps can be registered on the same contract and easily differentiated by the contract. | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| upkeepNeeded | bool | boolean to indicate whether the keeper should call performUpkeep or not. | +| performData | bytes | bytes that the keeper should call performUpkeep with, if upkeep is needed. If you would like to encode data to decode later, try `abi.encode`. | + +### performUpkeep ```solidity -function getExpectedEffectiveBalance() external view returns (uint256) +function performUpkeep(bytes performData) external ``` -### finalizableCompletedExits +method that is actually executed by the keepers, via the registry. +The data returned by the checkUpkeep simulation will be passed into +this method to actually be executed. + +_The input to this method should not be trusted, and the caller of the +method should not even be restricted to any single registry. Anyone should +be able call it, and the input should be validated, there is no guarantee +that the data passed in is the performData returned from checkUpkeep. This +could happen due to malicious keepers, racing keepers, or simply a state +change while the performUpkeep transaction is waiting for confirmation. +Always validate the data passed in._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| performData | bytes | is the data which was passed back from the checkData simulation. If it is encoded, it can easily be decoded into other types by calling `abi.decode`. This data should not be trusted, and should be validated against the contract's current state. | + +### setOracleAddress ```solidity -function finalizableCompletedExits() external view returns (uint256) +function setOracleAddress(address oracleAddress) external ``` -### latestActiveBalance +### mockFulfillRequest ```solidity -function latestActiveBalance() external view returns (uint256) +function mockFulfillRequest(bytes32 requestId, bytes result, bytes err) external ``` -### latestActiveBalanceAfterFees +## ICasimirViews + +### getCompoundablePoolIds ```solidity -function latestActiveBalanceAfterFees() external view returns (uint256) +function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5]) ``` -### reportPeriod +### getSweptBalance ```solidity -function reportPeriod() external view returns (uint256) +function getSweptBalance(uint256 startIndex, uint256 endIndex) external view returns (uint256) ``` -### getPendingWithdrawalEligibility +## Types32Array + +### remove ```solidity -function getPendingWithdrawalEligibility(uint256 index, uint256 period) external view returns (bool) +function remove(uint32[] uint32Array, uint256 index) internal ``` -### getWithdrawableBalance +_Remove a uint32 element from the array_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| uint32Array | uint32[] | The array of uint32 | +| index | uint256 | | + +## TypesBytesArray + +### remove ```solidity -function getWithdrawableBalance() external view returns (uint256) +function remove(bytes[] bytesArray, uint256 index) internal ``` -### prepoolBalance +_Remove a bytes element from the array_ -```solidity -function prepoolBalance() external view returns (uint256) -``` +#### Parameters -### getUserStake +| Name | Type | Description | +| ---- | ---- | ----------- | +| bytesArray | bytes[] | The array of bytes | +| index | uint256 | The index of the element to remove | -```solidity -function getUserStake(address userAddress) external view returns (uint256) -``` +## TypesWithdrawalArray -### requestedWithdrawalBalance +### remove ```solidity -function requestedWithdrawalBalance() external view returns (uint256) +function remove(struct ICasimirManager.Withdrawal[] withdrawals, uint256 index) internal ``` -### requestedWithdrawals +_Remove a withdrawal from the array_ -```solidity -function requestedWithdrawals() external view returns (uint256) -``` +#### Parameters -### getPoolAddress +| Name | Type | Description | +| ---- | ---- | ----------- | +| withdrawals | struct ICasimirManager.Withdrawal[] | The array of withdrawals | +| index | uint256 | The index of the withdrawal to remove | -```solidity -function getPoolAddress(uint32 poolId) external view returns (address) -``` +## TypesAddress -### getPoolDetails +### send ```solidity -function getPoolDetails(uint32 poolId) external view returns (struct ICasimirManager.PoolDetails) +function send(address user, uint256 amount) internal ``` -### getRegistryAddress +_Send ETH to a user_ -```solidity -function getRegistryAddress() external view returns (address) -``` +#### Parameters -### getUpkeepId +| Name | Type | Description | +| ---- | ---- | ----------- | +| user | address | The user address | +| amount | uint256 | The amount of stake to send | -```solidity -function getUpkeepId() external view returns (uint256) -``` +## IDepositContract -### getUpkeepAddress +### DepositEvent ```solidity -function getUpkeepAddress() external view returns (address) +event DepositEvent(bytes pubkey, bytes withdrawal_credentials, bytes amount, bytes signature, bytes index) ``` -### getUpkeepBalance +A processed deposit event. + +### deposit ```solidity -function getUpkeepBalance() external view returns (uint256 upkeepBalance) +function deposit(bytes pubkey, bytes withdrawal_credentials, bytes signature, bytes32 deposit_data_root) external payable ``` -## ICasimirPool +Submit a Phase 0 DepositData object. -### PoolConfig +#### Parameters -```solidity -struct PoolConfig { - uint32 poolId; - bytes publicKey; - uint64[] operatorIds; - uint256 reshares; - enum ICasimirPool.PoolStatus status; -} -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| pubkey | bytes | A BLS12-381 public key. | +| withdrawal_credentials | bytes | Commitment to a public key for withdrawals. | +| signature | bytes | A BLS12-381 signature. | +| deposit_data_root | bytes32 | The SHA-256 hash of the SSZ-encoded DepositData object. Used as a protection against malformed input. | -### PoolStatus +### get_deposit_root ```solidity -enum PoolStatus { - PENDING, - ACTIVE, - EXITING_FORCED, - EXITING_REQUESTED, - WITHDRAWN -} +function get_deposit_root() external view returns (bytes32) ``` -### depositRewards +Query the current deposit root hash. -```solidity -function depositRewards() external -``` +#### Return Values -### withdrawBalance +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes32 | The deposit root hash. | + +### get_deposit_count ```solidity -function withdrawBalance(uint32[] blamePercents) external +function get_deposit_count() external view returns (bytes) ``` -### setOperatorIds +Query the current deposit count. -```solidity -function setOperatorIds(uint64[] operatorIds) external -``` +#### Return Values -### setReshares +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes | The deposit count encoded as a little endian 64-bit number. | -```solidity -function setReshares(uint256 reshares) external -``` +## IWETH9 -### setStatus +### deposit ```solidity -function setStatus(enum ICasimirPool.PoolStatus status) external +function deposit() external payable ``` -### getBalance +Deposit ether to get wrapped ether + +### withdraw ```solidity -function getBalance() external view returns (uint256) +function withdraw(uint256) external ``` -### getConfig +Withdraw wrapped ether to get ether + +## KeeperRegistrarInterface + +### RegistrationParams ```solidity -function getConfig() external view returns (struct ICasimirPool.PoolConfig) +struct RegistrationParams { + string name; + bytes encryptedEmail; + address upkeepContract; + uint32 gasLimit; + address adminAddress; + bytes checkData; + bytes offchainConfig; + uint96 amount; +} ``` -### getOperatorIds +### registerUpkeep ```solidity -function getOperatorIds() external view returns (uint64[]) +function registerUpkeep(struct KeeperRegistrarInterface.RegistrationParams requestParams) external returns (uint256) ``` -### getPublicKey +## CasimirMultisig + +### owners ```solidity -function getPublicKey() external view returns (bytes) +address[] owners ``` -### getStatus +### isOwner ```solidity -function getStatus() external view returns (enum ICasimirPool.PoolStatus) +mapping(address => bool) isOwner ``` -## ICasimirRegistry - -### OperatorRegistered +### confirmationsRequired ```solidity -event OperatorRegistered(uint64 operatorId) +uint256 confirmationsRequired ``` -### DeregistrationRequested +### isOwnerChangeConfirmed ```solidity -event DeregistrationRequested(uint64 operatorId) +mapping(uint256 => mapping(address => bool)) isOwnerChangeConfirmed ``` -### DeregistrationCompleted +### isTransactionConfirmed ```solidity -event DeregistrationCompleted(uint64 operatorId) +mapping(uint256 => mapping(address => bool)) isTransactionConfirmed ``` -### Operator +### ownerChanges ```solidity -struct Operator { - bool active; - bool resharing; - int256 collateral; - uint256 poolCount; - mapping(uint32 => bool) pools; -} +struct ICasimirMultisig.OwnerChange[] ownerChanges ``` -### registerOperator +### transactions ```solidity -function registerOperator(uint64 operatorId) external payable +struct ICasimirMultisig.Transaction[] transactions ``` -### depositCollateral +### onlyOwner ```solidity -function depositCollateral(uint64 operatorId) external payable +modifier onlyOwner() ``` -### withdrawCollateral +### ownerChangeExists ```solidity -function withdrawCollateral(uint64 operatorId, uint256 amount) external +modifier ownerChangeExists(uint256 changeId) ``` -### addOperatorPool +### ownerChangeNotExecuted ```solidity -function addOperatorPool(uint64 operatorId, uint32 poolId) external +modifier ownerChangeNotExecuted(uint256 changeId) ``` -### removeOperatorPool +### ownerChangeNotConfirmed ```solidity -function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external +modifier ownerChangeNotConfirmed(uint256 changeId) ``` -### getOperatorCollateral +### transactionExists ```solidity -function getOperatorCollateral(uint64 operatorId) external view returns (int256) +modifier transactionExists(uint256 transactionIndex) ``` -### getOperatorEligibility +### transactionNotExecuted ```solidity -function getOperatorEligibility(uint64 operatorId) external view returns (bool eligibility) +modifier transactionNotExecuted(uint256 transactionIndex) ``` -### getOperatorIds +### transactionNotConfirmed ```solidity -function getOperatorIds() external view returns (uint64[]) +modifier transactionNotConfirmed(uint256 transactionIndex) ``` -## ICasimirUpkeep - -### RequestType +### constructor ```solidity -enum RequestType { - NONE, - BALANCES, - DETAILS -} +constructor(address[] _owners) public ``` -### ReportStatus +### receive ```solidity -enum ReportStatus { - FINALIZED, - REQUESTING, - PROCESSING -} +receive() external payable ``` -### OCRResponse +### submitOwnerChange ```solidity -event OCRResponse(bytes32 requestId, bytes result, bytes err) +function submitOwnerChange(address owner, bool add) public ``` -### UpkeepPerformed +### confirmOwnerChange ```solidity -event UpkeepPerformed(enum ICasimirUpkeep.ReportStatus status) +function confirmOwnerChange(uint256 changeId) public ``` -### checkUpkeep +### executeOwnerChange ```solidity -function checkUpkeep(bytes checkData) external returns (bool upkeepNeeded, bytes performData) +function executeOwnerChange(uint256 changeId) public ``` -method that is simulated by the keepers to see if any work actually -needs to be performed. This method does does not actually need to be -executable, and since it is only ever simulated it can consume lots of gas. +### revokeOwnerChangeConfirmation -_To ensure that it is never called, you may want to add the -cannotExecute modifier from KeeperBase to your implementation of this -method._ +```solidity +function revokeOwnerChangeConfirmation(uint256 changeId) public +``` -#### Parameters +### submitTransaction -| Name | Type | Description | -| ---- | ---- | ----------- | -| checkData | bytes | specified in the upkeep registration so it is always the same for a registered upkeep. This can easily be broken down into specific arguments using `abi.decode`, so multiple upkeeps can be registered on the same contract and easily differentiated by the contract. | +```solidity +function submitTransaction(address to, uint256 value, bytes data) public returns (uint256 transactionIndex) +``` -#### Return Values +### confirmTransaction -| Name | Type | Description | -| ---- | ---- | ----------- | -| upkeepNeeded | bool | boolean to indicate whether the keeper should call performUpkeep or not. | -| performData | bytes | bytes that the keeper should call performUpkeep with, if upkeep is needed. If you would like to encode data to decode later, try `abi.encode`. | +```solidity +function confirmTransaction(uint256 transactionIndex) public +``` -### performUpkeep +### executeTransaction ```solidity -function performUpkeep(bytes performData) external +function executeTransaction(uint256 transactionIndex) public ``` -method that is actually executed by the keepers, via the registry. -The data returned by the checkUpkeep simulation will be passed into -this method to actually be executed. +### revokeTransactionConfirmation -_The input to this method should not be trusted, and the caller of the -method should not even be restricted to any single registry. Anyone should -be able call it, and the input should be validated, there is no guarantee -that the data passed in is the performData returned from checkUpkeep. This -could happen due to malicious keepers, racing keepers, or simply a state -change while the performUpkeep transaction is waiting for confirmation. -Always validate the data passed in._ +```solidity +function revokeTransactionConfirmation(uint256 transactionIndex) public +``` -#### Parameters +### adjustConfirmationsRequired -| Name | Type | Description | -| ---- | ---- | ----------- | -| performData | bytes | is the data which was passed back from the checkData simulation. If it is encoded, it can easily be decoded into other types by calling `abi.decode`. This data should not be trusted, and should be validated against the contract's current state. | +```solidity +function adjustConfirmationsRequired() internal +``` -### setOracleAddress +### getOwners ```solidity -function setOracleAddress(address oracleAddress) external +function getOwners() public view returns (address[]) ``` -### mockFulfillRequest +### getOwnerChangeCount ```solidity -function mockFulfillRequest(bytes32 requestId, bytes result, bytes err) external +function getOwnerChangeCount() public view returns (uint256) ``` -## ICasimirViews +### getOwnerChange -### getCompoundablePoolIds +```solidity +function getOwnerChange(uint256 changeId) public view returns (address owner, bool add, bool executed, uint256 confirmations) +``` + +### getTransactionCount ```solidity -function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5]) +function getTransactionCount() public view returns (uint256) ``` -### getSweptBalance +### getTransaction ```solidity -function getSweptBalance(uint256 startIndex, uint256 endIndex) external view returns (uint256) +function getTransaction(uint256 transactionIndex) public view returns (address to, uint256 value, bytes data, bool executed, uint256 confirmations) ``` -## Types32Array +## ICasimirMultisig -### remove +### Deposit ```solidity -function remove(uint32[] uint32Array, uint256 index) internal +event Deposit(address sender, uint256 amount, uint256 balance) ``` -_Remove a uint32 element from the array_ +### SubmitOwnerChange -#### Parameters +```solidity +event SubmitOwnerChange(address owner, uint256 changeId, bool add) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| uint32Array | uint32[] | The array of uint32 | -| index | uint256 | | +### ConfirmOwnerChange -## TypesBytesArray +```solidity +event ConfirmOwnerChange(address owner, uint256 changeId) +``` -### remove +### RevokeOwnerChangeConfirmation ```solidity -function remove(bytes[] bytesArray, uint256 index) internal +event RevokeOwnerChangeConfirmation(address owner, uint256 changeId) ``` -_Remove a bytes element from the array_ +### ExecuteOwnerChange -#### Parameters +```solidity +event ExecuteOwnerChange(address owner, uint256 changeId) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| bytesArray | bytes[] | The array of bytes | -| index | uint256 | The index of the element to remove | +### SubmitTransaction -## TypesWithdrawalArray +```solidity +event SubmitTransaction(address owner, uint256 txIndex, address to, uint256 value, bytes data) +``` -### remove +### ConfirmTransaction ```solidity -function remove(struct ICasimirManager.Withdrawal[] withdrawals, uint256 index) internal +event ConfirmTransaction(address owner, uint256 txIndex) ``` -_Remove a withdrawal from the array_ +### RevokeTransactionConfirmation -#### Parameters +```solidity +event RevokeTransactionConfirmation(address owner, uint256 txIndex) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| withdrawals | struct ICasimirManager.Withdrawal[] | The array of withdrawals | -| index | uint256 | The index of the withdrawal to remove | +### ExecuteTransaction -## TypesAddress +```solidity +event ExecuteTransaction(address owner, uint256 txIndex) +``` -### send +### OwnerChange ```solidity -function send(address user, uint256 amount) internal +struct OwnerChange { + address owner; + bool add; + bool executed; + uint256 confirmations; +} ``` -_Send ETH to a user_ +### Transaction -#### Parameters +```solidity +struct Transaction { + address to; + uint256 value; + bytes data; + bool executed; + uint256 confirmations; +} +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| user | address | The user address | -| amount | uint256 | The amount of stake to send | +### receive -## IDepositContract +```solidity +receive() external payable +``` -### DepositEvent +### submitOwnerChange ```solidity -event DepositEvent(bytes pubkey, bytes withdrawal_credentials, bytes amount, bytes signature, bytes index) +function submitOwnerChange(address owner, bool add) external ``` -A processed deposit event. - -### deposit +### confirmOwnerChange ```solidity -function deposit(bytes pubkey, bytes withdrawal_credentials, bytes signature, bytes32 deposit_data_root) external payable +function confirmOwnerChange(uint256 changeId) external ``` -Submit a Phase 0 DepositData object. - -#### Parameters +### executeOwnerChange -| Name | Type | Description | -| ---- | ---- | ----------- | -| pubkey | bytes | A BLS12-381 public key. | -| withdrawal_credentials | bytes | Commitment to a public key for withdrawals. | -| signature | bytes | A BLS12-381 signature. | -| deposit_data_root | bytes32 | The SHA-256 hash of the SSZ-encoded DepositData object. Used as a protection against malformed input. | +```solidity +function executeOwnerChange(uint256 changeId) external +``` -### get_deposit_root +### revokeOwnerChangeConfirmation ```solidity -function get_deposit_root() external view returns (bytes32) +function revokeOwnerChangeConfirmation(uint256 changeId) external ``` -Query the current deposit root hash. - -#### Return Values +### submitTransaction -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes32 | The deposit root hash. | +```solidity +function submitTransaction(address to, uint256 value, bytes data) external returns (uint256 transactionIndex) +``` -### get_deposit_count +### confirmTransaction ```solidity -function get_deposit_count() external view returns (bytes) +function confirmTransaction(uint256 transactionIndex) external ``` -Query the current deposit count. +### executeTransaction -#### Return Values +```solidity +function executeTransaction(uint256 transactionIndex) external +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes | The deposit count encoded as a little endian 64-bit number. | +### revokeTransactionConfirmation -## IWETH9 +```solidity +function revokeTransactionConfirmation(uint256 transactionIndex) external +``` -### deposit +### getOwners ```solidity -function deposit() external payable +function getOwners() external view returns (address[]) ``` -Deposit ether to get wrapped ether - -### withdraw +### getOwnerChangeCount ```solidity -function withdraw(uint256) external +function getOwnerChangeCount() external view returns (uint256) ``` -Withdraw wrapped ether to get ether +### getOwnerChange -## KeeperRegistrarInterface +```solidity +function getOwnerChange(uint256 changeId) external view returns (address owner, bool add, bool executed, uint256 confirmations) +``` -### RegistrationParams +### getTransactionCount ```solidity -struct RegistrationParams { - string name; - bytes encryptedEmail; - address upkeepContract; - uint32 gasLimit; - address adminAddress; - bytes checkData; - bytes offchainConfig; - uint96 amount; -} +function getTransactionCount() external view returns (uint256) ``` -### registerUpkeep +### getTransaction ```solidity -function registerUpkeep(struct KeeperRegistrarInterface.RegistrationParams requestParams) external returns (uint256) +function getTransaction(uint256 transactionIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 confirmations) ``` ## MockFunctionsOracle @@ -3050,10 +2982,10 @@ Get the manager active (consensus) deposits | ---- | ---- | ----------- | | activeDeposits | uint256 | The manager active (consensus) deposits | -### latestActiveBalance +### getLatestActiveBalance ```solidity -function latestActiveBalance() public view returns (uint256) +function getLatestActiveBalance() public view returns (uint256) ``` Get the latest manager active (consensus) balance @@ -3064,10 +2996,10 @@ Get the latest manager active (consensus) balance | ---- | ---- | ----------- | | [0] | uint256 | activeBalance The latest manager active (consensus) balance | -### latestActiveBalanceAfterFees +### getLatestActiveBalanceAfterFees ```solidity -function latestActiveBalanceAfterFees() public view returns (uint256) +function getLatestActiveBalanceAfterFees() public view returns (uint256) ``` Get the manager latest active (consensus) balance after fees @@ -3078,10 +3010,10 @@ Get the manager latest active (consensus) balance after fees | ---- | ---- | ----------- | | [0] | uint256 | activeBalanceAfterFees The manager latest active (consensus) balance after fees | -### requestedWithdrawals +### getPendingWithdrawals ```solidity -function requestedWithdrawals() public view returns (uint256) +function getPendingWithdrawals() public view returns (uint256) ``` Get the total pending withdrawals @@ -3106,10 +3038,10 @@ Get the pending withdrawal queue | ---- | ---- | ----------- | | [0] | struct ICasimirManager.Withdrawal[] | pendingWithdrawalQueue The pending withdrawal queue | -### feePercent +### getFeePercent ```solidity -function feePercent() public view returns (uint32) +function getFeePercent() public view returns (uint32) ``` Get the total fee percentage @@ -3856,10 +3788,10 @@ function setFeePercents(uint32 ethFeePercent, uint32 linkFeePercent, uint32 ssvF function setFunctionsAddress(address functionsAddress) external ``` -### feePercent +### getFeePercent ```solidity -function feePercent() external view returns (uint32) +function getFeePercent() external view returns (uint32) ``` ### getETHFeePercent @@ -3928,16 +3860,16 @@ function getBufferedBalance() external view returns (uint256) function getActiveDeposits() external view returns (uint256) ``` -### latestActiveBalance +### getLatestActiveBalance ```solidity -function latestActiveBalance() external view returns (uint256) +function getLatestActiveBalance() external view returns (uint256) ``` -### latestActiveBalanceAfterFees +### getLatestActiveBalanceAfterFees ```solidity -function latestActiveBalanceAfterFees() external view returns (uint256) +function getLatestActiveBalanceAfterFees() external view returns (uint256) ``` ### getExitedBalance @@ -3964,10 +3896,10 @@ function getSweptBalance() external view returns (uint256) function getUserStake(address userAddress) external view returns (uint256) ``` -### requestedWithdrawals +### getPendingWithdrawals ```solidity -function requestedWithdrawals() external view returns (uint256) +function getPendingWithdrawals() external view returns (uint256) ``` ### getPendingWithdrawalQueue diff --git a/contracts/ethereum/src/v1/CasimirManager.sol b/contracts/ethereum/src/v1/CasimirManager.sol index 2987b8c8a..981e5aecf 100644 --- a/contracts/ethereum/src/v1/CasimirManager.sol +++ b/contracts/ethereum/src/v1/CasimirManager.sol @@ -106,7 +106,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Latest active balance after fees */ uint256 public latestActiveBalanceAfterFees; /** Latest active rewards */ - int256 private latestActiveRewardBalance; + int256 public latestActiveRewardBalance; /** Exited pool count */ uint256 public finalizableCompletedExits; /** Exited balance */ @@ -141,8 +141,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint32[] private pendingPoolIds; /** IDs of pools staked */ uint32[] private stakedPoolIds; - /** Active pool count */ - uint256 private totalDeposits; /** Exiting pool count */ uint256 public requestedExits; /** Slashed pool count */ @@ -343,6 +341,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { exitedBalance += balance; finalizableExitedBalance += balance; + finalizableCompletedExits++; } @@ -472,11 +471,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ) external onlyUpkeep { uint256 expectedActivatedBalance = activatedDeposits * poolCapacity; uint256 expectedExitedBalance = completedExits * poolCapacity; - int256 surplus = int256(activeBalance + sweptBalance) - - (int256(getExpectedEffectiveBalance() + expectedExitedBalance)); - int256 rewards = surplus - int256(finalizableExitedBalance); + int256 rewards = int256(activeBalance + sweptBalance - expectedExitedBalance) - int256(getExpectedEffectiveBalance()); int256 change = rewards - latestActiveRewardBalance; - if (change > 0) { uint256 gain = uint256(change); if (rewards > 0) { @@ -672,7 +668,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint32 poolId = readyPoolIds[0]; readyPoolIds.remove(0); pendingPoolIds.push(poolId); - totalDeposits++; poolAddresses[poolId] = deployPool( poolId, @@ -866,7 +861,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ICasimirPool.PoolConfig memory poolConfig = pool.getConfig(); require( poolConfig.status == ICasimirPool.PoolStatus.EXITING_FORCED || - poolConfig.status == ICasimirPool.PoolStatus.EXITING_REQUESTED, + poolConfig.status == ICasimirPool.PoolStatus.EXITING_REQUESTED, "Pool not exiting" ); @@ -874,7 +869,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint64[] memory operatorIds = poolConfig.operatorIds; bytes memory publicKey = poolConfig.publicKey; - totalDeposits--; if (poolConfig.status == ICasimirPool.PoolStatus.EXITING_REQUESTED) { requestedExits--; } else if ( @@ -882,6 +876,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ) { forcedExits--; } + pool.setStatus(ICasimirPool.PoolStatus.WITHDRAWN); pool.withdrawBalance(blamePercents); diff --git a/contracts/ethereum/src/v1/CasimirUpkeep.sol b/contracts/ethereum/src/v1/CasimirUpkeep.sol index 25148edb0..9202c69b3 100644 --- a/contracts/ethereum/src/v1/CasimirUpkeep.sol +++ b/contracts/ethereum/src/v1/CasimirUpkeep.sol @@ -57,7 +57,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /** Current report deposit activations */ uint256 private reportActivatedDeposits; /** Current report unexpected exits */ - uint256 private reportForcedExitss; + uint256 private reportForcedExits; /** Current report completed exits */ uint256 private reportCompletedExits; /** Current report compoundable pools */ @@ -204,7 +204,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { reportActiveBalance = 0; reportActivatedDeposits = 0; - reportForcedExitss = 0; + reportForcedExits = 0; reportCompletedExits = 0; reportCompoundablePoolIds = [0, 0, 0, 0, 0]; } @@ -252,7 +252,7 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { ) = abi.decode(response, (uint32, uint32, uint32, uint32[5])); reportActivatedDeposits = activatedDeposits; - reportForcedExitss = unexpectedExits; + reportForcedExits = unexpectedExits; reportCompletedExits = completedExits; reportCompoundablePoolIds = compoundablePools; @@ -263,8 +263,8 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { if (reportRemainingRequests == 0) { reportStatus = ReportStatus.PROCESSING; - if (reportForcedExitss > 0) { - manager.requestForcedExitReports(reportForcedExitss); + if (reportForcedExits > 0) { + manager.requestForcedExitReports(reportForcedExits); } if (reportCompletedExits > 0) { diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol index e95a1a5a4..6c3ee7744 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol @@ -134,6 +134,7 @@ interface ICasimirManager { function upkeepId() external view returns (uint256); function latestActiveBalance() external view returns (uint256); function latestActiveBalanceAfterFees() external view returns (uint256); + function latestActiveRewardBalance() external view returns (int256); function feePercent() external view returns (uint32); function requestedExits() external view returns (uint256); function requestedWithdrawals() external view returns (uint256); diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 9bc22fb47..3af259166 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -13,7 +13,6 @@ export async function deploymentFixture() { const mockFunctionsOracleFactory = await ethers.getContractFactory('MockFunctionsOracle') const mockFunctionsOracle = await mockFunctionsOracleFactory.deploy() await mockFunctionsOracle.deployed() - console.log(`MockFunctionsOracle contract deployed to ${mockFunctionsOracle.address}`) const managerArgs = { oracleAddress: oracle.address, @@ -32,13 +31,10 @@ export async function deploymentFixture() { const managerFactory = await ethers.getContractFactory('CasimirManager') const manager = await managerFactory.deploy(...Object.values(managerArgs)) as CasimirManager await manager.deployed() - console.log(`CasimirManager contract deployed to ${manager.address}`) const registryAddress = await manager.getRegistryAddress() - console.log(`CasimirRegistry contract deployed to ${registryAddress}`) const upkeepAddress = await manager.getUpkeepAddress() - console.log(`CasimirUpkeep contract deployed to ${upkeepAddress}`) const viewsArgs = { managerAddress: manager.address, @@ -46,7 +42,6 @@ export async function deploymentFixture() { } const viewsFactory = await ethers.getContractFactory('CasimirViews') const views = await viewsFactory.deploy(...Object.values(viewsArgs)) as CasimirViews - console.log(`CasimirViews contract deployed to ${views.address}`) const registry = await ethers.getContractAt('CasimirRegistry', registryAddress) as CasimirRegistry const upkeep = await ethers.getContractAt('CasimirUpkeep', upkeepAddress) as CasimirUpkeep @@ -66,7 +61,7 @@ export async function deploymentFixture() { await result.wait() } - return { manager, upkeep, owner, keeper, oracle } + return { manager, registry, upkeep, views, owner, keeper, oracle } } /** Fixture to stake 16 for the first user */ @@ -457,7 +452,7 @@ export async function thirdUserFullWithdrawalFixture() { let requestId = latestRequestId const nextValues = { - activeBalance: 128, + activeBalance: 96, sweptBalance: sweptExitedBalance, activatedDeposits: 0, forcedExits: 0, @@ -479,7 +474,7 @@ export async function thirdUserFullWithdrawalFixture() { return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } } -/** Fixture to simulate stakes and rewards */ +/** Fixture to simulate rewards */ export async function simulationFixture() { const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(thirdUserFullWithdrawalFixture) @@ -489,11 +484,11 @@ export async function simulationFixture() { let requestId = latestRequestId for (let i = 0; i < 5; i++) { - const stakedPoolIds = await manager.getStakedPoolIds() await time.increase(time.duration.days(1)) - + await runUpkeep({ upkeep, keeper }) - + + const stakedPoolIds = await manager.getStakedPoolIds() const rewardsAmount = rewardsPerValidator * stakedPoolIds.length totalRewards += round(rewardsAmount, 10) nextActiveBalance = round(nextActiveBalance + rewardsAmount, 10) diff --git a/contracts/ethereum/test/integration.ts b/contracts/ethereum/test/integration.ts index 0997bd280..fa7bcc4aa 100644 --- a/contracts/ethereum/test/integration.ts +++ b/contracts/ethereum/test/integration.ts @@ -3,7 +3,7 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' import { expect } from 'chai' import { firstUserDepositFixture, rewardsPostSecondUserDepositFixture, secondUserDepositFixture, thirdUserDepositFixture, rewardsPostThirdUserDepositFixture, simulationFixture, firstUserPartialWithdrawalFixture, fourthUserDepositFixture, sweepPostSecondUserDepositFixture, sweepPostThirdUserDepositFixture, activeBalanceLossFixture, activeBalanceRecoveryFixture, thirdUserFullWithdrawalFixture } from './fixtures/shared' -describe('Casimir manager', async function () { +describe('Integration', async function () { it('First user\'s 16.0 stake increases the total stake to 16.0', async function () { const { manager } = await loadFixture(firstUserDepositFixture) diff --git a/contracts/ethereum/test/users.ts b/contracts/ethereum/test/users.ts new file mode 100644 index 000000000..66154112d --- /dev/null +++ b/contracts/ethereum/test/users.ts @@ -0,0 +1,135 @@ +import { ethers } from 'hardhat' +import { loadFixture, setBalance, time } from '@nomicfoundation/hardhat-network-helpers' +import { expect } from 'chai' +import { deploymentFixture } from './fixtures/shared' +import { round } from '../helpers/math' +import { initiateDepositHandler, reportCompletedExitsHandler } from '../helpers/oracle' +import { fulfillReport, runUpkeep } from '../helpers/upkeep' + +describe('Users', async function () { + it('User small stake and half withdrawal updates total and user stake, and user balance', async function () { + const { manager } = await loadFixture(deploymentFixture) + const [, user] = await ethers.getSigners() + + const depositAmount = round(16 * ((100 + await manager.feePercent()) / 100), 10) + const deposit = await manager.connect(user).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) + await deposit.wait() + + let stake = await manager.getTotalStake() + let userStake = await manager.getUserStake(user.address) + + expect(ethers.utils.formatEther(stake)).equal('16.0') + expect(ethers.utils.formatEther(userStake)).equal('16.0') + + const userBalanceBefore = await ethers.provider.getBalance(user.address) + const userWithdrawalRequest = await manager.connect(user).requestWithdrawal(ethers.utils.parseEther('8.0')) + await userWithdrawalRequest.wait() + const userBalanceAfter = await ethers.provider.getBalance(user.address) + + stake = await manager.getTotalStake() + userStake = await manager.getUserStake(user.address) + + expect(ethers.utils.formatEther(stake)).equal('8.0') + expect(ethers.utils.formatEther(userStake)).equal('8.0') + expect(ethers.utils.formatEther(userBalanceAfter.sub(userBalanceBefore))).contains('7.999') // Todo get gas spent on withdrawal request + }) + + it('User big stake and half withdrawal updates total and user stake (after balance report), and user balance (after exit report)', async function () { + const { manager, upkeep, keeper, oracle } = await loadFixture(deploymentFixture) + const [, user] = await ethers.getSigners() + + const depositAmount = round(64 * ((100 + await manager.feePercent()) / 100), 10) + const deposit = await manager.connect(user).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) + await deposit.wait() + + await initiateDepositHandler({ manager, signer: oracle }) + await initiateDepositHandler({ manager, signer: oracle }) + + const pendingPoolIds = await manager.getPendingPoolIds() + expect(pendingPoolIds.length).equal(2) + + await time.increase(time.duration.days(1)) + + await runUpkeep({ upkeep, keeper }) + + let requestId = 0 + const firstReportValues = { + activeBalance: 64, + sweptBalance: 0, + activatedDeposits: 2, + forcedExits: 0, + completedExits: 0, + compoundablePoolIds: [0, 0, 0, 0, 0] + } + requestId = await fulfillReport({ + upkeep, + keeper, + values: firstReportValues, + requestId + }) + + await runUpkeep({ upkeep, keeper }) + + const stakedPoolIds = await manager.getStakedPoolIds() + expect(stakedPoolIds.length).equal(2) + + let stake = await manager.getTotalStake() + let userStake = await manager.getUserStake(user.address) + + expect(ethers.utils.formatEther(stake)).equal('64.0') + expect(ethers.utils.formatEther(userStake)).equal('64.0') + + const userBalanceBefore = await ethers.provider.getBalance(user.address) + const userWithdrawalRequest = await manager.connect(user).requestWithdrawal(ethers.utils.parseEther('32.0')) + await userWithdrawalRequest.wait() + + stake = await manager.getTotalStake() + userStake = await manager.getUserStake(user.address) + + expect(ethers.utils.formatEther(stake)).equal('32.0') + expect(ethers.utils.formatEther(userStake)).equal('32.0') + + const sweptExitedBalance = 32 + const exitedPoolId = (await manager.getStakedPoolIds())[0] + const exitedPoolAddress = await manager.getPoolAddress(exitedPoolId) + const currentBalance = await ethers.provider.getBalance(exitedPoolAddress) + const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptExitedBalance.toString())) + await setBalance(exitedPoolAddress, nextBalance) + + await time.increase(time.duration.days(1)) + + await runUpkeep({ upkeep, keeper }) + + const secondReportValues = { + activeBalance: 32, + sweptBalance: sweptExitedBalance, + activatedDeposits: 0, + forcedExits: 0, + completedExits: 1, + compoundablePoolIds: [0, 0, 0, 0, 0] + } + await fulfillReport({ + upkeep, + keeper, + values: secondReportValues, + requestId + }) + + await reportCompletedExitsHandler({ manager, signer: oracle, args: { count: 1 } }) + + const finalizableCompletedExits = await manager.finalizableCompletedExits() + + expect(finalizableCompletedExits.toNumber()).equal(1) + + await runUpkeep({ upkeep, keeper }) + + stake = await manager.getTotalStake() + userStake = await manager.getUserStake(user.address) + + const userBalanceAfter = await ethers.provider.getBalance(user.address) + + expect(ethers.utils.formatEther(stake)).equal('32.0') + expect(ethers.utils.formatEther(userStake)).equal('32.0') + expect(ethers.utils.formatEther(userBalanceAfter.sub(userBalanceBefore))).contains('31.999') // Todo get gas spent on withdrawal request + }) +}) \ No newline at end of file From 2d95bae2daec6667d788a1006f8ad7c19b9e4299 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Wed, 7 Jun 2023 10:35:38 -0400 Subject: [PATCH 60/78] Fix events iterable --- contracts/ethereum/docs/index.md | 192 ++++++++++-------- .../src/v1/interfaces/ICasimirRegistry.sol | 7 + contracts/ethereum/test/operators.ts | 14 ++ services/oracle/src/index.ts | 12 +- services/oracle/src/providers/events.ts | 40 +++- services/oracle/src/providers/handlers.ts | 4 + services/oracle/src/providers/iterables.ts | 16 -- 7 files changed, 165 insertions(+), 120 deletions(-) create mode 100644 contracts/ethereum/test/operators.ts delete mode 100644 services/oracle/src/providers/iterables.ts diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 54cfbcf1c..6efa501e6 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -50,6 +50,14 @@ uint256 latestActiveBalanceAfterFees Latest active balance after fees +### latestActiveRewardBalance + +```solidity +int256 latestActiveRewardBalance +``` + +Latest active rewards + ### finalizableCompletedExits ```solidity @@ -1226,81 +1234,6 @@ Fulfill the request for testing | response | bytes | Aggregated response from the user code | | err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | -## CasimirViews - -### constructor - -```solidity -constructor(address managerAddress, address registryAddress) public -``` - -### getCompoundablePoolIds - -```solidity -function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5] poolIds) -``` - -Get the next five compoundable pool IDs - -_Should be called off-chain_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolIds | uint32[5] | The next five compoundable pool IDs | - -### getEligibleOperatorIds - -```solidity -function getEligibleOperatorIds(uint256 startIndex, uint256 endIndex) external view returns (uint64[] activeOperatorIds) -``` - -Get the active operator IDs - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| activeOperatorIds | uint64[] | The active operator IDs | - -### getSweptBalance - -```solidity -function getSweptBalance(uint256 startIndex, uint256 endIndex) public view returns (uint256 balance) -``` - -Get the swept balance - -_Should be called off-chain_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| balance | uint256 | The swept balance | - ## ICasimirManager ### Token @@ -1598,6 +1531,12 @@ function latestActiveBalance() external view returns (uint256) function latestActiveBalanceAfterFees() external view returns (uint256) ``` +### latestActiveRewardBalance + +```solidity +function latestActiveRewardBalance() external view returns (int256) +``` + ### feePercent ```solidity @@ -1987,20 +1926,6 @@ function setOracleAddress(address oracleAddress) external function mockFulfillRequest(bytes32 requestId, bytes result, bytes err) external ``` -## ICasimirViews - -### getCompoundablePoolIds - -```solidity -function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5]) -``` - -### getSweptBalance - -```solidity -function getSweptBalance(uint256 startIndex, uint256 endIndex) external view returns (uint256) -``` - ## Types32Array ### remove @@ -2165,6 +2090,95 @@ struct RegistrationParams { function registerUpkeep(struct KeeperRegistrarInterface.RegistrationParams requestParams) external returns (uint256) ``` +## CasimirViews + +### constructor + +```solidity +constructor(address managerAddress, address registryAddress) public +``` + +### getCompoundablePoolIds + +```solidity +function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5] poolIds) +``` + +Get the next five compoundable pool IDs + +_Should be called off-chain_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolIds | uint32[5] | The next five compoundable pool IDs | + +### getEligibleOperatorIds + +```solidity +function getEligibleOperatorIds(uint256 startIndex, uint256 endIndex) external view returns (uint64[] activeOperatorIds) +``` + +Get the active operator IDs + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| activeOperatorIds | uint64[] | The active operator IDs | + +### getSweptBalance + +```solidity +function getSweptBalance(uint256 startIndex, uint256 endIndex) public view returns (uint256 balance) +``` + +Get the swept balance + +_Should be called off-chain_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| balance | uint256 | The swept balance | + +## ICasimirViews + +### getCompoundablePoolIds + +```solidity +function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5]) +``` + +### getSweptBalance + +```solidity +function getSweptBalance(uint256 startIndex, uint256 endIndex) external view returns (uint256) +``` + ## CasimirMultisig ### owners diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirRegistry.sol b/contracts/ethereum/src/v1/interfaces/ICasimirRegistry.sol index 8b70fd102..734a5abf7 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirRegistry.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirRegistry.sol @@ -16,6 +16,13 @@ interface ICasimirRegistry { mapping(uint32 => bool active) pools; } + struct OperatorDetails { + bool active; + bool resharing; + int256 collateral; + uint256 poolCount; + } + function registerOperator(uint64 operatorId) external payable; function depositCollateral(uint64 operatorId) external payable; function withdrawCollateral(uint64 operatorId, uint256 amount) external; diff --git a/contracts/ethereum/test/operators.ts b/contracts/ethereum/test/operators.ts new file mode 100644 index 000000000..3b8a51638 --- /dev/null +++ b/contracts/ethereum/test/operators.ts @@ -0,0 +1,14 @@ +import { ethers } from 'hardhat' +import { loadFixture, setBalance, time } from '@nomicfoundation/hardhat-network-helpers' +import { expect } from 'chai' +import { deploymentFixture } from './fixtures/shared' +import { round } from '../helpers/math' +import { initiateDepositHandler, reportCompletedExitsHandler } from '../helpers/oracle' +import { fulfillReport, runUpkeep } from '../helpers/upkeep' + +describe('Operators', async function () { + it('Register operator 1, 2, 3, and 4', async function () { + const { manager } = await loadFixture(deploymentFixture) + console.log('Operators test') + }) +}) \ No newline at end of file diff --git a/services/oracle/src/index.ts b/services/oracle/src/index.ts index eb1207579..a757d2846 100644 --- a/services/oracle/src/index.ts +++ b/services/oracle/src/index.ts @@ -1,5 +1,5 @@ import { config } from './providers/config' -import { getEventEmitter } from './providers/events' +import { getEventsIterable } from './providers/events' import { initiateDepositHandler, initiatePoolExitHandler, @@ -18,9 +18,12 @@ const handlers = { const { provider, signer, manager, cliPath, messengerUrl } = config() ;(async function () { - const eventEmitter = getEventEmitter({ manager, events: Object.keys(handlers) }) - for await (const event of eventEmitter) { - const details = event[event.length - 1] + const eventsIterable = getEventsIterable({ manager, events: Object.keys(handlers) }) + + console.log('Listening for events', eventsIterable) + + for await (const event of eventsIterable) { + const details = event?.[event.length - 1] const { args } = details const handler = handlers[details.event as keyof typeof handlers] if (!handler) throw new Error(`No handler found for event ${details.event}`) @@ -35,3 +38,4 @@ const { provider, signer, manager, cliPath, messengerUrl } = config() } })() + diff --git a/services/oracle/src/providers/events.ts b/services/oracle/src/providers/events.ts index f15ff67d9..a16ca04c6 100644 --- a/services/oracle/src/providers/events.ts +++ b/services/oracle/src/providers/events.ts @@ -1,16 +1,34 @@ import { ethers } from 'ethers' -import { on, EventEmitter } from 'events' -import { mergeAsyncIterables } from './iterables' -export function getEventEmitter({ manager, events }: { manager: ethers.Contract, events: string[] }) { - const iterables = [] - for (const event of events) { - const iterable = getEvent({ manager, event }) - iterables.push(iterable) - } - return mergeAsyncIterables(iterables) +export function getEventsIterable({ manager, events }: { manager: ethers.Contract, events: string[] }) { + return (async function*() { + for (const event of events) { + yield* getEvent({ manager, event }) + } + })() } -function getEvent({ manager, event }: { manager: ethers.Contract, event: string }) { - return on(manager as ethers.Contract & EventEmitter, event) +async function* getEvent({ manager, event }: { manager: ethers.Contract, event: string }) { + const queue: any[][] = [] + const listener = (...args: any[]) => queue.push(args) + + manager.on(event, listener) + + try { + while (true) { + if (queue.length === 0) { + await new Promise(resolve => { + const waitListener = () => { + manager.off(event, waitListener) + resolve() + } + manager.on(event, waitListener) + }) + } else { + yield queue.shift() + } + } + } finally { + manager.off(event, listener) + } } \ No newline at end of file diff --git a/services/oracle/src/providers/handlers.ts b/services/oracle/src/providers/handlers.ts index a558d0225..24ff14089 100644 --- a/services/oracle/src/providers/handlers.ts +++ b/services/oracle/src/providers/handlers.ts @@ -46,6 +46,8 @@ export async function initiateDepositHandler(input: HandlerInput) { const { cluster, requiredBalancePerValidator } = clusterDetails + console.log('Initiating deposit') + const initiateDeposit = await (manager.connect(signer) as CasimirManager & ethers.Contract).initiateDeposit( depositDataRoot, publicKey, @@ -58,6 +60,8 @@ export async function initiateDepositHandler(input: HandlerInput) { false ) await initiateDeposit.wait() + + console.log('Deposit initiated') } export async function initiatePoolReshareHandler(input: HandlerInput) { diff --git a/services/oracle/src/providers/iterables.ts b/services/oracle/src/providers/iterables.ts deleted file mode 100644 index c4e027eb9..000000000 --- a/services/oracle/src/providers/iterables.ts +++ /dev/null @@ -1,16 +0,0 @@ -export async function* mergeAsyncIterables(iterables: AsyncIterable[]) { - const promises = iterables.map(iterable => iterable[Symbol.asyncIterator]().next()) - - while (promises.length > 0) { - const { index, value } = await Promise.race( - promises.map((promise, index) => promise.then(value => ({ index, value }))) - ) - - if (!value.done) { - promises[index] = iterables[index][Symbol.asyncIterator]().next() - yield value.value - } else { - promises.splice(index, 1) - } - } -} \ No newline at end of file From dde81d71fc8c2564432f63960442067792227747 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Wed, 7 Jun 2023 14:50:46 -0400 Subject: [PATCH 61/78] Add operators test --- common/ssv/src/providers/clusters.ts | 2 +- common/uniswap/.gitignore | 2 + common/uniswap/package.json | 16 + common/uniswap/src/index.ts | 3 + .../src/interfaces/PriceInput.ts | 0 .../src/providers/price.ts} | 0 common/uniswap/tsconfig.json | 19 + contracts/ethereum/docs/index.md | 11 + contracts/ethereum/helpers/oracle.ts | 6 +- contracts/ethereum/scripts/multisig.ts | 17 - contracts/ethereum/src/v1/CasimirManager.sol | 31 +- contracts/ethereum/src/v1/CasimirMultisig.sol | 324 --------- contracts/ethereum/src/v1/CasimirRegistry.sol | 77 ++- contracts/ethereum/src/v1/CasimirViews.sol | 45 +- .../src/v1/interfaces/ICasimirManager.sol | 14 - .../src/v1/interfaces/ICasimirMultisig.sol | 107 --- .../src/v1/interfaces/ICasimirRegistry.sol | 13 +- .../src/v1/interfaces/ICasimirViews.sol | 25 + contracts/ethereum/test/fixtures/shared.ts | 60 +- contracts/ethereum/test/integration.ts | 18 +- contracts/ethereum/test/operators.ts | 104 ++- contracts/ethereum/test/users.ts | 14 +- package-lock.json | 651 ++---------------- scripts/ethereum/dev.ts | 7 + services/oracle/scripts/dev.ts | 1 + services/oracle/src/index.ts | 6 +- .../oracle/src/interfaces/HandlerInput.ts | 4 +- services/oracle/src/providers/config.ts | 10 +- services/oracle/src/providers/handlers.ts | 15 +- 29 files changed, 386 insertions(+), 1216 deletions(-) create mode 100644 common/uniswap/.gitignore create mode 100644 common/uniswap/package.json create mode 100644 common/uniswap/src/index.ts rename common/{ssv => uniswap}/src/interfaces/PriceInput.ts (100%) rename common/{ssv/src/providers/uniswap.ts => uniswap/src/providers/price.ts} (100%) create mode 100644 common/uniswap/tsconfig.json delete mode 100644 contracts/ethereum/scripts/multisig.ts delete mode 100644 contracts/ethereum/src/v1/CasimirMultisig.sol delete mode 100644 contracts/ethereum/src/v1/interfaces/ICasimirMultisig.sol diff --git a/common/ssv/src/providers/clusters.ts b/common/ssv/src/providers/clusters.ts index 85b986fe0..30517be3f 100644 --- a/common/ssv/src/providers/clusters.ts +++ b/common/ssv/src/providers/clusters.ts @@ -5,7 +5,7 @@ import ISSVNetworkViewsJson from '@casimir/ethereum/build/artifacts/scripts/reso import { ClusterDetailsInput } from '../interfaces/ClusterDetailsInput' import { ClusterDetails } from '../interfaces/ClusterDetails' import { Cluster } from '@casimir/types' -import { getPrice } from './uniswap' +import { getPrice } from '@casimir/uniswap' const networkAddress = '0xAfdb141Dd99b5a101065f40e3D7636262dce65b3' const networkViewsAddress = '0x8dB45282d7C4559fd093C26f677B3837a5598914' diff --git a/common/uniswap/.gitignore b/common/uniswap/.gitignore new file mode 100644 index 000000000..04c01ba7b --- /dev/null +++ b/common/uniswap/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ \ No newline at end of file diff --git a/common/uniswap/package.json b/common/uniswap/package.json new file mode 100644 index 000000000..781c65af0 --- /dev/null +++ b/common/uniswap/package.json @@ -0,0 +1,16 @@ +{ + "name": "@casimir/uniswap", + "private": "true", + "main": "src/index.ts", + "scripts": { + "build": "esbuild src/index.ts --bundle --minify --sourcemap --platform=node --target=esnext --outfile=dist/index.js", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "ethers": "^5.7.2" + }, + "devDependencies": { + "@types/node": "^17.0.38", + "esbuild": "^0.15.9" + } +} diff --git a/common/uniswap/src/index.ts b/common/uniswap/src/index.ts new file mode 100644 index 000000000..792aec49a --- /dev/null +++ b/common/uniswap/src/index.ts @@ -0,0 +1,3 @@ +import { getPrice } from './providers/price' + +export { getPrice } \ No newline at end of file diff --git a/common/ssv/src/interfaces/PriceInput.ts b/common/uniswap/src/interfaces/PriceInput.ts similarity index 100% rename from common/ssv/src/interfaces/PriceInput.ts rename to common/uniswap/src/interfaces/PriceInput.ts diff --git a/common/ssv/src/providers/uniswap.ts b/common/uniswap/src/providers/price.ts similarity index 100% rename from common/ssv/src/providers/uniswap.ts rename to common/uniswap/src/providers/price.ts diff --git a/common/uniswap/tsconfig.json b/common/uniswap/tsconfig.json new file mode 100644 index 000000000..28ff0291b --- /dev/null +++ b/common/uniswap/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "strict": true, + "preserveConstEnums": true, + "noEmit": true, + "sourceMap": false, + "module": "CommonJS", + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + "resolveJsonModule": true + }, + "include": [ + "./src/*" + ] + } \ No newline at end of file diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 6efa501e6..7ddb43e3b 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -1781,6 +1781,17 @@ struct Operator { } ``` +### OperatorDetails + +```solidity +struct OperatorDetails { + bool active; + bool resharing; + int256 collateral; + uint256 poolCount; +} +``` + ### registerOperator ```solidity diff --git a/contracts/ethereum/helpers/oracle.ts b/contracts/ethereum/helpers/oracle.ts index af33924ed..45ea2cf29 100644 --- a/contracts/ethereum/helpers/oracle.ts +++ b/contracts/ethereum/helpers/oracle.ts @@ -1,6 +1,6 @@ import { ethers } from 'hardhat' import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import { CasimirManager } from '../build/artifacts/types' +import { CasimirManager, CasimirViews } from '../build/artifacts/types' import { validatorStore } from '@casimir/data' import { Validator } from '@casimir/types' import { getClusterDetails } from '@casimir/ssv' @@ -45,7 +45,7 @@ export async function initiateDepositHandler({ manager, signer }: { manager: Cas await initiateDeposit.wait() } -export async function reportCompletedExitsHandler({ manager, signer, args }: { manager: CasimirManager, signer: SignerWithAddress, args: Record }) { +export async function reportCompletedExitsHandler({ manager, views, signer, args }: { manager: CasimirManager, views: CasimirViews, signer: SignerWithAddress, args: Record }) { const { count } = args // In production, we get the withdrawn exit order from the Beacon API (sorting by withdrawal epoch) @@ -55,7 +55,7 @@ export async function reportCompletedExitsHandler({ manager, signer, args }: { m const stakedPoolIds = await manager.getStakedPoolIds() while (remaining > 0) { const poolId = stakedPoolIds[poolIndex] - const poolDetails = await manager.getPoolDetails(poolId) + const poolDetails = await views.getPoolDetails(poolId) if (poolDetails.status === 2 || poolDetails.status === 3) { remaining-- const operatorIds = poolDetails.operatorIds.map((operatorId) => operatorId.toNumber()) diff --git a/contracts/ethereum/scripts/multisig.ts b/contracts/ethereum/scripts/multisig.ts deleted file mode 100644 index b663ef3ab..000000000 --- a/contracts/ethereum/scripts/multisig.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { ethers } from 'hardhat' - -void async function () { - const multisigArgs = { - owners: [ - process.env.OWNER_1_ADDRESS, - process.env.OWNER_2_ADDRESS, - process.env.OWNER_3_ADDRESS, - process.env.OWNER_4_ADDRESS, - process.env.OWNER_5_ADDRESS - ] - } - const multisigFactory = await ethers.getContractFactory('CasimirMultisig') - const multisig = await multisigFactory.deploy(...Object.values(multisigArgs)) - await multisig.deployed() - console.log(`CasimirMultisig contract deployed to ${multisig.address}`) -}() \ No newline at end of file diff --git a/contracts/ethereum/src/v1/CasimirManager.sol b/contracts/ethereum/src/v1/CasimirManager.sol index 981e5aecf..6d07277b6 100644 --- a/contracts/ethereum/src/v1/CasimirManager.sol +++ b/contracts/ethereum/src/v1/CasimirManager.sol @@ -104,9 +104,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Latest active balance */ uint256 public latestActiveBalance; /** Latest active balance after fees */ - uint256 public latestActiveBalanceAfterFees; + uint256 private latestActiveBalanceAfterFees; /** Latest active rewards */ - int256 public latestActiveRewardBalance; + int256 private latestActiveRewardBalance; /** Exited pool count */ uint256 public finalizableCompletedExits; /** Exited balance */ @@ -118,7 +118,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Sum of scaled rewards to balance ratios (intial value required) */ uint256 private stakeRatioSum = 1000 ether; /** Total pending withdrawals count */ - uint256 public requestedWithdrawals; + uint256 private requestedWithdrawals; /** Total pending withdrawal amount */ uint256 public requestedWithdrawalBalance; /** Pending withdrawals */ @@ -130,7 +130,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** Pool recovered balances */ mapping(uint32 => uint256) private recoveredBalances; /** Total deposits not yet in pools */ - uint256 public prepoolBalance; + uint256 private prepoolBalance; /** Total exited deposits */ uint256 private exitedBalance; /** Total reserved fees */ @@ -142,7 +142,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** IDs of pools staked */ uint32[] private stakedPoolIds; /** Exiting pool count */ - uint256 public requestedExits; + uint256 private requestedExits; /** Slashed pool count */ uint256 private forcedExits; @@ -1187,27 +1187,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { return poolAddresses[poolId]; } - /** - * @notice Get a pool's details by ID - * @param poolId The pool ID - * @return poolDetails The pool details - */ - function getPoolDetails( - uint32 poolId - ) external view returns (PoolDetails memory poolDetails) { - if (poolAddresses[poolId] != address(0)) { - ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); - ICasimirPool.PoolConfig memory poolConfig = pool.getConfig(); - poolDetails = PoolDetails({ - id: poolId, - balance: pool.getBalance(), - publicKey: poolConfig.publicKey, - operatorIds: poolConfig.operatorIds, - status: poolConfig.status - }); - } - } - /** * @notice Get the registry address * @return registryAddress The registry address diff --git a/contracts/ethereum/src/v1/CasimirMultisig.sol b/contracts/ethereum/src/v1/CasimirMultisig.sol deleted file mode 100644 index a227bd0f9..000000000 --- a/contracts/ethereum/src/v1/CasimirMultisig.sol +++ /dev/null @@ -1,324 +0,0 @@ -// SPDX-License-Identifier: Apache -pragma solidity 0.8.18; - -import './interfaces/ICasimirMultisig.sol'; - -contract CasimirMultisig is ICasimirMultisig { - address[] public owners; - mapping(address => bool) public isOwner; - uint public confirmationsRequired; - - mapping(uint => mapping(address => bool)) public isOwnerChangeConfirmed; - mapping(uint => mapping(address => bool)) public isTransactionConfirmed; - - OwnerChange[] public ownerChanges; - Transaction[] public transactions; - - modifier onlyOwner() { - require(isOwner[msg.sender], "Not owner"); - _; - } - - modifier ownerChangeExists(uint256 changeId) { - require(changeId < ownerChanges.length, "Owner change does not exist"); - _; - } - - modifier ownerChangeNotExecuted(uint256 changeId) { - require( - !ownerChanges[changeId].executed, - "Owner change already executed" - ); - _; - } - - modifier ownerChangeNotConfirmed(uint256 changeId) { - require( - !isOwnerChangeConfirmed[changeId][msg.sender], - "Owner change already confirmed" - ); - _; - } - - modifier transactionExists(uint transactionIndex) { - require( - transactionIndex < transactions.length, - "Transaction does not exist" - ); - _; - } - - modifier transactionNotExecuted(uint transactionIndex) { - require( - !transactions[transactionIndex].executed, - "Transaction already executed" - ); - _; - } - - modifier transactionNotConfirmed(uint transactionIndex) { - require( - !isTransactionConfirmed[transactionIndex][msg.sender], - "Transaction already confirmed" - ); - _; - } - - constructor(address[] memory _owners) { - require(_owners.length > 0, "Owners required"); - - for (uint256 i = 0; i < _owners.length; i++) { - address owner = _owners[i]; - - require(owner != address(0), "Invalid owner"); - require(!isOwner[owner], "Owner not unique"); - - isOwner[owner] = true; - owners.push(owner); - } - - adjustConfirmationsRequired(); - } - - receive() external payable { - emit Deposit(msg.sender, msg.value, address(this).balance); - } - - function submitOwnerChange(address owner, bool add) public onlyOwner { - uint256 changeId = ownerChanges.length; - - ownerChanges.push( - OwnerChange({ - owner: owner, - add: add, - executed: false, - confirmations: 0 - }) - ); - - emit SubmitOwnerChange(msg.sender, changeId, add); - } - - function confirmOwnerChange( - uint256 changeId - ) - public - onlyOwner - ownerChangeExists(changeId) - ownerChangeNotExecuted(changeId) - ownerChangeNotConfirmed(changeId) - { - OwnerChange storage ownerChange = ownerChanges[changeId]; - ownerChange.confirmations += 1; - isOwnerChangeConfirmed[changeId][msg.sender] = true; - - emit ConfirmOwnerChange(msg.sender, changeId); - } - - function executeOwnerChange( - uint256 changeId - ) - public - onlyOwner - ownerChangeNotExecuted(changeId) - ownerChangeNotConfirmed(changeId) - { - OwnerChange storage ownerChange = ownerChanges[changeId]; - - require( - ownerChange.confirmations >= confirmationsRequired, - "Cannot execute owner change" - ); - - ownerChange.executed = true; - - if (ownerChange.add) { - isOwner[ownerChange.owner] = true; - owners.push(ownerChange.owner); - } else { - isOwner[ownerChange.owner] = false; - - for (uint256 i = 0; i < owners.length - 1; i++) { - if (owners[i] == ownerChange.owner) { - owners[i] = owners[owners.length - 1]; - break; - } - } - owners.pop(); - } - - adjustConfirmationsRequired(); - - emit ExecuteOwnerChange(msg.sender, changeId); - } - - function revokeOwnerChangeConfirmation( - uint256 changeId - ) - public - onlyOwner - ownerChangeExists(changeId) - ownerChangeNotExecuted(changeId) - { - OwnerChange storage ownerChange = ownerChanges[changeId]; - - require( - isOwnerChangeConfirmed[changeId][msg.sender], - "Owner change not confirmed" - ); - - ownerChange.confirmations -= 1; - isOwnerChangeConfirmed[changeId][msg.sender] = false; - - emit RevokeOwnerChangeConfirmation(msg.sender, changeId); - } - - function submitTransaction( - address to, - uint256 value, - bytes memory data - ) public onlyOwner returns (uint256 transactionIndex) { - transactionIndex = transactions.length; - - transactions.push( - Transaction({ - to: to, - value: value, - data: data, - executed: false, - confirmations: 0 - }) - ); - - emit SubmitTransaction(msg.sender, transactionIndex, to, value, data); - } - - function confirmTransaction( - uint256 transactionIndex - ) - public - onlyOwner - transactionExists(transactionIndex) - transactionNotExecuted(transactionIndex) - transactionNotConfirmed(transactionIndex) - { - Transaction storage transaction = transactions[transactionIndex]; - transaction.confirmations += 1; - isTransactionConfirmed[transactionIndex][msg.sender] = true; - - emit ConfirmTransaction(msg.sender, transactionIndex); - } - - function executeTransaction( - uint256 transactionIndex - ) - public - onlyOwner - transactionExists(transactionIndex) - transactionNotExecuted(transactionIndex) - { - Transaction storage transaction = transactions[transactionIndex]; - - require( - transaction.confirmations >= confirmationsRequired, - "Cannot execute Transaction" - ); - - transaction.executed = true; - - (bool success, ) = transaction.to.call{value: transaction.value}( - transaction.data - ); - require(success, "Transaction failed"); - - emit ExecuteTransaction(msg.sender, transactionIndex); - } - - function revokeTransactionConfirmation( - uint256 transactionIndex - ) - public - onlyOwner - transactionExists(transactionIndex) - transactionNotExecuted(transactionIndex) - { - Transaction storage transaction = transactions[transactionIndex]; - - require( - isTransactionConfirmed[transactionIndex][msg.sender], - "Transaction not confirmed" - ); - - transaction.confirmations -= 1; - isTransactionConfirmed[transactionIndex][msg.sender] = false; - - emit RevokeTransactionConfirmation(msg.sender, transactionIndex); - } - - function adjustConfirmationsRequired() internal { - uint ownerCount = owners.length; - if (ownerCount == 1 || ownerCount == 2) { - confirmationsRequired = 1; - } else if (ownerCount == 3) { - confirmationsRequired = 2; - } else { - confirmationsRequired = (ownerCount * 2) / 3; - } - } - - function getOwners() public view returns (address[] memory) { - return owners; - } - - function getOwnerChangeCount() public view returns (uint256) { - return ownerChanges.length; - } - - function getOwnerChange( - uint256 changeId - ) - public - view - returns ( - address owner, - bool add, - bool executed, - uint256 confirmations - ) - { - OwnerChange storage ownerChange = ownerChanges[changeId]; - return ( - ownerChange.owner, - ownerChange.add, - ownerChange.executed, - ownerChange.confirmations - ); - } - - function getTransactionCount() public view returns (uint256) { - return transactions.length; - } - - function getTransaction( - uint256 transactionIndex - ) - public - view - returns ( - address to, - uint256 value, - bytes memory data, - bool executed, - uint256 confirmations - ) - { - Transaction storage transaction = transactions[transactionIndex]; - return ( - transaction.to, - transaction.value, - transaction.data, - transaction.executed, - transaction.confirmations - ); - } -} \ No newline at end of file diff --git a/contracts/ethereum/src/v1/CasimirRegistry.sol b/contracts/ethereum/src/v1/CasimirRegistry.sol index 9008f56ca..97bf92ab7 100644 --- a/contracts/ethereum/src/v1/CasimirRegistry.sol +++ b/contracts/ethereum/src/v1/CasimirRegistry.sol @@ -7,7 +7,8 @@ import './libraries/Types.sol'; import './vendor/interfaces/ISSVNetworkViews.sol'; import "@openzeppelin/contracts/access/Ownable.sol"; -// Todo efficiently reshare or exit pools when deregistering +// Dev-only imports +import "hardhat/console.sol"; contract CasimirRegistry is ICasimirRegistry, Ownable { using TypesAddress for address; @@ -17,6 +18,7 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { uint256 private requiredCollateral = 4 ether; uint256 private minimumCollateralDeposit = 100000000000000000; mapping(uint64 => Operator) private operators; + mapping(uint64 => mapping (uint32 => bool)) private operatorPools; uint64[] private operatorIds; /*************/ @@ -57,7 +59,9 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { "Only operator owner can register" ); + operatorIds.push(operatorId); Operator storage operator = operators[operatorId]; + operator.id = operatorId; operator.active = true; operator.collateral = int256(msg.value); @@ -90,7 +94,7 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { } /** - * @notice Withdraw collateral for an operator + * @notice Withdraw collateral from an operator * @param operatorId The operator ID * @param amount The amount to withdraw */ @@ -102,15 +106,39 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { "Not operator owner" ); require( - !operator.active && !operator.resharing || + !operator.active && + !operator.resharing && + operator.collateral >= int256(amount) || operator.collateral >= int256(requiredCollateral), - "Active or resharing" + "Not allowed to withdraw amount" ); operator.collateral -= int256(amount); operatorOwner.send(amount); } + /** + * @notice Request deregistration for an operator + * @param operatorId The operator ID + */ + function requestDeregistration(uint64 operatorId) external { + Operator storage operator = operators[operatorId]; + (address operatorOwner, , , , ) = ssvNetworkViews.getOperatorById(operatorId); + require( + msg.sender == operatorOwner, + "Not operator owner" + ); + require(operator.active, "Operator is not active"); + require(!operator.resharing, "Operator is resharing"); + + if (operator.poolCount == 0) { + operator.active = false; + } else { + operator.resharing = true; + manager.requestReshares(operatorId); + } + } + /** * @notice Add a pool to an operator * @param operatorId The operator ID @@ -124,8 +152,8 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { require(operator.active, "Operator not active"); require(!operator.resharing, "Operator resharing"); require(operator.collateral >= 0, "Operator owes collateral"); - require(!operator.pools[poolId], "Pool already active"); - operator.pools[poolId] = true; + require(!operatorPools[operatorId][poolId], "Pool already active"); + operatorPools[operatorId][poolId] = true; operator.poolCount += 1; } @@ -141,9 +169,9 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { uint256 blameAmount ) external onlyOwnerOrPool(poolId) { Operator storage operator = operators[operatorId]; - require(operator.pools[poolId], "Pool is not active for operator"); + require(operatorPools[operatorId][poolId], "Pool is not active for operator"); - operator.pools[poolId] = false; + operatorPools[operatorId][poolId] = false; operator.poolCount -= 1; if (operator.poolCount == 0 && operator.resharing) { @@ -170,37 +198,14 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { } /** - * @notice Request deregistration for an operator - * @param operatorId The operator ID - */ - function requestDeregistration(uint64 operatorId) external onlyOwner { - Operator storage operator = operators[operatorId]; - require(operator.active, "Operator is not active"); - require(!operator.resharing, "Operator is resharing"); - operator.resharing = true; - manager.requestReshares(operatorId); - } - - /** - * @notice Get the collateral of an operator - * @param operatorId The operator ID - * @return collateral The collateral - */ - function getOperatorCollateral( - uint64 operatorId - ) external view returns (int256 collateral) { - return operators[operatorId].collateral; - } - - /** - * @notice Get the eligibility of an operator + * @notice Get an operator by ID * @param operatorId The operator ID - * @return eligibility The eligibility + * @return operator The operator */ - function getOperatorEligibility( + function getOperator( uint64 operatorId - ) external view returns (bool eligibility) { - return operators[operatorId].active && !operators[operatorId].resharing; + ) external view returns (Operator memory operator) { + return operators[operatorId]; } /** diff --git a/contracts/ethereum/src/v1/CasimirViews.sol b/contracts/ethereum/src/v1/CasimirViews.sol index 71a7071c6..13c4f3c06 100644 --- a/contracts/ethereum/src/v1/CasimirViews.sol +++ b/contracts/ethereum/src/v1/CasimirViews.sol @@ -5,6 +5,9 @@ import './interfaces/ICasimirViews.sol'; import './interfaces/ICasimirManager.sol'; import './interfaces/ICasimirRegistry.sol'; +// Dev-only imports +import "hardhat/console.sol"; + contract CasimirViews is ICasimirViews { /*************/ /* Constants */ @@ -40,7 +43,7 @@ contract CasimirViews is ICasimirViews { ) external view returns (uint32[5] memory poolIds) { uint32[] memory stakedPoolIds = manager.getStakedPoolIds(); uint256 count = 0; - for (uint256 i = startIndex; i <= endIndex; i++) { + for (uint256 i = startIndex; i < endIndex; i++) { uint32 poolId = stakedPoolIds[i]; ICasimirPool pool = ICasimirPool(manager.getPoolAddress(poolId)); if (pool.getBalance() >= compoundMinimum) { @@ -54,23 +57,45 @@ contract CasimirViews is ICasimirViews { } /** - * @notice Get the active operator IDs + * @notice Get operators * @param startIndex The start index * @param endIndex The end index - * @return activeOperatorIds The active operator IDs + * @return operators The operators */ - function getEligibleOperatorIds( + function getOperators( uint256 startIndex, uint256 endIndex - ) external view returns (uint64[] memory activeOperatorIds) { + ) external view returns (ICasimirRegistry.Operator[] memory) { + ICasimirRegistry.Operator[] memory operators = new ICasimirRegistry.Operator[](endIndex - startIndex); uint64[] memory operatorIds = registry.getOperatorIds(); uint256 count = 0; - for (uint256 i = startIndex; i <= endIndex; i++) { + for (uint256 i = startIndex; i < endIndex; i++) { uint64 operatorId = operatorIds[i]; - if (registry.getOperatorCollateral(operatorId) > 0 && registry.getOperatorEligibility(operatorId)) { - activeOperatorIds[count] = operatorId; - count++; - } + operators[count] = registry.getOperator(operatorId); + count++; + } + return operators; + } + + /** + * @notice Get a pool's details by ID + * @param poolId The pool ID + * @return poolDetails The pool details + */ + function getPoolDetails( + uint32 poolId + ) external view returns (PoolDetails memory poolDetails) { + address poolAddress = manager.getPoolAddress(poolId); + if (poolAddress != address(0)) { + ICasimirPool pool = ICasimirPool(poolAddress); + ICasimirPool.PoolConfig memory poolConfig = pool.getConfig(); + poolDetails = PoolDetails({ + id: poolId, + balance: pool.getBalance(), + publicKey: poolConfig.publicKey, + operatorIds: poolConfig.operatorIds, + status: poolConfig.status + }); } } diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol index 6c3ee7744..4dbf0a122 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol @@ -19,14 +19,6 @@ interface ICasimirManager { /* Structs */ /***********/ - struct PoolDetails { - uint32 id; - uint256 balance; - bytes publicKey; - uint64[] operatorIds; - ICasimirPool.PoolStatus status; - } - struct User { uint256 stake0; uint256 stakeRatioSum0; @@ -133,15 +125,10 @@ interface ICasimirManager { function upkeepId() external view returns (uint256); function latestActiveBalance() external view returns (uint256); - function latestActiveBalanceAfterFees() external view returns (uint256); - function latestActiveRewardBalance() external view returns (int256); function feePercent() external view returns (uint32); - function requestedExits() external view returns (uint256); - function requestedWithdrawals() external view returns (uint256); function requestedWithdrawalBalance() external view returns (uint256); function finalizableCompletedExits() external view returns (uint256); function reportPeriod() external view returns (uint32); - function prepoolBalance() external view returns (uint256); /***********/ /* Getters */ @@ -157,7 +144,6 @@ interface ICasimirManager { function getWithdrawableBalance() external view returns (uint256); function getUserStake(address userAddress) external view returns (uint256); function getPoolAddress(uint32 poolId) external view returns (address); - function getPoolDetails(uint32 poolId) external view returns (PoolDetails memory); function getRegistryAddress() external view returns (address); function getUpkeepAddress() external view returns (address); function getUpkeepBalance() external view returns (uint256 upkeepBalance); diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirMultisig.sol b/contracts/ethereum/src/v1/interfaces/ICasimirMultisig.sol deleted file mode 100644 index 5804c3f14..000000000 --- a/contracts/ethereum/src/v1/interfaces/ICasimirMultisig.sol +++ /dev/null @@ -1,107 +0,0 @@ -// SPDX-License-Identifier: Apache -pragma solidity 0.8.18; - -interface ICasimirMultisig { - event Deposit(address indexed sender, uint amount, uint balance); - event SubmitOwnerChange( - address indexed owner, - uint256 changeId, - bool add - ); - event ConfirmOwnerChange(address indexed owner, uint256 changeId); - event RevokeOwnerChangeConfirmation(address indexed owner, uint256 changeId); - event ExecuteOwnerChange(address indexed owner, uint256 changeId); - event SubmitTransaction( - address indexed owner, - uint indexed txIndex, - address indexed to, - uint value, - bytes data - ); - event ConfirmTransaction(address indexed owner, uint indexed txIndex); - event RevokeTransactionConfirmation(address indexed owner, uint indexed txIndex); - event ExecuteTransaction(address indexed owner, uint indexed txIndex); - - struct OwnerChange { - address owner; - bool add; - bool executed; - uint confirmations; - } - - struct Transaction { - address to; - uint value; - bytes data; - bool executed; - uint confirmations; - } - - receive() external payable; - - function submitOwnerChange( - address owner, - bool add - ) external; - - function confirmOwnerChange( - uint256 changeId - ) external; - - function executeOwnerChange( - uint256 changeId - ) external; - - function revokeOwnerChangeConfirmation( - uint256 changeId - ) external; - - function submitTransaction( - address to, - uint value, - bytes memory data - ) external returns (uint256 transactionIndex); - - function confirmTransaction( - uint256 transactionIndex - ) external; - - function executeTransaction( - uint256 transactionIndex - ) external; - - function revokeTransactionConfirmation( - uint256 transactionIndex - ) external; - - function getOwners() external view returns (address[] memory); - - function getOwnerChangeCount() external view returns (uint256); - - function getOwnerChange( - uint256 changeId - ) - external - view - returns ( - address owner, - bool add, - bool executed, - uint256 confirmations - ); - - function getTransactionCount() external view returns (uint256); - - function getTransaction( - uint256 transactionIndex - ) - external - view - returns ( - address to, - uint256 value, - bytes memory data, - bool executed, - uint256 confirmations - ); -} \ No newline at end of file diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirRegistry.sol b/contracts/ethereum/src/v1/interfaces/ICasimirRegistry.sol index 734a5abf7..bed519ed2 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirRegistry.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirRegistry.sol @@ -9,14 +9,7 @@ interface ICasimirRegistry { event DeregistrationCompleted(uint64 operatorId); struct Operator { - bool active; - bool resharing; - int256 collateral; - uint256 poolCount; - mapping(uint32 => bool active) pools; - } - - struct OperatorDetails { + uint64 id; bool active; bool resharing; int256 collateral; @@ -26,9 +19,9 @@ interface ICasimirRegistry { function registerOperator(uint64 operatorId) external payable; function depositCollateral(uint64 operatorId) external payable; function withdrawCollateral(uint64 operatorId, uint256 amount) external; + function requestDeregistration(uint64 operatorId) external; function addOperatorPool(uint64 operatorId, uint32 poolId) external; function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external; - function getOperatorCollateral(uint64 operatorId) external view returns (int256); - function getOperatorEligibility(uint64 operatorId) external view returns (bool eligibility); + function getOperator(uint64 operatorId) external view returns (Operator memory); function getOperatorIds() external view returns (uint64[] memory); } \ No newline at end of file diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirViews.sol b/contracts/ethereum/src/v1/interfaces/ICasimirViews.sol index cdc90e9e5..01424e3fe 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirViews.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirViews.sol @@ -1,11 +1,36 @@ // SPDX-License-Identifier: Apache pragma solidity 0.8.18; +import './ICasimirRegistry.sol'; + interface ICasimirViews { + /***********/ + /* Structs */ + /***********/ + + struct PoolDetails { + uint32 id; + uint256 balance; + bytes publicKey; + uint64[] operatorIds; + ICasimirPool.PoolStatus status; + } + + /***********/ + /* Getters */ + /***********/ + function getCompoundablePoolIds( uint256 startIndex, uint256 endIndex ) external view returns (uint32[5] memory); + function getOperators( + uint256 startIndex, + uint256 endIndex + ) external view returns (ICasimirRegistry.Operator[] memory); + function getPoolDetails( + uint32 poolId + ) external view returns (PoolDetails memory); function getSweptBalance( uint256 startIndex, uint256 endIndex diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 3af259166..03cc39fa5 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -61,24 +61,24 @@ export async function deploymentFixture() { await result.wait() } - return { manager, registry, upkeep, views, owner, keeper, oracle } + return { manager, registry, upkeep, views, ssvNetworkViews, owner, keeper, oracle } } /** Fixture to stake 16 for the first user */ export async function firstUserDepositFixture() { - const { manager, upkeep, owner, keeper, oracle } = await loadFixture(deploymentFixture) + const { manager, registry, upkeep, views, owner, keeper, oracle } = await loadFixture(deploymentFixture) const [, firstUser] = await ethers.getSigners() const depositAmount = round(16 * ((100 + await manager.feePercent()) / 100), 10) const deposit = await manager.connect(firstUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await deposit.wait() - return { manager, upkeep, owner, firstUser, keeper, oracle } + return { manager, registry, upkeep, views, owner, firstUser, keeper, oracle } } /** Fixture to stake 24 for the second user */ export async function secondUserDepositFixture() { - const { manager, upkeep, owner, firstUser, keeper, oracle } = await loadFixture(firstUserDepositFixture) + const { manager, registry, upkeep, views, owner, firstUser, keeper, oracle } = await loadFixture(firstUserDepositFixture) const [, , secondUser] = await ethers.getSigners() const depositAmount = round(24 * ((100 + await manager.feePercent()) / 100), 10) @@ -109,12 +109,12 @@ export async function secondUserDepositFixture() { await runUpkeep({ upkeep, keeper }) - return { manager, upkeep, owner, firstUser, secondUser, keeper, oracle, requestId } + return { manager, registry, upkeep, views, owner, firstUser, secondUser, keeper, oracle, requestId } } /** Fixture to report increase of 0.105 in total rewards before fees */ export async function rewardsPostSecondUserDepositFixture() { - const { manager, upkeep, owner, firstUser, secondUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(secondUserDepositFixture) + const { manager, registry, upkeep, views, owner, firstUser, secondUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(secondUserDepositFixture) await time.increase(time.duration.days(1)) @@ -138,12 +138,12 @@ export async function rewardsPostSecondUserDepositFixture() { await runUpkeep({ upkeep, keeper }) - return { manager, upkeep, owner, firstUser, secondUser, keeper, oracle, requestId } + return { manager, registry, upkeep, views, owner, firstUser, secondUser, keeper, oracle, requestId } } /** Fixture to sweep 0.105 to the manager */ export async function sweepPostSecondUserDepositFixture() { - const { manager, upkeep, owner, firstUser, secondUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(secondUserDepositFixture) + const { manager, registry, upkeep, views, owner, firstUser, secondUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(secondUserDepositFixture) const sweptRewards = 0.105 const stakedPoolIds = await manager.getStakedPoolIds() @@ -181,12 +181,12 @@ export async function sweepPostSecondUserDepositFixture() { await runUpkeep({ upkeep, keeper }) - return { manager, upkeep, owner, firstUser, secondUser, keeper, oracle, requestId } + return { manager, registry, upkeep, views, owner, firstUser, secondUser, keeper, oracle, requestId } } /** Fixture to stake 24 for the third user */ export async function thirdUserDepositFixture() { - const { manager, upkeep, owner, firstUser, secondUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(sweepPostSecondUserDepositFixture) + const { manager, registry, upkeep, views, owner, firstUser, secondUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(sweepPostSecondUserDepositFixture) const [, , , thirdUser] = await ethers.getSigners() const depositAmount = round(24 * ((100 + await manager.feePercent()) / 100), 10) @@ -217,12 +217,12 @@ export async function thirdUserDepositFixture() { await runUpkeep({ upkeep, keeper }) - return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId } + return { manager, registry, upkeep, views, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId } } /** Fixture to report increase of 0.21 in total rewards before fees */ export async function rewardsPostThirdUserDepositFixture() { - const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(thirdUserDepositFixture) + const { manager, registry, upkeep, views, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(thirdUserDepositFixture) await time.increase(time.duration.days(1)) @@ -246,12 +246,12 @@ export async function rewardsPostThirdUserDepositFixture() { await runUpkeep({ upkeep, keeper }) - return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId } + return { manager, registry, upkeep, views, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId } } /** Fixture to sweep 0.21 to the manager */ export async function sweepPostThirdUserDepositFixture() { - const { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(rewardsPostThirdUserDepositFixture) + const { manager, registry, upkeep, views, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(rewardsPostThirdUserDepositFixture) const sweptRewards = 0.21 const stakedPoolIds = await manager.getStakedPoolIds() @@ -289,14 +289,14 @@ export async function sweepPostThirdUserDepositFixture() { await runUpkeep({ upkeep, keeper }) - return { manager, upkeep, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId } + return { manager, registry, upkeep, views, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId } } /** Fixture to partial withdraw 0.3 to the first user */ export async function firstUserPartialWithdrawalFixture() { - const { manager, upkeep, firstUser, secondUser, thirdUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(sweepPostThirdUserDepositFixture) - const prepoolBalance = await manager.prepoolBalance() - const withdraw = await manager.connect(firstUser).requestWithdrawal(prepoolBalance) + const { manager, registry, upkeep, views, firstUser, secondUser, thirdUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(sweepPostThirdUserDepositFixture) + const withdrawableBalance = await manager.getWithdrawableBalance() + const withdraw = await manager.connect(firstUser).requestWithdrawal(withdrawableBalance) await withdraw.wait() await time.increase(time.duration.days(1)) @@ -321,12 +321,12 @@ export async function firstUserPartialWithdrawalFixture() { await runUpkeep({ upkeep, keeper }) - return { manager, upkeep, firstUser, secondUser, thirdUser, keeper, oracle, requestId } + return { manager, registry, upkeep, views, firstUser, secondUser, thirdUser, keeper, oracle, requestId } } /** Fixture to stake 72 for the fourth user */ export async function fourthUserDepositFixture() { - const { manager, upkeep, firstUser, secondUser, thirdUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(firstUserPartialWithdrawalFixture) + const { manager, registry, upkeep, views, firstUser, secondUser, thirdUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(firstUserPartialWithdrawalFixture) const [, , , , fourthUser] = await ethers.getSigners() const depositAmount = round(72 * ((100 + await manager.feePercent()) / 100), 10) @@ -360,12 +360,12 @@ export async function fourthUserDepositFixture() { await runUpkeep({ upkeep, keeper }) - return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } + return { manager, registry, upkeep, views, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } } /** Fixture to simulate a validator stake penalty that decreases the active balance */ export async function activeBalanceLossFixture() { - const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(fourthUserDepositFixture) + const { manager, registry, upkeep, views, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(fourthUserDepositFixture) await time.increase(time.duration.days(1)) @@ -391,12 +391,12 @@ export async function activeBalanceLossFixture() { await runUpkeep({ upkeep, keeper }) - return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } + return { manager, registry, upkeep, views, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } } /** Fixture to simulate a validator reward that brings the active balance back to expected */ export async function activeBalanceRecoveryFixture() { - const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(activeBalanceLossFixture) + const { manager, registry, upkeep, views, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(activeBalanceLossFixture) let nextActiveBalance = 127 let requestId = latestRequestId @@ -427,12 +427,12 @@ export async function activeBalanceRecoveryFixture() { nextActiveBalance += 1 } - return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } + return { manager, registry, upkeep, views, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } } /** Fixture to full withdraw ~24.07 */ export async function thirdUserFullWithdrawalFixture() { - const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(activeBalanceRecoveryFixture) + const { manager, registry, upkeep, views, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(activeBalanceRecoveryFixture) const thirdStake = await manager.getUserStake(thirdUser.address) const withdraw = await manager.connect(thirdUser).requestWithdrawal(thirdStake) @@ -467,16 +467,16 @@ export async function thirdUserFullWithdrawalFixture() { requestId }) - await reportCompletedExitsHandler({ manager, signer: oracle, args: { count: 1 } }) + await reportCompletedExitsHandler({ manager, views, signer: oracle, args: { count: 1 } }) await runUpkeep({ upkeep, keeper }) - return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } + return { manager, registry, upkeep, views, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } } /** Fixture to simulate rewards */ export async function simulationFixture() { - const { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(thirdUserFullWithdrawalFixture) + const { manager, registry, upkeep, views, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(thirdUserFullWithdrawalFixture) const rewardsPerValidator = 0.105 let nextActiveBalance = 96 @@ -548,5 +548,5 @@ export async function simulationFixture() { await runUpkeep({ upkeep, keeper }) - return { manager, upkeep, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } + return { manager, registry, upkeep, views, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } } \ No newline at end of file diff --git a/contracts/ethereum/test/integration.ts b/contracts/ethereum/test/integration.ts index fa7bcc4aa..4fd4c36ad 100644 --- a/contracts/ethereum/test/integration.ts +++ b/contracts/ethereum/test/integration.ts @@ -18,12 +18,12 @@ describe('Integration', async function () { }) it('Second user\'s 24.0 stake completes the first pool with 32.0', async function () { - const { manager } = await loadFixture(secondUserDepositFixture) + const { manager, views } = await loadFixture(secondUserDepositFixture) const stakedPoolIds = await manager.getStakedPoolIds() expect(stakedPoolIds.length).equal(1) const firstPoolId = stakedPoolIds[0] - const poolDetails = await manager.getPoolDetails(firstPoolId) + const poolDetails = await views.getPoolDetails(firstPoolId) expect(poolDetails.publicKey).not.equal('0x') expect(poolDetails.operatorIds.length).equal(4) }) @@ -61,12 +61,12 @@ describe('Integration', async function () { }) it('Third user\'s 24.0 stake completes the second pool with 32.0', async function () { - const { manager } = await loadFixture(thirdUserDepositFixture) + const { manager, views } = await loadFixture(thirdUserDepositFixture) const stakedPools = await manager.getStakedPoolIds() expect(stakedPools.length).equal(2) const secondPoolId = stakedPools[1] - const poolDetails = await manager.getPoolDetails(secondPoolId) + const poolDetails = await views.getPoolDetails(secondPoolId) expect(poolDetails.publicKey).not.equal('0x') expect(poolDetails.operatorIds.length).equal(4) }) @@ -118,17 +118,17 @@ describe('Integration', async function () { }) it('Fourth user\'s 72 stake completes the third and fourth pool with 72', async function () { - const { manager } = await loadFixture(fourthUserDepositFixture) + const { manager, views } = await loadFixture(fourthUserDepositFixture) const stakedPools = await manager.getStakedPoolIds() expect(stakedPools.length).equal(4) const thirdPoolId = stakedPools[2] - const thirdPoolDetails = await manager.getPoolDetails(thirdPoolId) + const thirdPoolDetails = await views.getPoolDetails(thirdPoolId) expect(thirdPoolDetails.publicKey).not.equal('0x') expect(thirdPoolDetails.operatorIds.length).equal(4) const fourthPoolId = stakedPools[3] - const fourthPoolDetails = await manager.getPoolDetails(fourthPoolId) + const fourthPoolDetails = await views.getPoolDetails(fourthPoolId) expect(fourthPoolDetails.publicKey).not.equal('0x') expect(fourthPoolDetails.operatorIds.length).equal(4) }) @@ -175,8 +175,8 @@ describe('Integration', async function () { console.log('👤 Second user stake', ethers.utils.formatEther(secondStake)) console.log('👤 Third user stake', ethers.utils.formatEther(thirdStake)) console.log('👤 Fourth user stake', ethers.utils.formatEther(fourthStake)) - const openDeposits = await manager.prepoolBalance() - console.log('📦 Open deposits', ethers.utils.formatEther(openDeposits)) + const bufferedBalance = await manager.getBufferedBalance() + console.log('📦 Buffered balance', ethers.utils.formatEther(bufferedBalance)) const dust = stake.sub(firstStake.add(secondStake).add(thirdStake).add(fourthStake)) if (dust !== ethers.utils.parseEther('0.0')) { console.log('🧹 Dust', ethers.utils.formatEther(dust)) diff --git a/contracts/ethereum/test/operators.ts b/contracts/ethereum/test/operators.ts index 3b8a51638..8a909082c 100644 --- a/contracts/ethereum/test/operators.ts +++ b/contracts/ethereum/test/operators.ts @@ -1,14 +1,104 @@ -import { ethers } from 'hardhat' -import { loadFixture, setBalance, time } from '@nomicfoundation/hardhat-network-helpers' +import { ethers, network } from 'hardhat' +import { loadFixture, setBalance } from '@nomicfoundation/hardhat-network-helpers' import { expect } from 'chai' import { deploymentFixture } from './fixtures/shared' +import { ICasimirRegistry } from '../build/artifacts/types' import { round } from '../helpers/math' -import { initiateDepositHandler, reportCompletedExitsHandler } from '../helpers/oracle' -import { fulfillReport, runUpkeep } from '../helpers/upkeep' +import { initiateDepositHandler } from '../helpers/oracle' describe('Operators', async function () { - it('Register operator 1, 2, 3, and 4', async function () { - const { manager } = await loadFixture(deploymentFixture) - console.log('Operators test') + it('Registration of operators 1 through 4 creates 4 eligible operators', async function () { + const { registry, views } = await loadFixture(deploymentFixture) + const operatorIds = await registry.getOperatorIds() + const startIndex = 0 + const endIndex = operatorIds.length + const operators = await views.getOperators(startIndex, endIndex) + expect(operators.length).equal(4) + expect(operators).to.satisfy((operators: ICasimirRegistry.OperatorStruct[]) => { + const expectedActive = operators.every(operator => operator.active === true) + const expectedCollateral = operators.every(operator => operator.collateral.toString() === ethers.utils.parseEther('4.0').toString()) + const expectedResharing = operators.every(operator => operator.resharing === false) + return expectedActive && expectedCollateral && expectedResharing + }) + }) + + it('First initiated deposit uses 4 eligible operators', async function () { + const { manager, registry, views, oracle } = await loadFixture(deploymentFixture) + const [, user] = await ethers.getSigners() + + const depositAmount = round(32 * ((100 + await manager.feePercent()) / 100), 10) + const deposit = await manager.connect(user).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) + await deposit.wait() + + await initiateDepositHandler({ manager, signer: oracle }) + + const operatorIds = await registry.getOperatorIds() + const startIndex = 0 + const endIndex = operatorIds.length + const operators = await views.getOperators(startIndex, endIndex) + + expect(operators).to.satisfy((operators: ICasimirRegistry.OperatorStruct[]) => { + const operatorsWithPools = operators.filter(operator => Number(operator.poolCount.toString()) === 1) + return operatorsWithPools.length === 4 + }) + }) + + it('Operator deregistration with 1 pool emits 1 reshare request', async function () { + const { manager, registry, ssvNetworkViews, oracle } = await loadFixture(deploymentFixture) + const [, user] = await ethers.getSigners() + + const depositAmount = round(32 * ((100 + await manager.feePercent()) / 100), 10) + const deposit = await manager.connect(user).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) + await deposit.wait() + + await initiateDepositHandler({ manager, signer: oracle }) + + const operatorIds = await registry.getOperatorIds() + const deregisteringOperatorId = operatorIds[0] + const operatorOwnerAddress = (await ssvNetworkViews.getOperatorById(deregisteringOperatorId)).owner + const operatorOwnerSigner = ethers.provider.getSigner(operatorOwnerAddress) + await network.provider.request({ + method: 'hardhat_impersonateAccount', + params: [operatorOwnerAddress] + }) + const requestDeregistration = await registry.connect(operatorOwnerSigner).requestDeregistration(deregisteringOperatorId) + await requestDeregistration.wait() + const deregisteringOperator = await registry.getOperator(deregisteringOperatorId) + const resharesRequestedEvents = await manager.queryFilter(manager.filters.ResharesRequested(), -1) + const resharesRequestedEvent = resharesRequestedEvents[0] + + expect(deregisteringOperator.resharing).equal(true) + expect(resharesRequestedEvents.length).equal(1) + expect(resharesRequestedEvent.args?.operatorId.toNumber()).equal(deregisteringOperatorId.toNumber()) + }) + + it('Operator deregistration with 0 pools allows immediate collateral withdrawal', async function () { + const { manager, registry, ssvNetworkViews } = await loadFixture(deploymentFixture) + + const operatorIds = await registry.getOperatorIds() + const deregisteringOperatorId = operatorIds[0] + const [ operatorOwnerAddress ] = await ssvNetworkViews.getOperatorById(deregisteringOperatorId) + const operatorOwnerSigner = ethers.provider.getSigner(operatorOwnerAddress) + await network.provider.request({ + method: 'hardhat_impersonateAccount', + params: [operatorOwnerAddress] + }) + const requestDeregistration = await registry.connect(operatorOwnerSigner).requestDeregistration(deregisteringOperatorId) + await requestDeregistration.wait() + const deregisteringOperator = await registry.getOperator(deregisteringOperatorId) + const resharesRequestedEvents = await manager.queryFilter(manager.filters.ResharesRequested(), -1) + + expect(deregisteringOperator.active).equal(false) + expect(deregisteringOperator.resharing).equal(false) + expect(resharesRequestedEvents.length).equal(0) + + const operatorOwnerBalanceBefore = await ethers.provider.getBalance(operatorOwnerAddress) + const withdrawCollateral = await registry.connect(operatorOwnerSigner).withdrawCollateral(deregisteringOperatorId, ethers.utils.parseEther('4')) + await withdrawCollateral.wait() + const operatorOwnerBalanceAfter = await ethers.provider.getBalance(operatorOwnerAddress) + const deregisteredOperator = await registry.getOperator(deregisteringOperatorId) + + expect(deregisteredOperator.collateral.toString()).equal('0') + expect(ethers.utils.formatEther(operatorOwnerBalanceAfter.sub(operatorOwnerBalanceBefore).toString())).contains('3.9') }) }) \ No newline at end of file diff --git a/contracts/ethereum/test/users.ts b/contracts/ethereum/test/users.ts index 66154112d..5762dab7d 100644 --- a/contracts/ethereum/test/users.ts +++ b/contracts/ethereum/test/users.ts @@ -7,7 +7,7 @@ import { initiateDepositHandler, reportCompletedExitsHandler } from '../helpers/ import { fulfillReport, runUpkeep } from '../helpers/upkeep' describe('Users', async function () { - it('User small stake and half withdrawal updates total and user stake, and user balance', async function () { + it('User 16.0 stake and half withdrawal updates total and user stake, and user balance', async function () { const { manager } = await loadFixture(deploymentFixture) const [, user] = await ethers.getSigners() @@ -31,11 +31,11 @@ describe('Users', async function () { expect(ethers.utils.formatEther(stake)).equal('8.0') expect(ethers.utils.formatEther(userStake)).equal('8.0') - expect(ethers.utils.formatEther(userBalanceAfter.sub(userBalanceBefore))).contains('7.999') // Todo get gas spent on withdrawal request + expect(ethers.utils.formatEther(userBalanceAfter.sub(userBalanceBefore))).contains('7.9') }) - it('User big stake and half withdrawal updates total and user stake (after balance report), and user balance (after exit report)', async function () { - const { manager, upkeep, keeper, oracle } = await loadFixture(deploymentFixture) + it('User 64.0 stake and half withdrawal updates total and user stake, and user balance', async function () { + const { manager, upkeep, views, keeper, oracle } = await loadFixture(deploymentFixture) const [, user] = await ethers.getSigners() const depositAmount = round(64 * ((100 + await manager.feePercent()) / 100), 10) @@ -46,6 +46,7 @@ describe('Users', async function () { await initiateDepositHandler({ manager, signer: oracle }) const pendingPoolIds = await manager.getPendingPoolIds() + expect(pendingPoolIds.length).equal(2) await time.increase(time.duration.days(1)) @@ -71,6 +72,7 @@ describe('Users', async function () { await runUpkeep({ upkeep, keeper }) const stakedPoolIds = await manager.getStakedPoolIds() + expect(stakedPoolIds.length).equal(2) let stake = await manager.getTotalStake() @@ -115,7 +117,7 @@ describe('Users', async function () { requestId }) - await reportCompletedExitsHandler({ manager, signer: oracle, args: { count: 1 } }) + await reportCompletedExitsHandler({ manager, views, signer: oracle, args: { count: 1 } }) const finalizableCompletedExits = await manager.finalizableCompletedExits() @@ -130,6 +132,6 @@ describe('Users', async function () { expect(ethers.utils.formatEther(stake)).equal('32.0') expect(ethers.utils.formatEther(userStake)).equal('32.0') - expect(ethers.utils.formatEther(userBalanceAfter.sub(userBalanceBefore))).contains('31.999') // Todo get gas spent on withdrawal request + expect(ethers.utils.formatEther(userBalanceAfter.sub(userBalanceBefore))).contains('31.9') }) }) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 908fc8d86..4b0ef3d4e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -285,6 +285,52 @@ "common/types": { "name": "@casimir/types" }, + "common/uniswap": { + "dependencies": { + "ethers": "^5.7.2" + }, + "devDependencies": { + "@types/node": "^17.0.38", + "esbuild": "^0.15.9" + } + }, + "common/uniswap/node_modules/esbuild": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, "common/wallets": { "name": "@casimir/wallets", "dependencies": { @@ -317,7 +363,6 @@ "@types/node": "^17.0.45", "chai": "^4.3.6", "esno": "^0.16.3", - "ganache": "^7.8.0", "hardhat": "^2.12.2", "localtunnel": "^2.0.2", "minimist": "^1.2.8", @@ -2100,6 +2145,10 @@ "resolved": "common/types", "link": true }, + "node_modules/@casimir/uniswap": { + "resolved": "common/uniswap", + "link": true + }, "node_modules/@casimir/users": { "resolved": "services/users", "link": true @@ -13322,606 +13371,6 @@ "fx": "index.js" } }, - "node_modules/ganache": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/ganache/-/ganache-7.8.0.tgz", - "integrity": "sha512-IrUYvsaE/m2/NaVIZ7D/gCnsmyU/buechnH6MhUipzG1qJcZIwIp/DoP/LZUcHyhy0Bv0NKZD2pGOjpRhn7l7A==", - "bundleDependencies": [ - "@trufflesuite/bigint-buffer", - "keccak", - "leveldown", - "secp256k1" - ], - "dev": true, - "hasShrinkwrap": true, - "dependencies": { - "@trufflesuite/bigint-buffer": "1.1.10", - "@trufflesuite/uws-js-unofficial": "20.10.0-unofficial.2", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "5.1.1", - "@types/seedrandom": "3.0.1", - "abstract-level": "1.0.3", - "abstract-leveldown": "7.2.0", - "async-eventemitter": "0.2.4", - "emittery": "0.10.0", - "keccak": "3.0.2", - "leveldown": "6.1.0", - "secp256k1": "4.0.3" - }, - "bin": { - "ganache": "dist/node/cli.js", - "ganache-cli": "dist/node/cli.js" - }, - "optionalDependencies": { - "bufferutil": "4.0.5", - "utf-8-validate": "5.0.7" - } - }, - "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz", - "integrity": "sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw==", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "node-gyp-build": "4.4.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/ganache/node_modules/@trufflesuite/bigint-buffer/node_modules/node-gyp-build": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", - "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/ganache/node_modules/@trufflesuite/uws-js-unofficial": { - "version": "20.10.0-unofficial.2", - "resolved": "https://registry.npmjs.org/@trufflesuite/uws-js-unofficial/-/uws-js-unofficial-20.10.0-unofficial.2.tgz", - "integrity": "sha512-oQQlnS3oNeGsgS4K3KCSSavJgSb0W9D5ktZs4FacX9VbM7b+NlhjH96d6/G4fMrz+bc5MXRyco419on0X0dvRA==", - "dev": true, - "dependencies": { - "ws": "8.2.3" - }, - "optionalDependencies": { - "bufferutil": "4.0.5", - "utf-8-validate": "5.0.7" - } - }, - "node_modules/ganache/node_modules/@types/bn.js": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.0.tgz", - "integrity": "sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ganache/node_modules/@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "dev": true - }, - "node_modules/ganache/node_modules/@types/node": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.0.tgz", - "integrity": "sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw==", - "dev": true - }, - "node_modules/ganache/node_modules/@types/seedrandom": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.1.tgz", - "integrity": "sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw==", - "dev": true - }, - "node_modules/ganache/node_modules/abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - } - }, - "node_modules/ganache/node_modules/abstract-level/node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "dev": true - }, - "node_modules/ganache/node_modules/abstract-leveldown": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz", - "integrity": "sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.0.0", - "is-buffer": "^2.0.5", - "level-concat-iterator": "^3.0.0", - "level-supports": "^2.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ganache/node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/ganache/node_modules/async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "dev": true, - "dependencies": { - "async": "^2.4.0" - } - }, - "node_modules/ganache/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" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/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" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/ganache/node_modules/bufferutil": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz", - "integrity": "sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - } - }, - "node_modules/ganache/node_modules/catering": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.0.tgz", - "integrity": "sha512-M5imwzQn6y+ODBfgi+cfgZv2hIUI6oYU/0f35Mdb1ujGeqeoI5tOnl9Q13DTH7LW+7er+NYq8stNOKZD/Z3U/A==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "queue-tick": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ganache/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==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/ganache/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==", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/emittery": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz", - "integrity": "sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ==", - "dev": true - }, - "node_modules/ganache/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==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/ganache/node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/ganache/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" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/ganache/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/ganache/node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "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" - } - ], - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ganache/node_modules/keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ganache/node_modules/level-concat-iterator": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz", - "integrity": "sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "catering": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ganache/node_modules/level-supports": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz", - "integrity": "sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA==", - "dev": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ganache/node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - } - }, - "node_modules/ganache/node_modules/leveldown": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/leveldown/-/leveldown-6.1.0.tgz", - "integrity": "sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w==", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "abstract-leveldown": "^7.2.0", - "napi-macros": "~2.0.0", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/ganache/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/ganache/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==", - "dev": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/ganache/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": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "dev": true - }, - "node_modules/ganache/node_modules/napi-macros": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/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==", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", - "dev": true, - "inBundle": true, - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/ganache/node_modules/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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/queue-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.0.tgz", - "integrity": "sha512-ULWhjjE8BmiICGn3G8+1L9wFpERNxkf8ysxkAer4+TFdRefDaXOCV5m92aMB9FtBVmn/8sETXLXY6BfW7hyaWQ==", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/ganache/node_modules/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==", - "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" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "dev": true, - "hasInstallScript": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ganache/node_modules/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==", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/ganache/node_modules/utf-8-validate": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz", - "integrity": "sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - } - }, - "node_modules/ganache/node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/ganache/node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "dev": true - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", diff --git a/scripts/ethereum/dev.ts b/scripts/ethereum/dev.ts index ed555009a..89a18f2c8 100644 --- a/scripts/ethereum/dev.ts +++ b/scripts/ethereum/dev.ts @@ -45,6 +45,13 @@ void async function () { const managerAddress = await getFutureContractAddress({ wallet, nonce, index: managerIndex }) process.env.PUBLIC_MANAGER_ADDRESS = `${managerAddress}` } + if (!process.env.PUBLIC_VIEWS_ADDRESS) { + const wallet = getWallet(seed) + const nonce = nonces[fork] + const viewsIndex = 2 // We deploy a mock oracle before the manager + const viewsAddress = await getFutureContractAddress({ wallet, nonce, index: viewsIndex }) + process.env.PUBLIC_VIEWS_ADDRESS = `${viewsAddress}` + } process.env.BIP39_SEED = seed echo(chalk.bgBlackBright('Your mnemonic seed is ') + chalk.bgBlue(seed)) diff --git a/services/oracle/scripts/dev.ts b/services/oracle/scripts/dev.ts index 10a6c9226..24543dd53 100644 --- a/services/oracle/scripts/dev.ts +++ b/services/oracle/scripts/dev.ts @@ -5,6 +5,7 @@ const resourcePath = 'scripts/resources/rockx-dkg-cli' void async function () { process.env.BIP39_PATH_INDEX = '6' process.env.MANAGER_ADDRESS = process.env.PUBLIC_MANAGER_ADDRESS + process.env.VIEWS_ADDRESS = process.env.PUBLIC_VIEWS_ADDRESS process.env.CLI_PATH = `./${resourcePath}/build/bin/rockx-dkg-cli` process.env.MESSENGER_SRV_ADDR = 'http://0.0.0.0:3000' process.env.USE_HARDCODED_OPERATORS = 'true' diff --git a/services/oracle/src/index.ts b/services/oracle/src/index.ts index a757d2846..5ecf5c9e5 100644 --- a/services/oracle/src/index.ts +++ b/services/oracle/src/index.ts @@ -15,13 +15,10 @@ const handlers = { CompletedExitReportsRequested: reportCompletedExitsHandler } -const { provider, signer, manager, cliPath, messengerUrl } = config() +const { provider, signer, manager, views, cliPath, messengerUrl } = config() ;(async function () { const eventsIterable = getEventsIterable({ manager, events: Object.keys(handlers) }) - - console.log('Listening for events', eventsIterable) - for await (const event of eventsIterable) { const details = event?.[event.length - 1] const { args } = details @@ -31,6 +28,7 @@ const { provider, signer, manager, cliPath, messengerUrl } = config() provider, signer, manager, + views, cliPath, messengerUrl, args diff --git a/services/oracle/src/interfaces/HandlerInput.ts b/services/oracle/src/interfaces/HandlerInput.ts index ca658db69..2b74bc627 100644 --- a/services/oracle/src/interfaces/HandlerInput.ts +++ b/services/oracle/src/interfaces/HandlerInput.ts @@ -1,5 +1,5 @@ import { ethers } from 'ethers' -import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' +import { CasimirManager, CasimirViews } from '@casimir/ethereum/build/artifacts/types' export interface HandlerInput { /** JSON RPC node provider */ @@ -8,6 +8,8 @@ export interface HandlerInput { signer: ethers.Signer /** Manager contract */ manager: CasimirManager & ethers.Contract + /** Views contract */ + views: CasimirViews & ethers.Contract /** DKG cli path */ cliPath: string /** DKG messenger service URL */ diff --git a/services/oracle/src/providers/config.ts b/services/oracle/src/providers/config.ts index 00db66649..58c40833c 100644 --- a/services/oracle/src/providers/config.ts +++ b/services/oracle/src/providers/config.ts @@ -1,6 +1,7 @@ import { ethers } from 'ethers' import CasimirManagerJson from '@casimir/ethereum/build/artifacts/src/v1/CasimirManager.sol/CasimirManager.json' -import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' +import CasimirViewsJson from '@casimir/ethereum/build/artifacts/src/v1/CasimirViews.sol/CasimirViews.json' +import { CasimirManager, CasimirViews } from '@casimir/ethereum/build/artifacts/types' export function config() { /** Get JSON RPC node provider */ @@ -20,6 +21,11 @@ export function config() { if (!managerAddress) throw new Error('No manager address provided') const manager = new ethers.Contract(managerAddress, CasimirManagerJson.abi, provider) as CasimirManager & ethers.Contract + /** Get views contract */ + const viewsAddress = process.env.VIEWS_ADDRESS + if (!viewsAddress) throw new Error('No views address provided') + const views = new ethers.Contract(viewsAddress, CasimirViewsJson.abi, provider) as CasimirViews & ethers.Contract + /** Get DKG CLI path */ const cliPath = process.env.CLI_PATH if (!cliPath) throw new Error('No cli path provided') @@ -28,5 +34,5 @@ export function config() { const messengerUrl = process.env.MESSENGER_SRV_ADDR if (!messengerUrl) throw new Error('No messenger url provided') - return { provider, signer, manager, cliPath, messengerUrl } + return { provider, signer, manager, views, cliPath, messengerUrl } } diff --git a/services/oracle/src/providers/handlers.ts b/services/oracle/src/providers/handlers.ts index 24ff14089..9f818220a 100644 --- a/services/oracle/src/providers/handlers.ts +++ b/services/oracle/src/providers/handlers.ts @@ -19,7 +19,7 @@ export async function initiateDepositHandler(input: HandlerInput) { nonce }) - const newOperatorIds = [1, 2, 3, 4] // Todo get new group here + const newOperatorIds = [5, 6, 7, 8] // Todo get new group here const dkg = new DKG({ cliPath, messengerUrl }) const validator = await dkg.createValidator({ @@ -46,8 +46,6 @@ export async function initiateDepositHandler(input: HandlerInput) { const { cluster, requiredBalancePerValidator } = clusterDetails - console.log('Initiating deposit') - const initiateDeposit = await (manager.connect(signer) as CasimirManager & ethers.Contract).initiateDeposit( depositDataRoot, publicKey, @@ -60,8 +58,6 @@ export async function initiateDepositHandler(input: HandlerInput) { false ) await initiateDeposit.wait() - - console.log('Deposit initiated') } export async function initiatePoolReshareHandler(input: HandlerInput) { @@ -69,6 +65,7 @@ export async function initiatePoolReshareHandler(input: HandlerInput) { provider, signer, manager, + views, cliPath, messengerUrl, args @@ -79,7 +76,7 @@ export async function initiatePoolReshareHandler(input: HandlerInput) { // Todo reshare event will include the operator to boot // Get pool to reshare - const poolDetails = await manager.getPoolDetails(poolId) + const poolDetails = await views.getPoolDetails(poolId) // Todo old operators and new operators only different by 1 operator const newOperatorGroup = [1, 2, 3, 4] @@ -105,6 +102,7 @@ export async function initiatePoolExitHandler(input: HandlerInput) { provider, signer, manager, + views, cliPath, messengerUrl, args @@ -113,7 +111,7 @@ export async function initiatePoolExitHandler(input: HandlerInput) { const { poolId } = args // Get pool to exit - const poolDetails = await manager.getPoolDetails(poolId) + const poolDetails = await views.getPoolDetails(poolId) // Get operators to sign exit const dkg = new DKG({ cliPath, messengerUrl }) @@ -126,6 +124,7 @@ export async function reportCompletedExitsHandler(input: HandlerInput) { provider, signer, manager, + views, args } = input @@ -138,7 +137,7 @@ export async function reportCompletedExitsHandler(input: HandlerInput) { const stakedPoolIds = await manager.getStakedPoolIds() while (remaining > 0) { const poolId = stakedPoolIds[poolIndex] - const poolDetails = await manager.getPoolDetails(poolId) + const poolDetails = await views.getPoolDetails(poolId) if (poolDetails.status === 2 || poolDetails.status === 3) { remaining-- const operatorIds = poolDetails.operatorIds.map((operatorId) => operatorId.toNumber()) From 202973920bf3a98b93b305284ace9e9d6afd180d Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Wed, 7 Jun 2023 14:59:44 -0400 Subject: [PATCH 62/78] Add views to get validator public keys --- contracts/ethereum/docs/index.md | 2524 ++--------------- contracts/ethereum/src/v1/CasimirViews.sol | 48 + .../src/v1/interfaces/ICasimirViews.sol | 8 + 3 files changed, 239 insertions(+), 2341 deletions(-) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 7ddb43e3b..b8ddefbf2 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -42,22 +42,6 @@ uint256 latestActiveBalance Latest active balance -### latestActiveBalanceAfterFees - -```solidity -uint256 latestActiveBalanceAfterFees -``` - -Latest active balance after fees - -### latestActiveRewardBalance - -```solidity -int256 latestActiveRewardBalance -``` - -Latest active rewards - ### finalizableCompletedExits ```solidity @@ -66,14 +50,6 @@ uint256 finalizableCompletedExits Exited pool count -### requestedWithdrawals - -```solidity -uint256 requestedWithdrawals -``` - -Total pending withdrawals count - ### requestedWithdrawalBalance ```solidity @@ -82,22 +58,6 @@ uint256 requestedWithdrawalBalance Total pending withdrawal amount -### prepoolBalance - -```solidity -uint256 prepoolBalance -``` - -Total deposits not yet in pools - -### requestedExits - -```solidity -uint256 requestedExits -``` - -Exiting pool count - ### onlyPool ```solidity @@ -734,26 +694,6 @@ Get a pool's address by ID | ---- | ---- | ----------- | | [0] | address | poolAddress The pool address | -### getPoolDetails - -```solidity -function getPoolDetails(uint32 poolId) external view returns (struct ICasimirManager.PoolDetails poolDetails) -``` - -Get a pool's details by ID - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolDetails | struct ICasimirManager.PoolDetails | The pool details | - ### getRegistryAddress ```solidity @@ -920,7 +860,7 @@ Deposit collateral for an operator function withdrawCollateral(uint64 operatorId, uint256 amount) external ``` -Withdraw collateral for an operator +Withdraw collateral from an operator #### Parameters @@ -929,28 +869,27 @@ Withdraw collateral for an operator | operatorId | uint64 | The operator ID | | amount | uint256 | The amount to withdraw | -### addOperatorPool +### requestDeregistration ```solidity -function addOperatorPool(uint64 operatorId, uint32 poolId) external +function requestDeregistration(uint64 operatorId) external ``` -Add a pool to an operator +Request deregistration for an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | | operatorId | uint64 | The operator ID | -| poolId | uint32 | The pool ID | -### removeOperatorPool +### addOperatorPool ```solidity -function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external +function addOperatorPool(uint64 operatorId, uint32 poolId) external ``` -Remove a pool from an operator +Add a pool to an operator #### Parameters @@ -958,49 +897,30 @@ Remove a pool from an operator | ---- | ---- | ----------- | | operatorId | uint64 | The operator ID | | poolId | uint32 | The pool ID | -| blameAmount | uint256 | The amount to recover from collateral | - -### requestDeregistration - -```solidity -function requestDeregistration(uint64 operatorId) external -``` - -Request deregistration for an operator - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | -### getOperatorCollateral +### removeOperatorPool ```solidity -function getOperatorCollateral(uint64 operatorId) external view returns (int256 collateral) +function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external ``` -Get the collateral of an operator +Remove a pool from an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | | operatorId | uint64 | The operator ID | +| poolId | uint32 | The pool ID | +| blameAmount | uint256 | The amount to recover from collateral | -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| collateral | int256 | The collateral | - -### getOperatorEligibility +### getOperator ```solidity -function getOperatorEligibility(uint64 operatorId) external view returns (bool eligibility) +function getOperator(uint64 operatorId) external view returns (struct ICasimirRegistry.Operator operator) ``` -Get the eligibility of an operator +Get an operator by ID #### Parameters @@ -1012,7 +932,7 @@ Get the eligibility of an operator | Name | Type | Description | | ---- | ---- | ----------- | -| eligibility | bool | The eligibility | +| operator | struct ICasimirRegistry.Operator | The operator | ### getOperatorIds @@ -1234,6 +1154,101 @@ Fulfill the request for testing | response | bytes | Aggregated response from the user code | | err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | +## CasimirViews + +### constructor + +```solidity +constructor(address managerAddress, address registryAddress) public +``` + +### getCompoundablePoolIds + +```solidity +function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5] poolIds) +``` + +Get the next five compoundable pool IDs + +_Should be called off-chain_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolIds | uint32[5] | The next five compoundable pool IDs | + +### getOperators + +```solidity +function getOperators(uint256 startIndex, uint256 endIndex) external view returns (struct ICasimirRegistry.Operator[]) +``` + +Get operators + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | struct ICasimirRegistry.Operator[] | operators The operators | + +### getPoolDetails + +```solidity +function getPoolDetails(uint32 poolId) external view returns (struct ICasimirViews.PoolDetails poolDetails) +``` + +Get a pool's details by ID + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolId | uint32 | The pool ID | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolDetails | struct ICasimirViews.PoolDetails | The pool details | + +### getSweptBalance + +```solidity +function getSweptBalance(uint256 startIndex, uint256 endIndex) public view returns (uint256 balance) +``` + +Get the swept balance + +_Should be called off-chain_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| balance | uint256 | The swept balance | + ## ICasimirManager ### Token @@ -1246,18 +1261,6 @@ enum Token { } ``` -### PoolDetails - -```solidity -struct PoolDetails { - uint32 id; - uint256 balance; - bytes publicKey; - uint64[] operatorIds; - enum ICasimirPool.PoolStatus status; -} -``` - ### User ```solidity @@ -1525,36 +1528,12 @@ function upkeepId() external view returns (uint256) function latestActiveBalance() external view returns (uint256) ``` -### latestActiveBalanceAfterFees - -```solidity -function latestActiveBalanceAfterFees() external view returns (uint256) -``` - -### latestActiveRewardBalance - -```solidity -function latestActiveRewardBalance() external view returns (int256) -``` - ### feePercent ```solidity function feePercent() external view returns (uint32) ``` -### requestedExits - -```solidity -function requestedExits() external view returns (uint256) -``` - -### requestedWithdrawals - -```solidity -function requestedWithdrawals() external view returns (uint256) -``` - ### requestedWithdrawalBalance ```solidity @@ -1573,12 +1552,6 @@ function finalizableCompletedExits() external view returns (uint256) function reportPeriod() external view returns (uint32) ``` -### prepoolBalance - -```solidity -function prepoolBalance() external view returns (uint256) -``` - ### getTotalStake ```solidity @@ -1639,12 +1612,6 @@ function getUserStake(address userAddress) external view returns (uint256) function getPoolAddress(uint32 poolId) external view returns (address) ``` -### getPoolDetails - -```solidity -function getPoolDetails(uint32 poolId) external view returns (struct ICasimirManager.PoolDetails) -``` - ### getRegistryAddress ```solidity @@ -1773,18 +1740,7 @@ event DeregistrationCompleted(uint64 operatorId) ```solidity struct Operator { - bool active; - bool resharing; - int256 collateral; - uint256 poolCount; - mapping(uint32 => bool) pools; -} -``` - -### OperatorDetails - -```solidity -struct OperatorDetails { + uint64 id; bool active; bool resharing; int256 collateral; @@ -1810,28 +1766,28 @@ function depositCollateral(uint64 operatorId) external payable function withdrawCollateral(uint64 operatorId, uint256 amount) external ``` -### addOperatorPool +### requestDeregistration ```solidity -function addOperatorPool(uint64 operatorId, uint32 poolId) external +function requestDeregistration(uint64 operatorId) external ``` -### removeOperatorPool +### addOperatorPool ```solidity -function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external +function addOperatorPool(uint64 operatorId, uint32 poolId) external ``` -### getOperatorCollateral +### removeOperatorPool ```solidity -function getOperatorCollateral(uint64 operatorId) external view returns (int256) +function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external ``` -### getOperatorEligibility +### getOperator ```solidity -function getOperatorEligibility(uint64 operatorId) external view returns (bool eligibility) +function getOperator(uint64 operatorId) external view returns (struct ICasimirRegistry.Operator) ``` ### getOperatorIds @@ -1937,32 +1893,70 @@ function setOracleAddress(address oracleAddress) external function mockFulfillRequest(bytes32 requestId, bytes result, bytes err) external ``` -## Types32Array +## ICasimirViews -### remove +### PoolDetails ```solidity -function remove(uint32[] uint32Array, uint256 index) internal +struct PoolDetails { + uint32 id; + uint256 balance; + bytes publicKey; + uint64[] operatorIds; + enum ICasimirPool.PoolStatus status; +} ``` -_Remove a uint32 element from the array_ +### getCompoundablePoolIds -#### Parameters +```solidity +function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5]) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| uint32Array | uint32[] | The array of uint32 | -| index | uint256 | | +### getOperators -## TypesBytesArray +```solidity +function getOperators(uint256 startIndex, uint256 endIndex) external view returns (struct ICasimirRegistry.Operator[]) +``` -### remove +### getPoolDetails ```solidity -function remove(bytes[] bytesArray, uint256 index) internal +function getPoolDetails(uint32 poolId) external view returns (struct ICasimirViews.PoolDetails) ``` -_Remove a bytes element from the array_ +### getSweptBalance + +```solidity +function getSweptBalance(uint256 startIndex, uint256 endIndex) external view returns (uint256) +``` + +## Types32Array + +### remove + +```solidity +function remove(uint32[] uint32Array, uint256 index) internal +``` + +_Remove a uint32 element from the array_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| uint32Array | uint32[] | The array of uint32 | +| index | uint256 | | + +## TypesBytesArray + +### remove + +```solidity +function remove(bytes[] bytesArray, uint256 index) internal +``` + +_Remove a bytes element from the array_ #### Parameters @@ -2101,477 +2095,43 @@ struct RegistrationParams { function registerUpkeep(struct KeeperRegistrarInterface.RegistrationParams requestParams) external returns (uint256) ``` -## CasimirViews +## MockFunctionsOracle ### constructor ```solidity -constructor(address managerAddress, address registryAddress) public -``` - -### getCompoundablePoolIds - -```solidity -function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5] poolIds) +constructor() public ``` -Get the next five compoundable pool IDs - -_Should be called off-chain_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolIds | uint32[5] | The next five compoundable pool IDs | - -### getEligibleOperatorIds +### getRegistry ```solidity -function getEligibleOperatorIds(uint256 startIndex, uint256 endIndex) external view returns (uint64[] activeOperatorIds) +function getRegistry() external view returns (address) ``` -Get the active operator IDs - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | +Returns the address of the registry contract #### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| activeOperatorIds | uint64[] | The active operator IDs | +| [0] | address | address The address of the registry contract | -### getSweptBalance +### sendRequest ```solidity -function getSweptBalance(uint256 startIndex, uint256 endIndex) public view returns (uint256 balance) +function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) ``` -Get the swept balance - -_Should be called off-chain_ +Sends a request (encoded as data) using the provided subscriptionId #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| balance | uint256 | The swept balance | - -## ICasimirViews - -### getCompoundablePoolIds - -```solidity -function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5]) -``` - -### getSweptBalance - -```solidity -function getSweptBalance(uint256 startIndex, uint256 endIndex) external view returns (uint256) -``` - -## CasimirMultisig - -### owners - -```solidity -address[] owners -``` - -### isOwner - -```solidity -mapping(address => bool) isOwner -``` - -### confirmationsRequired - -```solidity -uint256 confirmationsRequired -``` - -### isOwnerChangeConfirmed - -```solidity -mapping(uint256 => mapping(address => bool)) isOwnerChangeConfirmed -``` - -### isTransactionConfirmed - -```solidity -mapping(uint256 => mapping(address => bool)) isTransactionConfirmed -``` - -### ownerChanges - -```solidity -struct ICasimirMultisig.OwnerChange[] ownerChanges -``` - -### transactions - -```solidity -struct ICasimirMultisig.Transaction[] transactions -``` - -### onlyOwner - -```solidity -modifier onlyOwner() -``` - -### ownerChangeExists - -```solidity -modifier ownerChangeExists(uint256 changeId) -``` - -### ownerChangeNotExecuted - -```solidity -modifier ownerChangeNotExecuted(uint256 changeId) -``` - -### ownerChangeNotConfirmed - -```solidity -modifier ownerChangeNotConfirmed(uint256 changeId) -``` - -### transactionExists - -```solidity -modifier transactionExists(uint256 transactionIndex) -``` - -### transactionNotExecuted - -```solidity -modifier transactionNotExecuted(uint256 transactionIndex) -``` - -### transactionNotConfirmed - -```solidity -modifier transactionNotConfirmed(uint256 transactionIndex) -``` - -### constructor - -```solidity -constructor(address[] _owners) public -``` - -### receive - -```solidity -receive() external payable -``` - -### submitOwnerChange - -```solidity -function submitOwnerChange(address owner, bool add) public -``` - -### confirmOwnerChange - -```solidity -function confirmOwnerChange(uint256 changeId) public -``` - -### executeOwnerChange - -```solidity -function executeOwnerChange(uint256 changeId) public -``` - -### revokeOwnerChangeConfirmation - -```solidity -function revokeOwnerChangeConfirmation(uint256 changeId) public -``` - -### submitTransaction - -```solidity -function submitTransaction(address to, uint256 value, bytes data) public returns (uint256 transactionIndex) -``` - -### confirmTransaction - -```solidity -function confirmTransaction(uint256 transactionIndex) public -``` - -### executeTransaction - -```solidity -function executeTransaction(uint256 transactionIndex) public -``` - -### revokeTransactionConfirmation - -```solidity -function revokeTransactionConfirmation(uint256 transactionIndex) public -``` - -### adjustConfirmationsRequired - -```solidity -function adjustConfirmationsRequired() internal -``` - -### getOwners - -```solidity -function getOwners() public view returns (address[]) -``` - -### getOwnerChangeCount - -```solidity -function getOwnerChangeCount() public view returns (uint256) -``` - -### getOwnerChange - -```solidity -function getOwnerChange(uint256 changeId) public view returns (address owner, bool add, bool executed, uint256 confirmations) -``` - -### getTransactionCount - -```solidity -function getTransactionCount() public view returns (uint256) -``` - -### getTransaction - -```solidity -function getTransaction(uint256 transactionIndex) public view returns (address to, uint256 value, bytes data, bool executed, uint256 confirmations) -``` - -## ICasimirMultisig - -### Deposit - -```solidity -event Deposit(address sender, uint256 amount, uint256 balance) -``` - -### SubmitOwnerChange - -```solidity -event SubmitOwnerChange(address owner, uint256 changeId, bool add) -``` - -### ConfirmOwnerChange - -```solidity -event ConfirmOwnerChange(address owner, uint256 changeId) -``` - -### RevokeOwnerChangeConfirmation - -```solidity -event RevokeOwnerChangeConfirmation(address owner, uint256 changeId) -``` - -### ExecuteOwnerChange - -```solidity -event ExecuteOwnerChange(address owner, uint256 changeId) -``` - -### SubmitTransaction - -```solidity -event SubmitTransaction(address owner, uint256 txIndex, address to, uint256 value, bytes data) -``` - -### ConfirmTransaction - -```solidity -event ConfirmTransaction(address owner, uint256 txIndex) -``` - -### RevokeTransactionConfirmation - -```solidity -event RevokeTransactionConfirmation(address owner, uint256 txIndex) -``` - -### ExecuteTransaction - -```solidity -event ExecuteTransaction(address owner, uint256 txIndex) -``` - -### OwnerChange - -```solidity -struct OwnerChange { - address owner; - bool add; - bool executed; - uint256 confirmations; -} -``` - -### Transaction - -```solidity -struct Transaction { - address to; - uint256 value; - bytes data; - bool executed; - uint256 confirmations; -} -``` - -### receive - -```solidity -receive() external payable -``` - -### submitOwnerChange - -```solidity -function submitOwnerChange(address owner, bool add) external -``` - -### confirmOwnerChange - -```solidity -function confirmOwnerChange(uint256 changeId) external -``` - -### executeOwnerChange - -```solidity -function executeOwnerChange(uint256 changeId) external -``` - -### revokeOwnerChangeConfirmation - -```solidity -function revokeOwnerChangeConfirmation(uint256 changeId) external -``` - -### submitTransaction - -```solidity -function submitTransaction(address to, uint256 value, bytes data) external returns (uint256 transactionIndex) -``` - -### confirmTransaction - -```solidity -function confirmTransaction(uint256 transactionIndex) external -``` - -### executeTransaction - -```solidity -function executeTransaction(uint256 transactionIndex) external -``` - -### revokeTransactionConfirmation - -```solidity -function revokeTransactionConfirmation(uint256 transactionIndex) external -``` - -### getOwners - -```solidity -function getOwners() external view returns (address[]) -``` - -### getOwnerChangeCount - -```solidity -function getOwnerChangeCount() external view returns (uint256) -``` - -### getOwnerChange - -```solidity -function getOwnerChange(uint256 changeId) external view returns (address owner, bool add, bool executed, uint256 confirmations) -``` - -### getTransactionCount - -```solidity -function getTransactionCount() external view returns (uint256) -``` - -### getTransaction - -```solidity -function getTransaction(uint256 transactionIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 confirmations) -``` - -## MockFunctionsOracle - -### constructor - -```solidity -constructor() public -``` - -### getRegistry - -```solidity -function getRegistry() external view returns (address) -``` - -Returns the address of the registry contract - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | address | address The address of the registry contract | - -### sendRequest - -```solidity -function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) -``` - -Sends a request (encoded as data) using the provided subscriptionId - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| _gasLimit | uint32 | Gas limit for the fulfillment callback | +| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | +| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| _gasLimit | uint32 | Gas limit for the fulfillment callback | #### Return Values @@ -2579,1721 +2139,3 @@ Sends a request (encoded as data) using the provided subscriptionId | ---- | ---- | ----------- | | requestId | bytes32 | A unique request identifier (unique per DON) | -## CasimirDAO - -### owners - -```solidity -address[] owners -``` - -### isOwner - -```solidity -mapping(address => bool) isOwner -``` - -### numConfirmationsRequired - -```solidity -uint256 numConfirmationsRequired -``` - -### isConfirmed - -```solidity -mapping(uint256 => mapping(address => bool)) isConfirmed -``` - -### transactions - -```solidity -struct ICasimirDAO.Transaction[] transactions -``` - -### onlyOwner - -```solidity -modifier onlyOwner() -``` - -### txExists - -```solidity -modifier txExists(uint256 _txIndex) -``` - -### notExecuted - -```solidity -modifier notExecuted(uint256 _txIndex) -``` - -### notConfirmed - -```solidity -modifier notConfirmed(uint256 _txIndex) -``` - -### constructor - -```solidity -constructor(address[] _owners, uint256 _numConfirmationsRequired) public -``` - -### receive - -```solidity -receive() external payable -``` - -### submitTransaction - -```solidity -function submitTransaction(address _to, uint256 _value, bytes _data) public -``` - -### confirmTransaction - -```solidity -function confirmTransaction(uint256 _txIndex) public -``` - -### executeTransaction - -```solidity -function executeTransaction(uint256 _txIndex) public -``` - -### revokeConfirmation - -```solidity -function revokeConfirmation(uint256 _txIndex) public -``` - -### getOwners - -```solidity -function getOwners() public view returns (address[]) -``` - -### getTransactionCount - -```solidity -function getTransactionCount() public view returns (uint256) -``` - -### getTransaction - -```solidity -function getTransaction(uint256 _txIndex) public view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) -``` - -## CasimirManager - -### Token - -```solidity -enum Token { - LINK, - SSV, - WETH -} -``` - -### constructor - -```solidity -constructor(address _oracleAddress, address beaconDepositAddress, address functionsAddress, uint32 functionsSubscriptionId, address linkTokenAddress, address ssvNetworkAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public -``` - -Constructor - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _oracleAddress | address | The manager oracle address | -| beaconDepositAddress | address | The Beacon deposit address | -| functionsAddress | address | The Chainlink functions oracle address | -| functionsSubscriptionId | uint32 | The Chainlink functions subscription ID | -| linkTokenAddress | address | The Chainlink token address | -| ssvNetworkAddress | address | The SSV network address | -| ssvTokenAddress | address | The SSV token address | -| swapFactoryAddress | address | The Uniswap factory address | -| swapRouterAddress | address | The Uniswap router address | -| wethTokenAddress | address | The WETH contract address | - -### depositStake - -```solidity -function depositStake() external payable -``` - -Deposit user stake - -### rebalanceStake - -```solidity -function rebalanceStake(uint256 activeBalance, uint256 sweptRewards, uint256 sweptExits, uint32 completedDeposits, uint32 completedExits) external -``` - -Rebalance the rewards to stake ratio and redistribute swept rewards - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| activeBalance | uint256 | The active consensus balance | -| sweptRewards | uint256 | The swept consensus rewards | -| sweptExits | uint256 | The swept consensus exits | -| completedDeposits | uint32 | The completed deposit count | -| completedExits | uint32 | The completed exit count | - -### requestWithdrawal - -```solidity -function requestWithdrawal(uint256 amount) external -``` - -Request to withdraw user stake - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| amount | uint256 | The amount of stake to withdraw | - -### completePendingWithdrawals - -```solidity -function completePendingWithdrawals(uint256 count) external -``` - -Complete a given count of pending withdrawals - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| count | uint256 | The number of withdrawals to complete | - -### initiatePoolDeposit - -```solidity -function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount) external -``` - -Initiate the next ready pool - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositDataRoot | bytes32 | The deposit data root | -| publicKey | bytes | The validator public key | -| signature | bytes | The signature | -| withdrawalCredentials | bytes | The withdrawal credentials | -| operatorIds | uint64[] | The operator IDs | -| shares | bytes | The operator shares | -| cluster | struct ISSVNetworkCore.Cluster | | -| feeAmount | uint256 | The fee amount | - -### completePoolDeposits - -```solidity -function completePoolDeposits(uint256 count) external -``` - -Complete a given count of the next pending pools - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| count | uint256 | The number of pools to complete | - -### requestPoolExits - -```solidity -function requestPoolExits(uint256 count) external -``` - -Request a given count of staked pool exits - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| count | uint256 | The number of exits to request | - -### reportPoolSlash - -```solidity -function reportPoolSlash(uint32 poolId) external -``` - -Report a pool slash - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | - -### completePoolExit - -```solidity -function completePoolExit(uint256 poolIndex, uint256 validatorIndex, uint256 finalEffectiveBalance, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external -``` - -Complete a pool exit - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolIndex | uint256 | The staked pool index | -| validatorIndex | uint256 | The staked validator (internal) index | -| finalEffectiveBalance | uint256 | The final effective balance | -| blamePercents | uint32[] | The operator blame percents (0 if balance is 32 ether) | -| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | - -### setFeePercents - -```solidity -function setFeePercents(uint32 _ethFeePercent, uint32 _linkFeePercent, uint32 _ssvFeePercent) external -``` - -_Update fee percentages_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _ethFeePercent | uint32 | The new ETH fee percentage | -| _linkFeePercent | uint32 | The new LINK fee percentage | -| _ssvFeePercent | uint32 | The new SSV fee percentage | - -### setFunctionsAddress - -```solidity -function setFunctionsAddress(address functionsAddress) external -``` - -Update the functions oracle address - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| functionsAddress | address | New functions oracle address | - -### getUserStake - -```solidity -function getUserStake(address userAddress) public view returns (uint256 userStake) -``` - -Get the total user stake for a given user address - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| userAddress | address | The user address | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| userStake | uint256 | The total user stake | - -### getStake - -```solidity -function getStake() public view returns (uint256 stake) -``` - -Get the manager stake - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| stake | uint256 | The manager stake | - -### getBufferedBalance - -```solidity -function getBufferedBalance() public view returns (uint256 bufferedBalance) -``` - -Get the manager buffered (execution) balance - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| bufferedBalance | uint256 | The manager buffered (execution) balance | - -### getPendingDeposits - -```solidity -function getPendingDeposits() public view returns (uint256 pendingDeposits) -``` - -Get the manager pending (consensus) deposits - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| pendingDeposits | uint256 | The manager pending (consensus) deposits | - -### getExitedBalance - -```solidity -function getExitedBalance() public view returns (uint256) -``` - -Get the manager exited (execution) balance - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | exitedBalance The manager exited (execution) balance | - -### getReservedFees - -```solidity -function getReservedFees() public view returns (uint256) -``` - -Get the manager reserved fees - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | reservedFees The manager reserved fees | - -### getSweptBalance - -```solidity -function getSweptBalance() public view returns (uint256 balance) -``` - -Get the manager swept balance - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| balance | uint256 | The manager swept balance | - -### getActiveDeposits - -```solidity -function getActiveDeposits() public view returns (uint256 activeDeposits) -``` - -Get the manager active (consensus) deposits - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| activeDeposits | uint256 | The manager active (consensus) deposits | - -### getLatestActiveBalance - -```solidity -function getLatestActiveBalance() public view returns (uint256) -``` - -Get the latest manager active (consensus) balance - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | activeBalance The latest manager active (consensus) balance | - -### getLatestActiveBalanceAfterFees - -```solidity -function getLatestActiveBalanceAfterFees() public view returns (uint256) -``` - -Get the manager latest active (consensus) balance after fees - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | activeBalanceAfterFees The manager latest active (consensus) balance after fees | - -### getPendingWithdrawals - -```solidity -function getPendingWithdrawals() public view returns (uint256) -``` - -Get the total pending withdrawals - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | pendingWithdrawals The total pending withdrawals | - -### getPendingWithdrawalQueue - -```solidity -function getPendingWithdrawalQueue() public view returns (struct ICasimirManager.Withdrawal[]) -``` - -Get the pending withdrawal queue - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | struct ICasimirManager.Withdrawal[] | pendingWithdrawalQueue The pending withdrawal queue | - -### getFeePercent - -```solidity -function getFeePercent() public view returns (uint32) -``` - -Get the total fee percentage - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32 | feePercent The total fee percentage | - -### getValidatorPublicKeys - -```solidity -function getValidatorPublicKeys() external view returns (bytes[]) -``` - -Get validator public keys - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes[] | A list of pending and active validator public keys | - -### getExitingValidatorCount - -```solidity -function getExitingValidatorCount() external view returns (uint256) -``` - -Get the count of exiting validators - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The count of exiting validators | - -### getReadyPoolIds - -```solidity -function getReadyPoolIds() external view returns (uint32[]) -``` - -Get a list of all ready pool IDs - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32[] | A list of all ready pool IDs | - -### getPendingPoolIds - -```solidity -function getPendingPoolIds() external view returns (uint32[]) -``` - -Get a list of all pending pool IDs - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32[] | A list of all pending pool IDs | - -### getStakedPoolIds - -```solidity -function getStakedPoolIds() external view returns (uint32[]) -``` - -Get a list of all staked pool IDs - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32[] | A list of all staked pool IDs | - -### getOpenDeposits - -```solidity -function getOpenDeposits() external view returns (uint256) -``` - -Get the total manager open deposits - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | The total manager open deposits | - -### getPool - -```solidity -function getPool(uint32 poolId) external view returns (struct ICasimirManager.Pool pool) -``` - -Get a pool by ID - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| pool | struct ICasimirManager.Pool | The pool details | - -### getETHFeePercent - -```solidity -function getETHFeePercent() external view returns (uint32) -``` - -Get the ETH fee percentage to charge on each deposit - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32 | The ETH fee percentage to charge on each deposit | - -### getLINKFeePercent - -```solidity -function getLINKFeePercent() external view returns (uint32) -``` - -Get the LINK fee percentage to charge on each deposit - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32 | The LINK fee percentage to charge on each deposit | - -### getSSVFeePercent - -```solidity -function getSSVFeePercent() external view returns (uint32) -``` - -Get the SSV fee percentage to charge on each deposit - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32 | The SSV fee percentage to charge on each deposit | - -### getSSVNetworkAddress - -```solidity -function getSSVNetworkAddress() external view returns (address ssvNetworkAddress) -``` - -Get the SSV network address - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| ssvNetworkAddress | address | The SSV network address | - -### getUpkeepAddress - -```solidity -function getUpkeepAddress() external view returns (address upkeepAddress) -``` - -Get the upkeep address - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| upkeepAddress | address | The upkeep address | - -### receive - -```solidity -receive() external payable -``` - -_Will be removed in production -Used for mocking sweeps from Beacon to the manager_ - -## CasimirRegistry - -### requiredCollateral - -```solidity -uint256 requiredCollateral -``` - -### minimumCollateralDeposit - -```solidity -uint256 minimumCollateralDeposit -``` - -### constructor - -```solidity -constructor(address managerAddress, address ssvNetworkViewsAddress) public -``` - -### registerOperator - -```solidity -function registerOperator(uint64 operatorId) external payable -``` - -Register an operator with the set - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | - -### requestOperatorDeregistration - -```solidity -function requestOperatorDeregistration(uint64 operatorId) external -``` - -Request to deregister an operator from the set - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | - -### completeOperatorDeregistration - -```solidity -function completeOperatorDeregistration(uint64 operatorId) external -``` - -Deregister an operator from the set - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | - -### depositCollateral - -```solidity -function depositCollateral(uint64 operatorId) external payable -``` - -Deposit collateral for an operator - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | - -### setOperatorCollateral - -```solidity -function setOperatorCollateral(uint64 operatorId, int256 collateral) external -``` - -Set the collateral for an operator - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | -| collateral | int256 | The collateral | - -### getOperatorCollateral - -```solidity -function getOperatorCollateral(uint64 operatorId) external view returns (int256) -``` - -Get the collateral for an operator - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | int256 | The collateral | - -## CasimirUpkeep - -### reportHeartbeat - -```solidity -uint256 reportHeartbeat -``` - -Oracle heartbeat - -### poolCapacity - -```solidity -uint256 poolCapacity -``` - -Pool capacity - -### currentReportRequestBlock - -```solidity -uint256 currentReportRequestBlock -``` - -Current report block - -### latestSummaryRequestId - -```solidity -bytes32 latestSummaryRequestId -``` - -Latest summary request ID - -### requestCBOR - -```solidity -bytes requestCBOR -``` - -Binary request source code - -### fulfillGasLimit - -```solidity -uint32 fulfillGasLimit -``` - -Fulfillment gas limit - -### constructor - -```solidity -constructor(address managerAddress, address functionsOracleAddress, uint64 _functionsSubscriptionId) public -``` - -Constructor - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| managerAddress | address | The manager contract address | -| functionsOracleAddress | address | The functions oracle contract address | -| _functionsSubscriptionId | uint64 | The functions subscription ID | - -### generateRequest - -```solidity -function generateRequest(string source, bytes secrets, string[] args) public pure returns (bytes) -``` - -Generate a new Functions.Request(off-chain, saving gas) - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| source | string | JavaScript source code | -| secrets | bytes | Encrypted secrets payload | -| args | string[] | List of arguments accessible from within the source code | - -### setRequest - -```solidity -function setRequest(uint32 _fulfillGasLimit, uint64 _functionsSubscriptionId, bytes _requestCBOR) external -``` - -Set the bytes representing the CBOR-encoded Functions.Request - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | -| _functionsSubscriptionId | uint64 | The functions billing subscription ID used to pay for Functions requests | -| _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | - -### checkUpkeep - -```solidity -function checkUpkeep(bytes) public view returns (bool upkeepNeeded, bytes) -``` - -Check if the upkeep is needed - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| upkeepNeeded | bool | True if the upkeep is needed | -| [1] | bytes | | - -### performUpkeep - -```solidity -function performUpkeep(bytes) external -``` - -Perform the upkeep - -### fulfillRequest - -```solidity -function fulfillRequest(bytes32 requestId, bytes response, bytes _error) internal -``` - -Callback that is invoked once the DON has resolved the request or hit an error - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The request ID, returned by sendRequest() | -| response | bytes | Aggregated response from the user code | -| _error | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | - -### setOracleAddress - -```solidity -function setOracleAddress(address newOracleAddress) external -``` - -Update the functions oracle address - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| newOracleAddress | address | New oracle address | - -### mockFulfillRequest - -```solidity -function mockFulfillRequest(bytes32 requestId, bytes response, bytes err) external -``` - -Fulfill the request for testing - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The request ID, returned by sendRequest() | -| response | bytes | Aggregated response from the user code | -| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | - -## ICasimirDAO - -### Deposit - -```solidity -event Deposit(address sender, uint256 amount, uint256 balance) -``` - -### SubmitTransaction - -```solidity -event SubmitTransaction(address owner, uint256 txIndex, address to, uint256 value, bytes data) -``` - -### ConfirmTransaction - -```solidity -event ConfirmTransaction(address owner, uint256 txIndex) -``` - -### RevokeConfirmation - -```solidity -event RevokeConfirmation(address owner, uint256 txIndex) -``` - -### ExecuteTransaction - -```solidity -event ExecuteTransaction(address owner, uint256 txIndex) -``` - -### Transaction - -```solidity -struct Transaction { - address to; - uint256 value; - bytes data; - bool executed; - uint256 numConfirmations; -} -``` - -### receive - -```solidity -receive() external payable -``` - -### submitTransaction - -```solidity -function submitTransaction(address _to, uint256 _value, bytes _data) external -``` - -### confirmTransaction - -```solidity -function confirmTransaction(uint256 _txIndex) external -``` - -### executeTransaction - -```solidity -function executeTransaction(uint256 _txIndex) external -``` - -### revokeConfirmation - -```solidity -function revokeConfirmation(uint256 _txIndex) external -``` - -### getOwners - -```solidity -function getOwners() external view returns (address[]) -``` - -### getTransactionCount - -```solidity -function getTransactionCount() external view returns (uint256) -``` - -### getTransaction - -```solidity -function getTransaction(uint256 _txIndex) external view returns (address to, uint256 value, bytes data, bool executed, uint256 numConfirmations) -``` - -## ICasimirManager - -### ProcessedDeposit - -```solidity -struct ProcessedDeposit { - uint256 ethAmount; - uint256 linkAmount; - uint256 ssvAmount; -} -``` - -### Pool - -```solidity -struct Pool { - uint256 deposits; - bool exiting; - bytes32 depositDataRoot; - bytes publicKey; - bytes signature; - bytes withdrawalCredentials; - uint64[] operatorIds; - bytes shares; -} -``` - -### User - -```solidity -struct User { - uint256 stake0; - uint256 stakeRatioSum0; -} -``` - -### Withdrawal - -```solidity -struct Withdrawal { - address user; - uint256 amount; -} -``` - -### PoolDepositRequested - -```solidity -event PoolDepositRequested(uint32 poolId) -``` - -### PoolDepositInitiated - -```solidity -event PoolDepositInitiated(uint32 poolId) -``` - -### PoolDeposited - -```solidity -event PoolDeposited(uint32 poolId) -``` - -### PoolReshareRequested - -```solidity -event PoolReshareRequested(uint32 poolId) -``` - -### PoolReshared - -```solidity -event PoolReshared(uint32 poolId) -``` - -### PoolExitRequested - -```solidity -event PoolExitRequested(uint32 poolId) -``` - -### PoolExited - -```solidity -event PoolExited(uint32 poolId) -``` - -### StakeDeposited - -```solidity -event StakeDeposited(address sender, uint256 amount) -``` - -### StakeRebalanced - -```solidity -event StakeRebalanced(uint256 amount) -``` - -### RewardsDeposited - -```solidity -event RewardsDeposited(uint256 amount) -``` - -### WithdrawalRequested - -```solidity -event WithdrawalRequested(address sender, uint256 amount) -``` - -### WithdrawalInitiated - -```solidity -event WithdrawalInitiated(address sender, uint256 amount) -``` - -### WithdrawalCompleted - -```solidity -event WithdrawalCompleted(address sender, uint256 amount) -``` - -### depositStake - -```solidity -function depositStake() external payable -``` - -### rebalanceStake - -```solidity -function rebalanceStake(uint256 activeBalance, uint256 sweptRewards, uint256 sweptExits, uint32 completedDeposits, uint32 completedExits) external -``` - -### requestWithdrawal - -```solidity -function requestWithdrawal(uint256 amount) external -``` - -### completePendingWithdrawals - -```solidity -function completePendingWithdrawals(uint256 count) external -``` - -### initiatePoolDeposit - -```solidity -function initiatePoolDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount) external -``` - -### completePoolDeposits - -```solidity -function completePoolDeposits(uint256 count) external -``` - -### requestPoolExits - -```solidity -function requestPoolExits(uint256 count) external -``` - -### completePoolExit - -```solidity -function completePoolExit(uint256 poolIndex, uint256 validatorIndex, uint256 finalEffectiveBalance, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external -``` - -### setFeePercents - -```solidity -function setFeePercents(uint32 ethFeePercent, uint32 linkFeePercent, uint32 ssvFeePercent) external -``` - -### setFunctionsAddress - -```solidity -function setFunctionsAddress(address functionsAddress) external -``` - -### getFeePercent - -```solidity -function getFeePercent() external view returns (uint32) -``` - -### getETHFeePercent - -```solidity -function getETHFeePercent() external view returns (uint32) -``` - -### getLINKFeePercent - -```solidity -function getLINKFeePercent() external view returns (uint32) -``` - -### getSSVFeePercent - -```solidity -function getSSVFeePercent() external view returns (uint32) -``` - -### getValidatorPublicKeys - -```solidity -function getValidatorPublicKeys() external view returns (bytes[]) -``` - -### getExitingValidatorCount - -```solidity -function getExitingValidatorCount() external view returns (uint256) -``` - -### getReadyPoolIds - -```solidity -function getReadyPoolIds() external view returns (uint32[]) -``` - -### getPendingPoolIds - -```solidity -function getPendingPoolIds() external view returns (uint32[]) -``` - -### getStakedPoolIds - -```solidity -function getStakedPoolIds() external view returns (uint32[]) -``` - -### getStake - -```solidity -function getStake() external view returns (uint256) -``` - -### getBufferedBalance - -```solidity -function getBufferedBalance() external view returns (uint256) -``` - -### getActiveDeposits - -```solidity -function getActiveDeposits() external view returns (uint256) -``` - -### getLatestActiveBalance - -```solidity -function getLatestActiveBalance() external view returns (uint256) -``` - -### getLatestActiveBalanceAfterFees - -```solidity -function getLatestActiveBalanceAfterFees() external view returns (uint256) -``` - -### getExitedBalance - -```solidity -function getExitedBalance() external view returns (uint256) -``` - -### getOpenDeposits - -```solidity -function getOpenDeposits() external view returns (uint256) -``` - -### getSweptBalance - -```solidity -function getSweptBalance() external view returns (uint256) -``` - -### getUserStake - -```solidity -function getUserStake(address userAddress) external view returns (uint256) -``` - -### getPendingWithdrawals - -```solidity -function getPendingWithdrawals() external view returns (uint256) -``` - -### getPendingWithdrawalQueue - -```solidity -function getPendingWithdrawalQueue() external view returns (struct ICasimirManager.Withdrawal[]) -``` - -## ICasimirRegistry - -### OperatorRegistered - -```solidity -event OperatorRegistered(uint64 operatorId) -``` - -### OperatorDeregistrationRequested - -```solidity -event OperatorDeregistrationRequested(uint64 operatorId) -``` - -### OperatorDeregistrationCompleted - -```solidity -event OperatorDeregistrationCompleted(uint64 operatorId) -``` - -### Operator - -```solidity -struct Operator { - uint64 id; - int256 collateral; - uint256 poolCount; - bool deregistering; -} -``` - -### registerOperator - -```solidity -function registerOperator(uint64 operatorId) external payable -``` - -### requestOperatorDeregistration - -```solidity -function requestOperatorDeregistration(uint64 operatorId) external -``` - -### completeOperatorDeregistration - -```solidity -function completeOperatorDeregistration(uint64 operatorId) external -``` - -### depositCollateral - -```solidity -function depositCollateral(uint64 operatorId) external payable -``` - -### setOperatorCollateral - -```solidity -function setOperatorCollateral(uint64 operatorId, int256 collateral) external -``` - -### getOperatorCollateral - -```solidity -function getOperatorCollateral(uint64 operatorId) external view returns (int256) -``` - -## ICasimirUpkeep - -### ReportStatus - -```solidity -enum ReportStatus { - FINALIZED, - PENDING, - PROCESSING -} -``` - -### DetailRequestType - -```solidity -enum DetailRequestType { - NONE, - EXIT, - SLASH -} -``` - -### DetailRequest - -```solidity -struct DetailRequest { - enum ICasimirUpkeep.DetailRequestType requestType; - uint32 reportDetailIndex; -} -``` - -### Report - -```solidity -struct Report { - struct ICasimirUpkeep.Summary summary; - struct ICasimirUpkeep.ExitDetail[] exitDetails; - struct ICasimirUpkeep.SlashDetail[] slashDetails; -} -``` - -### Summary - -```solidity -struct Summary { - uint256 activeBalance; - uint32 completedDeposits; - uint32 completedExits; - uint32 slashedExits; - uint32 dummy; -} -``` - -### SlashDetail - -```solidity -struct SlashDetail { - uint32 poolId; - uint256 expectedEffectiveBalance; - uint32 blockDelay; - uint32 firstOperatorBlame; - uint32 secondOperatorBlame; - uint32 thirdOperatorBlame; - uint32 fourthOperatorBlame; -} -``` - -### ExitDetail - -```solidity -struct ExitDetail { - uint32 poolId; - uint256 finalEffectiveBalance; - uint32 firstOperatorBlame; - uint32 secondOperatorBlame; - uint32 thirdOperatorBlame; - uint32 fourthOperatorBlame; - uint32 dummy; -} -``` - -### OCRResponse - -```solidity -event OCRResponse(bytes32 requestId, bytes result, bytes err) -``` - -### UpkeepPerformed - -```solidity -event UpkeepPerformed(enum ICasimirUpkeep.ReportStatus status) -``` - -### checkUpkeep - -```solidity -function checkUpkeep(bytes checkData) external returns (bool upkeepNeeded, bytes performData) -``` - -method that is simulated by the keepers to see if any work actually -needs to be performed. This method does does not actually need to be -executable, and since it is only ever simulated it can consume lots of gas. - -_To ensure that it is never called, you may want to add the -cannotExecute modifier from KeeperBase to your implementation of this -method._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| checkData | bytes | specified in the upkeep registration so it is always the same for a registered upkeep. This can easily be broken down into specific arguments using `abi.decode`, so multiple upkeeps can be registered on the same contract and easily differentiated by the contract. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| upkeepNeeded | bool | boolean to indicate whether the keeper should call performUpkeep or not. | -| performData | bytes | bytes that the keeper should call performUpkeep with, if upkeep is needed. If you would like to encode data to decode later, try `abi.encode`. | - -### performUpkeep - -```solidity -function performUpkeep(bytes performData) external -``` - -method that is actually executed by the keepers, via the registry. -The data returned by the checkUpkeep simulation will be passed into -this method to actually be executed. - -_The input to this method should not be trusted, and the caller of the -method should not even be restricted to any single registry. Anyone should -be able call it, and the input should be validated, there is no guarantee -that the data passed in is the performData returned from checkUpkeep. This -could happen due to malicious keepers, racing keepers, or simply a state -change while the performUpkeep transaction is waiting for confirmation. -Always validate the data passed in._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| performData | bytes | is the data which was passed back from the checkData simulation. If it is encoded, it can easily be decoded into other types by calling `abi.decode`. This data should not be trusted, and should be validated against the contract's current state. | - -### setOracleAddress - -```solidity -function setOracleAddress(address oracleAddress) external -``` - -### mockFulfillRequest - -```solidity -function mockFulfillRequest(bytes32 requestId, bytes result, bytes err) external -``` - -## Types32Array - -### remove - -```solidity -function remove(uint32[] uint32Array, uint256 index) internal -``` - -_Remove a uint32 element from the array_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| uint32Array | uint32[] | The array of uint32 | -| index | uint256 | | - -## TypesBytesArray - -### remove - -```solidity -function remove(bytes[] bytesArray, uint256 index) internal -``` - -_Remove a bytes element from the array_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| bytesArray | bytes[] | The array of bytes | -| index | uint256 | The index of the element to remove | - -## TypesWithdrawalArray - -### remove - -```solidity -function remove(struct ICasimirManager.Withdrawal[] withdrawals, uint256 index) internal -``` - -_Remove a withdrawal from the array_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| withdrawals | struct ICasimirManager.Withdrawal[] | The array of withdrawals | -| index | uint256 | The index of the withdrawal to remove | - -## TypesAddress - -### send - -```solidity -function send(address user, uint256 amount) internal -``` - -_Send ETH to a user_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| user | address | The user address | -| amount | uint256 | The amount of stake to send | - -## IDepositContract - -### DepositEvent - -```solidity -event DepositEvent(bytes pubkey, bytes withdrawal_credentials, bytes amount, bytes signature, bytes index) -``` - -A processed deposit event. - -### deposit - -```solidity -function deposit(bytes pubkey, bytes withdrawal_credentials, bytes signature, bytes32 deposit_data_root) external payable -``` - -Submit a Phase 0 DepositData object. - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| pubkey | bytes | A BLS12-381 public key. | -| withdrawal_credentials | bytes | Commitment to a public key for withdrawals. | -| signature | bytes | A BLS12-381 signature. | -| deposit_data_root | bytes32 | The SHA-256 hash of the SSZ-encoded DepositData object. Used as a protection against malformed input. | - -### get_deposit_root - -```solidity -function get_deposit_root() external view returns (bytes32) -``` - -Query the current deposit root hash. - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes32 | The deposit root hash. | - -### get_deposit_count - -```solidity -function get_deposit_count() external view returns (bytes) -``` - -Query the current deposit count. - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes | The deposit count encoded as a little endian 64-bit number. | - -## IWETH9 - -### deposit - -```solidity -function deposit() external payable -``` - -Deposit ether to get wrapped ether - -### withdraw - -```solidity -function withdraw(uint256) external -``` - -Withdraw wrapped ether to get ether - diff --git a/contracts/ethereum/src/v1/CasimirViews.sol b/contracts/ethereum/src/v1/CasimirViews.sol index 13c4f3c06..c99dad11c 100644 --- a/contracts/ethereum/src/v1/CasimirViews.sol +++ b/contracts/ethereum/src/v1/CasimirViews.sol @@ -77,6 +77,54 @@ contract CasimirViews is ICasimirViews { return operators; } + /** + * @notice Get the pending validator public keys + * @param startIndex The start index + * @param endIndex The end index + * @return validatorPublicKeys The pending validator public keys + */ + function getPendingValidatorPublicKeys( + uint256 startIndex, + uint256 endIndex + ) external view returns (bytes[] memory) { + bytes[] memory validatorPublicKeys = new bytes[](endIndex - startIndex); + uint32[] memory pendingPoolIds = manager.getPendingPoolIds(); + uint256 count = 0; + for (uint256 i = startIndex; i < endIndex; i++) { + uint32 poolId = pendingPoolIds[i]; + address poolAddress = manager.getPoolAddress(poolId); + ICasimirPool pool = ICasimirPool(poolAddress); + ICasimirPool.PoolConfig memory poolConfig = pool.getConfig(); + validatorPublicKeys[count] = poolConfig.publicKey; + count++; + } + return validatorPublicKeys; + } + + /** + * @notice Get the staked validator public keys + * @param startIndex The start index + * @param endIndex The end index + * @return validatorPublicKeys The staked validator public keys + */ + function getStakedValidatorPublicKeys( + uint256 startIndex, + uint256 endIndex + ) external view returns (bytes[] memory) { + bytes[] memory validatorPublicKeys = new bytes[](endIndex - startIndex); + uint32[] memory stakedPoolIds = manager.getStakedPoolIds(); + uint256 count = 0; + for (uint256 i = startIndex; i < endIndex; i++) { + uint32 poolId = stakedPoolIds[i]; + address poolAddress = manager.getPoolAddress(poolId); + ICasimirPool pool = ICasimirPool(poolAddress); + ICasimirPool.PoolConfig memory poolConfig = pool.getConfig(); + validatorPublicKeys[count] = poolConfig.publicKey; + count++; + } + return validatorPublicKeys; + } + /** * @notice Get a pool's details by ID * @param poolId The pool ID diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirViews.sol b/contracts/ethereum/src/v1/interfaces/ICasimirViews.sol index 01424e3fe..f6a4866b3 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirViews.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirViews.sol @@ -31,6 +31,14 @@ interface ICasimirViews { function getPoolDetails( uint32 poolId ) external view returns (PoolDetails memory); + function getPendingValidatorPublicKeys( + uint256 startIndex, + uint256 endIndex + ) external view returns (bytes[] memory); + function getStakedValidatorPublicKeys( + uint256 startIndex, + uint256 endIndex + ) external view returns (bytes[] memory); function getSweptBalance( uint256 startIndex, uint256 endIndex From 43964b6f2ee420a840056dcbeffa0f7f4400a165 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Wed, 7 Jun 2023 15:59:58 -0400 Subject: [PATCH 63/78] Register upkeep in test --- common/ssv/src/providers/clusters.ts | 14 +- contracts/ethereum/docs/index.md | 1892 +++++++++--------- contracts/ethereum/helpers/oracle.ts | 37 +- contracts/ethereum/package.json | 1 - contracts/ethereum/src/v1/CasimirManager.sol | 4 +- contracts/ethereum/test/fixtures/shared.ts | 6 +- contracts/ethereum/test/operators.ts | 2 +- contracts/ethereum/test/reports.ts | 0 8 files changed, 1017 insertions(+), 939 deletions(-) create mode 100644 contracts/ethereum/test/reports.ts diff --git a/common/ssv/src/providers/clusters.ts b/common/ssv/src/providers/clusters.ts index 30517be3f..bcc44aec1 100644 --- a/common/ssv/src/providers/clusters.ts +++ b/common/ssv/src/providers/clusters.ts @@ -5,12 +5,9 @@ import ISSVNetworkViewsJson from '@casimir/ethereum/build/artifacts/scripts/reso import { ClusterDetailsInput } from '../interfaces/ClusterDetailsInput' import { ClusterDetails } from '../interfaces/ClusterDetails' import { Cluster } from '@casimir/types' -import { getPrice } from '@casimir/uniswap' const networkAddress = '0xAfdb141Dd99b5a101065f40e3D7636262dce65b3' const networkViewsAddress = '0x8dB45282d7C4559fd093C26f677B3837a5598914' -const networkTokenAddress = '0x3a9f01091C446bdE031E39ea8354647AFef091E7' -const wethTokenAddress = '0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6' const DAY = 5400 const WEEK = DAY * 7 @@ -97,22 +94,13 @@ export async function getClusterDetails(input: ClusterDetailsInput): Promise }) { const { count } = args diff --git a/contracts/ethereum/package.json b/contracts/ethereum/package.json index efcc19b6e..324566aab 100644 --- a/contracts/ethereum/package.json +++ b/contracts/ethereum/package.json @@ -4,7 +4,6 @@ "node": "npx hardhat node", "dev": "npx hardhat run scripts/dev.ts", "deploy": "npx hardhat run scripts/deploy.ts", - "deploy:multisig": "npx hardhat run scripts/multisig.ts", "docgen": "npx hardhat docgen", "test": "npx esno scripts/test.ts --clean \"$npm_config_clean\"", "clean": "npx hardhat clean", diff --git a/contracts/ethereum/src/v1/CasimirManager.sol b/contracts/ethereum/src/v1/CasimirManager.sol index 6d07277b6..413ceec75 100644 --- a/contracts/ethereum/src/v1/CasimirManager.sol +++ b/contracts/ethereum/src/v1/CasimirManager.sol @@ -400,8 +400,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { KeeperRegistrarInterface.RegistrationParams({ name: string("CasimirV1Upkeep"), encryptedEmail: new bytes(0), - upkeepContract: address(this), - gasLimit: 0, + upkeepContract: address(upkeep), + gasLimit: 5000000, adminAddress: address(this), checkData: new bytes(0), offchainConfig: new bytes(0), diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index 03cc39fa5..ccf286e3c 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -2,7 +2,7 @@ import { ethers, network } from 'hardhat' import { loadFixture, time, setBalance } from '@nomicfoundation/hardhat-network-helpers' import { CasimirManager, CasimirRegistry, CasimirUpkeep, CasimirViews, ISSVNetworkViews } from '@casimir/ethereum/build/artifacts/types' import { fulfillReport, runUpkeep } from '@casimir/ethereum/helpers/upkeep' -import { initiateDepositHandler, reportCompletedExitsHandler } from '@casimir/ethereum/helpers/oracle' +import { depositUpkeepBalanceHandler, initiateDepositHandler, reportCompletedExitsHandler } from '@casimir/ethereum/helpers/oracle' import { round } from '@casimir/ethereum/helpers/math' import ISSVNetworkViewsJson from '@casimir/ethereum/build/artifacts/scripts/resources/ssv-network/contracts/ISSVNetworkViews.sol/ISSVNetworkViews.json' @@ -85,6 +85,10 @@ export async function secondUserDepositFixture() { const deposit = await manager.connect(secondUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await deposit.wait() + if ((await manager.upkeepId()).toNumber() === 0) { + await depositUpkeepBalanceHandler({ manager, signer: oracle }) + } + await initiateDepositHandler({ manager, signer: oracle }) await time.increase(time.duration.days(1)) diff --git a/contracts/ethereum/test/operators.ts b/contracts/ethereum/test/operators.ts index 8a909082c..542bcab4c 100644 --- a/contracts/ethereum/test/operators.ts +++ b/contracts/ethereum/test/operators.ts @@ -1,5 +1,5 @@ import { ethers, network } from 'hardhat' -import { loadFixture, setBalance } from '@nomicfoundation/hardhat-network-helpers' +import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' import { expect } from 'chai' import { deploymentFixture } from './fixtures/shared' import { ICasimirRegistry } from '../build/artifacts/types' diff --git a/contracts/ethereum/test/reports.ts b/contracts/ethereum/test/reports.ts new file mode 100644 index 000000000..e69de29bb From a68c8ca313596954329130dbd6524880fbaf7369 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Wed, 7 Jun 2023 18:10:42 -0400 Subject: [PATCH 64/78] Add collateral recovery test --- apps/web/src/composables/ssv.ts | 2 +- common/ssv/src/providers/clusters.ts | 4 +- contracts/ethereum/docs/index.md | 2042 +- contracts/ethereum/hardhat.config.ts | 1 + contracts/ethereum/helpers/oracle.ts | 9 +- contracts/ethereum/package.json | 1 + contracts/ethereum/src/v1/CasimirManager.sol | 53 +- contracts/ethereum/src/v1/CasimirPool.sol | 72 +- contracts/ethereum/src/v1/CasimirViews.sol | 19 +- .../src/v1/interfaces/ICasimirPool.sol | 33 +- .../src/v1/interfaces/ICasimirViews.sol | 15 +- contracts/ethereum/test/operators.ts | 55 +- contracts/ethereum/test/reports.ts | 0 contracts/ethereum/test/users.ts | 23 +- package-lock.json | 16748 +++++++++------- 15 files changed, 10859 insertions(+), 8218 deletions(-) delete mode 100644 contracts/ethereum/test/reports.ts diff --git a/apps/web/src/composables/ssv.ts b/apps/web/src/composables/ssv.ts index 2268e9506..5b67eb122 100644 --- a/apps/web/src/composables/ssv.ts +++ b/apps/web/src/composables/ssv.ts @@ -64,7 +64,7 @@ export default function useSSV() { const { user } = useUsers() const provider = new ethers.providers.JsonRpcProvider(ethereumURL) const userStake = await manager.connect(provider).getUserStake(address) // to get user's stake balance - const poolStake = await manager.connect(provider).totalStake() // to get total stake balance + const poolStake = await manager.connect(provider).getTotalStake() // to get total stake balance const poolIds = readyOrStake === 'ready' ? await manager.connect(provider).getReadyPoolIds() : await manager.connect(provider).getStakedPoolIds() // to get ready (open) pool IDs OR to get staked (active) pool IDs console.log('userStake :>> ', ethers.utils.formatEther(userStake)) diff --git a/common/ssv/src/providers/clusters.ts b/common/ssv/src/providers/clusters.ts index bcc44aec1..f8217dcf0 100644 --- a/common/ssv/src/providers/clusters.ts +++ b/common/ssv/src/providers/clusters.ts @@ -22,9 +22,9 @@ const eventList = [ ] /** - * Get cluster snapshot + * Get cluster details * @param {ClusterInput} input - Operator IDs and withdrawal address - * @returns {Promise} Cluster snapshot + * @returns {Promise} Cluster snapshot and required balance per validator */ export async function getClusterDetails(input: ClusterDetailsInput): Promise { const { provider, ownerAddress, operatorIds } = input diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 0a4827fc1..bc2a65f55 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -1,324 +1,288 @@ # Solidity API -## CasimirViews +## CasimirManager -### constructor +### upkeepRegistrationMinimum ```solidity -constructor(address managerAddress, address registryAddress) public +uint256 upkeepRegistrationMinimum ``` -### getCompoundablePoolIds +Minimum balance for upkeep registration (0.1 LINK) + +### feePercent ```solidity -function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5] poolIds) +uint32 feePercent ``` -Get the next five compoundable pool IDs - -_Should be called off-chain_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolIds | uint32[5] | The next five compoundable pool IDs | +Total fee percentage -### getOperators +### reportPeriod ```solidity -function getOperators(uint256 startIndex, uint256 endIndex) external view returns (struct ICasimirRegistry.Operator[]) +uint32 reportPeriod ``` -Get operators - -#### Parameters +Current report period -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | +### upkeepId -#### Return Values +```solidity +uint256 upkeepId +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | struct ICasimirRegistry.Operator[] | operators The operators | +Upkeep ID -### getPendingValidatorPublicKeys +### latestActiveBalance ```solidity -function getPendingValidatorPublicKeys(uint256 startIndex, uint256 endIndex) external view returns (bytes[]) +uint256 latestActiveBalance ``` -Get the pending validator public keys - -#### Parameters +Latest active balance -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | +### finalizableCompletedExits -#### Return Values +```solidity +uint256 finalizableCompletedExits +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes[] | validatorPublicKeys The pending validator public keys | +Exited pool count -### getStakedValidatorPublicKeys +### requestedWithdrawalBalance ```solidity -function getStakedValidatorPublicKeys(uint256 startIndex, uint256 endIndex) external view returns (bytes[]) +uint256 requestedWithdrawalBalance ``` -Get the staked validator public keys - -#### Parameters +Total pending withdrawal amount -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | +### onlyPool -#### Return Values +```solidity +modifier onlyPool(uint32 poolId) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes[] | validatorPublicKeys The staked validator public keys | +_Validate the caller is the authorized pool_ -### getPoolDetails +### onlyOracle ```solidity -function getPoolDetails(uint32 poolId) external view returns (struct ICasimirViews.PoolDetails poolDetails) +modifier onlyOracle() ``` -Get a pool's details by ID - -#### Parameters +_Validate the caller is the manager oracle_ -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | +### onlyOracleOrRegistry -#### Return Values +```solidity +modifier onlyOracleOrRegistry() +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolDetails | struct ICasimirViews.PoolDetails | The pool details | +_Validate the caller is the oracle or registry_ -### getSweptBalance +### onlyOracleOrUpkeep ```solidity -function getSweptBalance(uint256 startIndex, uint256 endIndex) public view returns (uint256 balance) +modifier onlyOracleOrUpkeep() ``` -Get the swept balance +_Validate the caller is the oracle or upkeep_ -_Should be called off-chain_ +### onlyRegistry -#### Parameters +```solidity +modifier onlyRegistry() +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | +_Validate the caller is the registry_ -#### Return Values +### onlyUpkeep -| Name | Type | Description | -| ---- | ---- | ----------- | -| balance | uint256 | The swept balance | +```solidity +modifier onlyUpkeep() +``` -## ICasimirManager +_Validate the caller is the upkeep contract_ -### Token +### validDeposit ```solidity -enum Token { - LINK, - SSV, - WETH -} +modifier validDeposit() ``` -### User +_Validate a deposit_ + +### validWithdrawal ```solidity -struct User { - uint256 stake0; - uint256 stakeRatioSum0; - uint256 actionPeriodTimestamp; - uint256 actionCount; -} +modifier validWithdrawal(uint256 amount) ``` -### Withdrawal +_Validate a withdrawal_ + +### validDistribution ```solidity -struct Withdrawal { - address user; - uint256 amount; - uint256 period; -} +modifier validDistribution(uint256 amount) ``` -### DepositRequested +_Validate a distribution_ -```solidity -event DepositRequested(uint32 poolId) -``` +#### Parameters -### DepositInitiated +| Name | Type | Description | +| ---- | ---- | ----------- | +| amount | uint256 | The amount to validate | + +### constructor ```solidity -event DepositInitiated(uint32 poolId) +constructor(address _oracleAddress, address beaconDepositAddress, address linkFunctionsAddress, address linkRegistrarAddress, address linkRegistryAddress, address linkTokenAddress, address ssvNetworkAddress, address ssvNetworkViewsAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public ``` -### DepositActivated +Constructor -```solidity -event DepositActivated(uint32 poolId) -``` +#### Parameters -### ResharesRequested +| Name | Type | Description | +| ---- | ---- | ----------- | +| _oracleAddress | address | The manager oracle address | +| beaconDepositAddress | address | The Beacon deposit address | +| linkFunctionsAddress | address | The Chainlink functions oracle address | +| linkRegistrarAddress | address | The Chainlink keeper registrar address | +| linkRegistryAddress | address | The Chainlink keeper registry address | +| linkTokenAddress | address | The Chainlink token address | +| ssvNetworkAddress | address | The SSV network address | +| ssvNetworkViewsAddress | address | The SSV network views address | +| ssvTokenAddress | address | The SSV token address | +| swapFactoryAddress | address | The Uniswap factory address | +| swapRouterAddress | address | The Uniswap router address | +| wethTokenAddress | address | The WETH contract address | + +### receive ```solidity -event ResharesRequested(uint64 operatorId) +receive() external payable ``` -### ReshareCompleted +Receive and deposit validator tips + +### depositStake ```solidity -event ReshareCompleted(uint32 poolId) +function depositStake() external payable ``` -### ExitRequested +Deposit user stake + +### depositRewards ```solidity -event ExitRequested(uint32 poolId) +function depositRewards() external payable ``` -### ForcedExitReportsRequested +Deposit a given amount of rewards + +### depositExitedBalance ```solidity -event ForcedExitReportsRequested(uint256 count) +function depositExitedBalance(uint32 poolId) external payable ``` -### SlashedExitReportsRequested +Deposit exited balance from a given pool ID -```solidity -event SlashedExitReportsRequested(uint256 count) -``` +#### Parameters -### CompletedExitReportsRequested +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolId | uint32 | The pool ID | + +### depositRecoveredBalance ```solidity -event CompletedExitReportsRequested(uint256 count) +function depositRecoveredBalance(uint32 poolId) external payable ``` -### ExitCompleted +Deposit recovered balance for a given pool from an operator -```solidity -event ExitCompleted(uint32 poolId) -``` +#### Parameters -### StakeDeposited +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolId | uint32 | The pool ID | + +### depositClusterBalance ```solidity -event StakeDeposited(address sender, uint256 amount) +function depositClusterBalance(uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external ``` -### StakeRebalanced +Deposit to a cluster balance -```solidity -event StakeRebalanced(uint256 amount) -``` - -### RewardsDeposited - -```solidity -event RewardsDeposited(uint256 amount) -``` - -### TipsDeposited +#### Parameters -```solidity -event TipsDeposited(uint256 amount) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorIds | uint64[] | The operator IDs | +| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | +| feeAmount | uint256 | The fee amount to deposit | +| processed | bool | Whether the fee amount is already processed | -### WithdrawalRequested +### depositUpkeepBalance ```solidity -event WithdrawalRequested(address sender, uint256 amount) +function depositUpkeepBalance(uint256 feeAmount, bool processed) external ``` -### WithdrawalInitiated - -```solidity -event WithdrawalInitiated(address sender, uint256 amount) -``` +Deposit to the upkeep balance -### WithdrawalFulfilled +#### Parameters -```solidity -event WithdrawalFulfilled(address sender, uint256 amount) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| feeAmount | uint256 | The fee amount to deposit | +| processed | bool | Whether the fee amount is already processed | -### depositStake +### depositReservedFees ```solidity -function depositStake() external payable +function depositReservedFees() external payable ``` -### depositRewards - -```solidity -function depositRewards() external payable -``` +Deposit reserved fees -### depositExitedBalance +### withdrawReservedFees ```solidity -function depositExitedBalance(uint32 poolId) external payable +function withdrawReservedFees(uint256 amount) external ``` -### depositRecoveredBalance - -```solidity -function depositRecoveredBalance(uint32 poolId) external payable -``` +Withdraw a given amount of reserved fees -### depositReservedFees +#### Parameters -```solidity -function depositReservedFees() external payable -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| amount | uint256 | The amount of fees to withdraw | -### depositClusterBalance +### rebalanceStake ```solidity -function depositClusterBalance(uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external +function rebalanceStake(uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, uint256 completedExits) external ``` -### depositUpkeepBalance - -```solidity -function depositUpkeepBalance(uint256 feeAmount, bool processed) external -``` +Rebalance the rewards to stake ratio and redistribute swept rewards -### rebalanceStake +#### Parameters -```solidity -function rebalanceStake(uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, uint256 completedExits) external -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| activeBalance | uint256 | The active balance | +| sweptBalance | uint256 | The swept balance | +| activatedDeposits | uint256 | The count of activated deposits | +| completedExits | uint256 | The count of withdrawn exits | ### compoundRewards @@ -326,1567 +290,1416 @@ function rebalanceStake(uint256 activeBalance, uint256 sweptBalance, uint256 act function compoundRewards(uint32[5] poolIds) external ``` +Compound rewards given a list of pool IDs + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolIds | uint32[5] | The list of pool IDs | + ### requestWithdrawal ```solidity function requestWithdrawal(uint256 amount) external ``` +Request to withdraw user stake + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| amount | uint256 | The amount of stake to withdraw | + ### fulfillWithdrawals ```solidity function fulfillWithdrawals(uint256 count) external ``` +Fulfill a given count of pending withdrawals + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| count | uint256 | The number of withdrawals to complete | + ### initiateDeposit ```solidity function initiateDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external ``` +Initiate the next ready pool + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| depositDataRoot | bytes32 | The deposit data root | +| publicKey | bytes | The validator public key | +| signature | bytes | The signature | +| withdrawalCredentials | bytes | The withdrawal credentials | +| operatorIds | uint64[] | The operator IDs | +| shares | bytes | The operator shares | +| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | +| feeAmount | uint256 | The fee amount to deposit | +| processed | bool | | + ### activateDeposits ```solidity function activateDeposits(uint256 count) external ``` +Activate a given count of the next pending pools + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| count | uint256 | The number of pools to activate | + ### requestForcedExitReports ```solidity function requestForcedExitReports(uint256 count) external ``` -### requestCompletedExitReports - -```solidity -function requestCompletedExitReports(uint256 count) external -``` +Request reports a given count of forced exits -### requestReshares +#### Parameters -```solidity -function requestReshares(uint64 operatorId) external -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| count | uint256 | The number of forced exits | -### reportForcedExits +### requestCompletedExitReports ```solidity -function reportForcedExits(uint32[] poolIds) external +function requestCompletedExitReports(uint256 count) external ``` -### reportCompletedExit - -```solidity -function reportCompletedExit(uint256 poolIndex, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external -``` +Request reports for a given count of completed exits -### reportReshare +#### Parameters -```solidity -function reportReshare(uint32 poolId, uint64[] operatorIds, uint64[] oldOperatorIds, uint64 newOperatorId, uint64 oldOperatorId, bytes shares, struct ISSVNetworkCore.Cluster cluster, struct ISSVNetworkCore.Cluster oldCluster, uint256 feeAmount, bool processed) external -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| count | uint256 | The number of completed exits | -### withdrawLINKBalance +### requestReshares ```solidity -function withdrawLINKBalance(uint256 amount) external +function requestReshares(uint64 operatorId) external ``` -### withdrawSSVBalance - -```solidity -function withdrawSSVBalance(uint256 amount) external -``` +Request reshares for an operator -### setFunctionsAddress +#### Parameters -```solidity -function setFunctionsAddress(address functionsAddress) external -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| operatorId | uint64 | The operator ID | -### upkeepId +### reportForcedExits ```solidity -function upkeepId() external view returns (uint256) +function reportForcedExits(uint32[] poolIds) external ``` -### latestActiveBalance - -```solidity -function latestActiveBalance() external view returns (uint256) -``` +Report pool forced (unrequested) exits -### feePercent +#### Parameters -```solidity -function feePercent() external view returns (uint32) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolIds | uint32[] | The pool IDs | -### requestedWithdrawalBalance +### reportCompletedExit ```solidity -function requestedWithdrawalBalance() external view returns (uint256) +function reportCompletedExit(uint256 poolIndex, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external ``` -### finalizableCompletedExits - -```solidity -function finalizableCompletedExits() external view returns (uint256) -``` +Report a completed exit -### reportPeriod +#### Parameters -```solidity -function reportPeriod() external view returns (uint32) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolIndex | uint256 | The staked pool index | +| blamePercents | uint32[] | The operator blame percents (0 if balance is 32 ether) | +| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | -### getTotalStake +### reportReshare ```solidity -function getTotalStake() external view returns (uint256) +function reportReshare(uint32 poolId, uint64[] operatorIds, uint64[] oldOperatorIds, uint64 newOperatorId, uint64 oldOperatorId, bytes shares, struct ISSVNetworkCore.Cluster cluster, struct ISSVNetworkCore.Cluster oldCluster, uint256 feeAmount, bool processed) external ``` -### getReadyPoolIds - -```solidity -function getReadyPoolIds() external view returns (uint32[]) -``` +Report a reshare -### getPendingPoolIds +#### Parameters -```solidity -function getPendingPoolIds() external view returns (uint32[]) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolId | uint32 | The pool ID | +| operatorIds | uint64[] | The operator IDs | +| oldOperatorIds | uint64[] | The old operator IDs | +| newOperatorId | uint64 | The new operator ID | +| oldOperatorId | uint64 | The old operator ID | +| shares | bytes | The operator shares | +| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | +| oldCluster | struct ISSVNetworkCore.Cluster | The old SSV cluster snapshot | +| feeAmount | uint256 | The fee amount to deposit | +| processed | bool | Whether the fee amount is already processed | -### getStakedPoolIds +### withdrawUpkeepBalance ```solidity -function getStakedPoolIds() external view returns (uint32[]) +function withdrawUpkeepBalance() external ``` -### getBufferedBalance - -```solidity -function getBufferedBalance() external view returns (uint256) -``` +Cancel upkeep and withdraw the upkeep balance -### getExpectedEffectiveBalance +### withdrawLINKBalance ```solidity -function getExpectedEffectiveBalance() external view returns (uint256) +function withdrawLINKBalance(uint256 amount) external ``` -### getPendingWithdrawalEligibility - -```solidity -function getPendingWithdrawalEligibility(uint256 index, uint256 period) external view returns (bool) -``` +Withdraw a given amount from the LINK balance -### getWithdrawableBalance +#### Parameters -```solidity -function getWithdrawableBalance() external view returns (uint256) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| amount | uint256 | The amount to withdraw | -### getUserStake +### withdrawSSVBalance ```solidity -function getUserStake(address userAddress) external view returns (uint256) +function withdrawSSVBalance(uint256 amount) external ``` -### getPoolAddress - -```solidity -function getPoolAddress(uint32 poolId) external view returns (address) -``` +Withdraw a given amount from the SSV balance -### getRegistryAddress +#### Parameters -```solidity -function getRegistryAddress() external view returns (address) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| amount | uint256 | The amount to withdraw | -### getUpkeepAddress +### setFunctionsAddress ```solidity -function getUpkeepAddress() external view returns (address) +function setFunctionsAddress(address functionsAddress) external ``` -### getUpkeepBalance +Update the functions oracle address -```solidity -function getUpkeepBalance() external view returns (uint256 upkeepBalance) -``` +#### Parameters -## ICasimirPool +| Name | Type | Description | +| ---- | ---- | ----------- | +| functionsAddress | address | New functions oracle address | -### PoolConfig +### getUserStake ```solidity -struct PoolConfig { - uint32 poolId; - bytes publicKey; - uint64[] operatorIds; - uint256 reshares; - enum ICasimirPool.PoolStatus status; -} +function getUserStake(address userAddress) public view returns (uint256 userStake) ``` -### PoolStatus - -```solidity -enum PoolStatus { - PENDING, - ACTIVE, - EXITING_FORCED, - EXITING_REQUESTED, - WITHDRAWN -} -``` +Get the total user stake for a given user address -### depositRewards +#### Parameters -```solidity -function depositRewards() external -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| userAddress | address | The user address | -### withdrawBalance +#### Return Values -```solidity -function withdrawBalance(uint32[] blamePercents) external -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| userStake | uint256 | The total user stake | -### setOperatorIds +### getTotalStake ```solidity -function setOperatorIds(uint64[] operatorIds) external +function getTotalStake() public view returns (uint256 totalStake) ``` -### setReshares - -```solidity -function setReshares(uint256 reshares) external -``` +Get the total stake -### setStatus +#### Return Values -```solidity -function setStatus(enum ICasimirPool.PoolStatus status) external -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| totalStake | uint256 | The total stake | -### getBalance +### getBufferedBalance ```solidity -function getBalance() external view returns (uint256) +function getBufferedBalance() public view returns (uint256 bufferedBalance) ``` -### getConfig - -```solidity -function getConfig() external view returns (struct ICasimirPool.PoolConfig) -``` +Get the buffered balance -### getOperatorIds +#### Return Values -```solidity -function getOperatorIds() external view returns (uint64[]) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| bufferedBalance | uint256 | The buffered balance | -### getPublicKey +### getReadyBalance ```solidity -function getPublicKey() external view returns (bytes) +function getReadyBalance() public view returns (uint256 readyBalance) ``` -### getStatus +Get the ready balance -```solidity -function getStatus() external view returns (enum ICasimirPool.PoolStatus) -``` +#### Return Values -## ICasimirRegistry +| Name | Type | Description | +| ---- | ---- | ----------- | +| readyBalance | uint256 | The ready balance | -### OperatorRegistered +### getWithdrawableBalance ```solidity -event OperatorRegistered(uint64 operatorId) +function getWithdrawableBalance() public view returns (uint256) ``` -### DeregistrationRequested - -```solidity -event DeregistrationRequested(uint64 operatorId) -``` +Get the withdrawable balanace -### DeregistrationCompleted +#### Return Values -```solidity -event DeregistrationCompleted(uint64 operatorId) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | withdrawableBalance The withdrawable balanace | -### Operator +### getReservedFeeBalance ```solidity -struct Operator { - uint64 id; - bool active; - bool resharing; - int256 collateral; - uint256 poolCount; -} +function getReservedFeeBalance() public view returns (uint256) ``` -### registerOperator - -```solidity -function registerOperator(uint64 operatorId) external payable -``` +Get the reserved fee balance -### depositCollateral +#### Return Values -```solidity -function depositCollateral(uint64 operatorId) external payable -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | reservedFeeBalance The reserved fee balance | -### withdrawCollateral +### getExpectedEffectiveBalance ```solidity -function withdrawCollateral(uint64 operatorId, uint256 amount) external +function getExpectedEffectiveBalance() public view returns (uint256 expectedEffectiveBalance) ``` -### requestDeregistration - -```solidity -function requestDeregistration(uint64 operatorId) external -``` +Get the expected effective balance -### addOperatorPool +#### Return Values -```solidity -function addOperatorPool(uint64 operatorId, uint32 poolId) external -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| expectedEffectiveBalance | uint256 | The expected effective balance | -### removeOperatorPool +### getPendingWithdrawalEligibility ```solidity -function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external +function getPendingWithdrawalEligibility(uint256 index, uint256 period) public view returns (bool) ``` -### getOperator +Get the eligibility of a pending withdrawal -```solidity -function getOperator(uint64 operatorId) external view returns (struct ICasimirRegistry.Operator) -``` +#### Parameters -### getOperatorIds +| Name | Type | Description | +| ---- | ---- | ----------- | +| index | uint256 | The index of the pending withdrawal | +| period | uint256 | The period to check | -```solidity -function getOperatorIds() external view returns (uint64[]) -``` +#### Return Values -## ICasimirViews +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bool | pendingWithdrawalEligibility The eligibility of a pending withdrawal | -### PoolDetails +### getReadyPoolIds ```solidity -struct PoolDetails { - uint32 id; - uint256 balance; - bytes publicKey; - uint64[] operatorIds; - enum ICasimirPool.PoolStatus status; -} +function getReadyPoolIds() external view returns (uint32[]) ``` -### getCompoundablePoolIds - -```solidity -function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5]) -``` +Get the ready pool IDs -### getOperators +#### Return Values -```solidity -function getOperators(uint256 startIndex, uint256 endIndex) external view returns (struct ICasimirRegistry.Operator[]) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32[] | readyPoolIds The ready pool IDs | -### getPoolDetails +### getPendingPoolIds ```solidity -function getPoolDetails(uint32 poolId) external view returns (struct ICasimirViews.PoolDetails) +function getPendingPoolIds() external view returns (uint32[]) ``` -### getPendingValidatorPublicKeys +Get the pending pool IDs -```solidity -function getPendingValidatorPublicKeys(uint256 startIndex, uint256 endIndex) external view returns (bytes[]) -``` +#### Return Values -### getStakedValidatorPublicKeys +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32[] | pendingPoolIds The pending pool IDs | + +### getStakedPoolIds ```solidity -function getStakedValidatorPublicKeys(uint256 startIndex, uint256 endIndex) external view returns (bytes[]) +function getStakedPoolIds() external view returns (uint32[]) ``` -### getSweptBalance +Get the staked pool IDs -```solidity -function getSweptBalance(uint256 startIndex, uint256 endIndex) external view returns (uint256) -``` +#### Return Values -## CasimirManager +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint32[] | stakedPoolIds The staked pool IDs | -### upkeepRegistrationMinimum +### getPoolAddress ```solidity -uint256 upkeepRegistrationMinimum +function getPoolAddress(uint32 poolId) external view returns (address) ``` -Minimum balance for upkeep registration (0.1 LINK) +Get a pool's address by ID -### feePercent +#### Parameters -```solidity -uint32 feePercent -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolId | uint32 | The pool ID | -Total fee percentage +#### Return Values -### reportPeriod +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | address | poolAddress The pool address | + +### getRegistryAddress ```solidity -uint32 reportPeriod +function getRegistryAddress() external view returns (address registryAddress) ``` -Current report period - -### upkeepId +Get the registry address -```solidity -uint256 upkeepId -``` +#### Return Values -Upkeep ID +| Name | Type | Description | +| ---- | ---- | ----------- | +| registryAddress | address | The registry address | -### latestActiveBalance +### getUpkeepAddress ```solidity -uint256 latestActiveBalance +function getUpkeepAddress() external view returns (address upkeepAddress) ``` -Latest active balance - -### finalizableCompletedExits +Get the upkeep address -```solidity -uint256 finalizableCompletedExits -``` +#### Return Values -Exited pool count +| Name | Type | Description | +| ---- | ---- | ----------- | +| upkeepAddress | address | The upkeep address | -### requestedWithdrawalBalance +### getUpkeepBalance ```solidity -uint256 requestedWithdrawalBalance +function getUpkeepBalance() external view returns (uint256 upkeepBalance) ``` -Total pending withdrawal amount +Get the upkeep balance -### onlyPool +#### Return Values -```solidity -modifier onlyPool(uint32 poolId) -``` +| Name | Type | Description | +| ---- | ---- | ----------- | +| upkeepBalance | uint256 | The upkeep balance | -_Validate the caller is the authorized pool_ +## CasimirPool -### onlyOracle +### poolCapacity ```solidity -modifier onlyOracle() +uint256 poolCapacity ``` -_Validate the caller is the manager oracle_ - -### onlyOracleOrRegistry +### constructor ```solidity -modifier onlyOracleOrRegistry() +constructor(address registryAddress, uint32 poolId, bytes publicKey, uint64[] operatorIds) public ``` -_Validate the caller is the oracle or registry_ - -### onlyOracleOrUpkeep +### depositRewards ```solidity -modifier onlyOracleOrUpkeep() +function depositRewards() external ``` -_Validate the caller is the oracle or upkeep_ - -### onlyRegistry +### withdrawBalance ```solidity -modifier onlyRegistry() +function withdrawBalance(uint32[] blamePercents) external ``` -_Validate the caller is the registry_ - -### onlyUpkeep +### setOperatorIds ```solidity -modifier onlyUpkeep() +function setOperatorIds(uint64[] operatorIds) external ``` -_Validate the caller is the upkeep contract_ - -### validDeposit +### setReshares ```solidity -modifier validDeposit() +function setReshares(uint256 reshares) external ``` -_Validate a deposit_ - -### validWithdrawal +### setStatus ```solidity -modifier validWithdrawal(uint256 amount) +function setStatus(enum ICasimirPool.PoolStatus status) external ``` -_Validate a withdrawal_ - -### validDistribution +### getBalance ```solidity -modifier validDistribution(uint256 amount) +function getBalance() external view returns (uint256) ``` -_Validate a distribution_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| amount | uint256 | The amount to validate | - -### constructor +### getConfig ```solidity -constructor(address _oracleAddress, address beaconDepositAddress, address linkFunctionsAddress, address linkRegistrarAddress, address linkRegistryAddress, address linkTokenAddress, address ssvNetworkAddress, address ssvNetworkViewsAddress, address ssvTokenAddress, address swapFactoryAddress, address swapRouterAddress, address wethTokenAddress) public +function getConfig() external view returns (struct ICasimirPool.PoolConfig) ``` -Constructor - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _oracleAddress | address | The manager oracle address | -| beaconDepositAddress | address | The Beacon deposit address | -| linkFunctionsAddress | address | The Chainlink functions oracle address | -| linkRegistrarAddress | address | The Chainlink keeper registrar address | -| linkRegistryAddress | address | The Chainlink keeper registry address | -| linkTokenAddress | address | The Chainlink token address | -| ssvNetworkAddress | address | The SSV network address | -| ssvNetworkViewsAddress | address | The SSV network views address | -| ssvTokenAddress | address | The SSV token address | -| swapFactoryAddress | address | The Uniswap factory address | -| swapRouterAddress | address | The Uniswap router address | -| wethTokenAddress | address | The WETH contract address | - -### receive +### getOperatorIds ```solidity -receive() external payable +function getOperatorIds() external view returns (uint64[]) ``` -Receive and deposit validator tips - -### depositStake +### getPublicKey ```solidity -function depositStake() external payable +function getPublicKey() external view returns (bytes) ``` -Deposit user stake - -### depositRewards +### getStatus ```solidity -function depositRewards() external payable +function getStatus() external view returns (enum ICasimirPool.PoolStatus) ``` -Deposit a given amount of rewards +## CasimirRegistry -### depositExitedBalance +### onlyOwnerOrPool ```solidity -function depositExitedBalance(uint32 poolId) external payable +modifier onlyOwnerOrPool(uint32 poolId) ``` -Deposit exited balance from a given pool ID +_Validate the caller is owner or the authorized pool_ -#### Parameters +### constructor -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | +```solidity +constructor(address ssvNetworkViewsAddress) public +``` -### depositRecoveredBalance +### registerOperator ```solidity -function depositRecoveredBalance(uint32 poolId) external payable +function registerOperator(uint64 operatorId) external payable ``` -Deposit recovered balance for a given pool from an operator +Register an operator with the set #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | +| operatorId | uint64 | The operator ID | -### depositClusterBalance +### depositCollateral ```solidity -function depositClusterBalance(uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external +function depositCollateral(uint64 operatorId) external payable ``` -Deposit to a cluster balance +Deposit collateral for an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| operatorIds | uint64[] | The operator IDs | -| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | -| feeAmount | uint256 | The fee amount to deposit | -| processed | bool | Whether the fee amount is already processed | +| operatorId | uint64 | The operator ID | -### depositUpkeepBalance +### withdrawCollateral ```solidity -function depositUpkeepBalance(uint256 feeAmount, bool processed) external +function withdrawCollateral(uint64 operatorId, uint256 amount) external ``` -Deposit to the upkeep balance +Withdraw collateral from an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| feeAmount | uint256 | The fee amount to deposit | -| processed | bool | Whether the fee amount is already processed | - -### depositReservedFees - -```solidity -function depositReservedFees() external payable -``` - -Deposit reserved fees +| operatorId | uint64 | The operator ID | +| amount | uint256 | The amount to withdraw | -### withdrawReservedFees +### requestDeregistration ```solidity -function withdrawReservedFees(uint256 amount) external +function requestDeregistration(uint64 operatorId) external ``` -Withdraw a given amount of reserved fees +Request deregistration for an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| amount | uint256 | The amount of fees to withdraw | +| operatorId | uint64 | The operator ID | -### rebalanceStake +### addOperatorPool ```solidity -function rebalanceStake(uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, uint256 completedExits) external +function addOperatorPool(uint64 operatorId, uint32 poolId) external ``` -Rebalance the rewards to stake ratio and redistribute swept rewards +Add a pool to an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| activeBalance | uint256 | The active balance | -| sweptBalance | uint256 | The swept balance | -| activatedDeposits | uint256 | The count of activated deposits | -| completedExits | uint256 | The count of withdrawn exits | +| operatorId | uint64 | The operator ID | +| poolId | uint32 | The pool ID | -### compoundRewards +### removeOperatorPool ```solidity -function compoundRewards(uint32[5] poolIds) external +function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external ``` -Compound rewards given a list of pool IDs +Remove a pool from an operator #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| poolIds | uint32[5] | The list of pool IDs | +| operatorId | uint64 | The operator ID | +| poolId | uint32 | The pool ID | +| blameAmount | uint256 | The amount to recover from collateral | -### requestWithdrawal +### getOperator ```solidity -function requestWithdrawal(uint256 amount) external +function getOperator(uint64 operatorId) external view returns (struct ICasimirRegistry.Operator operator) ``` -Request to withdraw user stake +Get an operator by ID #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| amount | uint256 | The amount of stake to withdraw | +| operatorId | uint64 | The operator ID | -### fulfillWithdrawals +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| operator | struct ICasimirRegistry.Operator | The operator | + +### getOperatorIds ```solidity -function fulfillWithdrawals(uint256 count) external +function getOperatorIds() external view returns (uint64[]) ``` -Fulfill a given count of pending withdrawals +Get the operator IDs -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| count | uint256 | The number of withdrawals to complete | +| [0] | uint64[] | operatorIds The operator IDs | -### initiateDeposit +## CasimirUpkeep + +### reportHeartbeat ```solidity -function initiateDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external +uint256 reportHeartbeat ``` -Initiate the next ready pool +Oracle heartbeat -#### Parameters +### poolCapacity -| Name | Type | Description | -| ---- | ---- | ----------- | -| depositDataRoot | bytes32 | The deposit data root | -| publicKey | bytes | The validator public key | -| signature | bytes | The signature | -| withdrawalCredentials | bytes | The withdrawal credentials | -| operatorIds | uint64[] | The operator IDs | -| shares | bytes | The operator shares | -| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | -| feeAmount | uint256 | The fee amount to deposit | -| processed | bool | | +```solidity +uint256 poolCapacity +``` -### activateDeposits +Pool capacity + +### reportPeriod ```solidity -function activateDeposits(uint256 count) external +uint32 reportPeriod ``` -Activate a given count of the next pending pools +Current report period -#### Parameters +### reportRemainingRequests -| Name | Type | Description | -| ---- | ---- | ----------- | -| count | uint256 | The number of pools to activate | +```solidity +uint256 reportRemainingRequests +``` -### requestForcedExitReports +Current report remaining request count + +### reportRequestBlock ```solidity -function requestForcedExitReports(uint256 count) external +uint256 reportRequestBlock ``` -Request reports a given count of forced exits +Current report block -#### Parameters +### reportCompoundablePoolIds -| Name | Type | Description | -| ---- | ---- | ----------- | -| count | uint256 | The number of forced exits | +```solidity +uint32[5] reportCompoundablePoolIds +``` -### requestCompletedExitReports +Current report compoundable pools + +### finalizableCompoundablePoolIds ```solidity -function requestCompletedExitReports(uint256 count) external +uint32[5] finalizableCompoundablePoolIds ``` -Request reports for a given count of completed exits +Finalizable compoundable pools -#### Parameters +### requestCBOR -| Name | Type | Description | -| ---- | ---- | ----------- | -| count | uint256 | The number of completed exits | +```solidity +bytes requestCBOR +``` -### requestReshares +Binary request source code + +### fulfillGasLimit ```solidity -function requestReshares(uint64 operatorId) external +uint32 fulfillGasLimit ``` -Request reshares for an operator +Fulfillment gas limit + +### constructor + +```solidity +constructor(address linkFunctionsAddress) public +``` + +Constructor #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +| linkFunctionsAddress | address | The functions oracle contract address | -### reportForcedExits +### generateRequest ```solidity -function reportForcedExits(uint32[] poolIds) external +function generateRequest(string source, bytes secrets, string[] args) public pure returns (bytes) ``` -Report pool forced (unrequested) exits +Generate a new Functions.Request(off-chain, saving gas) #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| poolIds | uint32[] | The pool IDs | +| source | string | JavaScript source code | +| secrets | bytes | Encrypted secrets payload | +| args | string[] | List of arguments accessible from within the source code | -### reportCompletedExit +### setRequest ```solidity -function reportCompletedExit(uint256 poolIndex, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external +function setRequest(uint32 _fulfillGasLimit, uint64 _linkSubscriptionId, bytes _requestCBOR) external ``` -Report a completed exit +Set the bytes representing the CBOR-encoded Functions.Request #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| poolIndex | uint256 | The staked pool index | -| blamePercents | uint32[] | The operator blame percents (0 if balance is 32 ether) | -| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | +| _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | +| _linkSubscriptionId | uint64 | The functions billing subscription ID used to pay for Functions requests | +| _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | -### reportReshare +### checkUpkeep ```solidity -function reportReshare(uint32 poolId, uint64[] operatorIds, uint64[] oldOperatorIds, uint64 newOperatorId, uint64 oldOperatorId, bytes shares, struct ISSVNetworkCore.Cluster cluster, struct ISSVNetworkCore.Cluster oldCluster, uint256 feeAmount, bool processed) external +function checkUpkeep(bytes) public view returns (bool upkeepNeeded, bytes) ``` -Report a reshare +Check if the upkeep is needed -#### Parameters +#### Return Values | Name | Type | Description | | ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | -| operatorIds | uint64[] | The operator IDs | -| oldOperatorIds | uint64[] | The old operator IDs | -| newOperatorId | uint64 | The new operator ID | -| oldOperatorId | uint64 | The old operator ID | -| shares | bytes | The operator shares | -| cluster | struct ISSVNetworkCore.Cluster | The SSV cluster snapshot | -| oldCluster | struct ISSVNetworkCore.Cluster | The old SSV cluster snapshot | -| feeAmount | uint256 | The fee amount to deposit | -| processed | bool | Whether the fee amount is already processed | +| upkeepNeeded | bool | True if the upkeep is needed | +| [1] | bytes | | -### withdrawUpkeepBalance +### performUpkeep ```solidity -function withdrawUpkeepBalance() external +function performUpkeep(bytes) external ``` -Cancel upkeep and withdraw the upkeep balance +Perform the upkeep -### withdrawLINKBalance +### fulfillRequest ```solidity -function withdrawLINKBalance(uint256 amount) external +function fulfillRequest(bytes32 requestId, bytes response, bytes _error) internal ``` -Withdraw a given amount from the LINK balance +Callback that is invoked once the DON has resolved the request or hit an error #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| amount | uint256 | The amount to withdraw | +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| _error | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | -### withdrawSSVBalance +### setOracleAddress ```solidity -function withdrawSSVBalance(uint256 amount) external +function setOracleAddress(address newOracleAddress) external ``` -Withdraw a given amount from the SSV balance +Update the functions oracle address #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| amount | uint256 | The amount to withdraw | +| newOracleAddress | address | New oracle address | -### setFunctionsAddress +### encodeResponse ```solidity -function setFunctionsAddress(address functionsAddress) external +function encodeResponse(uint128 activeBalance, uint32 activatedDeposits, uint32 completedExits, uint32 slashedExits) external pure returns (bytes) ``` -Update the functions oracle address +Encode the response for testing #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| functionsAddress | address | New functions oracle address | +| activeBalance | uint128 | Active balance | +| activatedDeposits | uint32 | Count of new deposits | +| completedExits | uint32 | Count of new exits | +| slashedExits | uint32 | Count of new slashedExits | -### getUserStake +### mockFulfillRequest ```solidity -function getUserStake(address userAddress) public view returns (uint256 userStake) +function mockFulfillRequest(bytes32 requestId, bytes response, bytes err) external ``` -Get the total user stake for a given user address +Fulfill the request for testing #### Parameters | Name | Type | Description | | ---- | ---- | ----------- | -| userAddress | address | The user address | - -#### Return Values +| requestId | bytes32 | The request ID, returned by sendRequest() | +| response | bytes | Aggregated response from the user code | +| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | -| Name | Type | Description | -| ---- | ---- | ----------- | -| userStake | uint256 | The total user stake | +## ICasimirManager -### getTotalStake +### Token ```solidity -function getTotalStake() public view returns (uint256 totalStake) +enum Token { + LINK, + SSV, + WETH +} ``` -Get the total stake - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| totalStake | uint256 | The total stake | - -### getBufferedBalance +### User ```solidity -function getBufferedBalance() public view returns (uint256 bufferedBalance) -``` - -Get the buffered balance - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| bufferedBalance | uint256 | The buffered balance | +struct User { + uint256 stake0; + uint256 stakeRatioSum0; + uint256 actionPeriodTimestamp; + uint256 actionCount; +} +``` -### getReadyBalance +### Withdrawal ```solidity -function getReadyBalance() public view returns (uint256 readyBalance) +struct Withdrawal { + address user; + uint256 amount; + uint256 period; +} ``` -Get the ready balance - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| readyBalance | uint256 | The ready balance | - -### getWithdrawableBalance +### DepositRequested ```solidity -function getWithdrawableBalance() public view returns (uint256) +event DepositRequested(uint32 poolId) ``` -Get the withdrawable balanace - -#### Return Values +### DepositInitiated -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | withdrawableBalance The withdrawable balanace | +```solidity +event DepositInitiated(uint32 poolId) +``` -### getReservedFeeBalance +### DepositActivated ```solidity -function getReservedFeeBalance() public view returns (uint256) +event DepositActivated(uint32 poolId) ``` -Get the reserved fee balance - -#### Return Values +### ResharesRequested -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint256 | reservedFeeBalance The reserved fee balance | +```solidity +event ResharesRequested(uint64 operatorId) +``` -### getExpectedEffectiveBalance +### ReshareCompleted ```solidity -function getExpectedEffectiveBalance() public view returns (uint256 expectedEffectiveBalance) +event ReshareCompleted(uint32 poolId) ``` -Get the expected effective balance - -#### Return Values +### ExitRequested -| Name | Type | Description | -| ---- | ---- | ----------- | -| expectedEffectiveBalance | uint256 | The expected effective balance | +```solidity +event ExitRequested(uint32 poolId) +``` -### getPendingWithdrawalEligibility +### ForcedExitReportsRequested ```solidity -function getPendingWithdrawalEligibility(uint256 index, uint256 period) public view returns (bool) +event ForcedExitReportsRequested(uint256 count) ``` -Get the eligibility of a pending withdrawal - -#### Parameters +### SlashedExitReportsRequested -| Name | Type | Description | -| ---- | ---- | ----------- | -| index | uint256 | The index of the pending withdrawal | -| period | uint256 | The period to check | +```solidity +event SlashedExitReportsRequested(uint256 count) +``` -#### Return Values +### CompletedExitReportsRequested -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bool | pendingWithdrawalEligibility The eligibility of a pending withdrawal | +```solidity +event CompletedExitReportsRequested(uint256 count) +``` -### getReadyPoolIds +### ExitCompleted ```solidity -function getReadyPoolIds() external view returns (uint32[]) +event ExitCompleted(uint32 poolId) ``` -Get the ready pool IDs - -#### Return Values +### StakeDeposited -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32[] | readyPoolIds The ready pool IDs | +```solidity +event StakeDeposited(address sender, uint256 amount) +``` -### getPendingPoolIds +### StakeRebalanced ```solidity -function getPendingPoolIds() external view returns (uint32[]) +event StakeRebalanced(uint256 amount) ``` -Get the pending pool IDs - -#### Return Values +### RewardsDeposited -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32[] | pendingPoolIds The pending pool IDs | +```solidity +event RewardsDeposited(uint256 amount) +``` -### getStakedPoolIds +### TipsDeposited ```solidity -function getStakedPoolIds() external view returns (uint32[]) +event TipsDeposited(uint256 amount) ``` -Get the staked pool IDs - -#### Return Values +### WithdrawalRequested -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint32[] | stakedPoolIds The staked pool IDs | +```solidity +event WithdrawalRequested(address sender, uint256 amount) +``` -### getPoolAddress +### WithdrawalInitiated ```solidity -function getPoolAddress(uint32 poolId) external view returns (address) +event WithdrawalInitiated(address sender, uint256 amount) ``` -Get a pool's address by ID - -#### Parameters +### WithdrawalFulfilled -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | +```solidity +event WithdrawalFulfilled(address sender, uint256 amount) +``` -#### Return Values +### depositStake -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | address | poolAddress The pool address | +```solidity +function depositStake() external payable +``` -### getRegistryAddress +### depositRewards ```solidity -function getRegistryAddress() external view returns (address registryAddress) +function depositRewards() external payable ``` -Get the registry address - -#### Return Values +### depositExitedBalance -| Name | Type | Description | -| ---- | ---- | ----------- | -| registryAddress | address | The registry address | +```solidity +function depositExitedBalance(uint32 poolId) external payable +``` -### getUpkeepAddress +### depositRecoveredBalance ```solidity -function getUpkeepAddress() external view returns (address upkeepAddress) +function depositRecoveredBalance(uint32 poolId) external payable ``` -Get the upkeep address - -#### Return Values +### depositReservedFees -| Name | Type | Description | -| ---- | ---- | ----------- | -| upkeepAddress | address | The upkeep address | +```solidity +function depositReservedFees() external payable +``` -### getUpkeepBalance +### depositClusterBalance ```solidity -function getUpkeepBalance() external view returns (uint256 upkeepBalance) +function depositClusterBalance(uint64[] operatorIds, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external ``` -Get the upkeep balance +### depositUpkeepBalance -#### Return Values +```solidity +function depositUpkeepBalance(uint256 feeAmount, bool processed) external +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| upkeepBalance | uint256 | The upkeep balance | +### rebalanceStake -## CasimirPool +```solidity +function rebalanceStake(uint256 activeBalance, uint256 sweptBalance, uint256 activatedDeposits, uint256 completedExits) external +``` -### poolCapacity +### compoundRewards ```solidity -uint256 poolCapacity +function compoundRewards(uint32[5] poolIds) external ``` -### constructor +### requestWithdrawal ```solidity -constructor(address registryAddress, uint32 poolId, bytes publicKey, uint64[] operatorIds) public +function requestWithdrawal(uint256 amount) external ``` -### depositRewards +### fulfillWithdrawals ```solidity -function depositRewards() external +function fulfillWithdrawals(uint256 count) external ``` -### withdrawBalance +### initiateDeposit ```solidity -function withdrawBalance(uint32[] blamePercents) external +function initiateDeposit(bytes32 depositDataRoot, bytes publicKey, bytes signature, bytes withdrawalCredentials, uint64[] operatorIds, bytes shares, struct ISSVNetworkCore.Cluster cluster, uint256 feeAmount, bool processed) external ``` -### setOperatorIds +### activateDeposits ```solidity -function setOperatorIds(uint64[] operatorIds) external +function activateDeposits(uint256 count) external ``` -### setReshares +### requestForcedExitReports ```solidity -function setReshares(uint256 reshares) external +function requestForcedExitReports(uint256 count) external ``` -### setStatus +### requestCompletedExitReports ```solidity -function setStatus(enum ICasimirPool.PoolStatus status) external +function requestCompletedExitReports(uint256 count) external ``` -### getBalance +### requestReshares ```solidity -function getBalance() external view returns (uint256) +function requestReshares(uint64 operatorId) external ``` -### getConfig +### reportForcedExits ```solidity -function getConfig() external view returns (struct ICasimirPool.PoolConfig) +function reportForcedExits(uint32[] poolIds) external ``` -### getOperatorIds +### reportCompletedExit ```solidity -function getOperatorIds() external view returns (uint64[]) +function reportCompletedExit(uint256 poolIndex, uint32[] blamePercents, struct ISSVNetworkCore.Cluster cluster) external ``` -### getPublicKey +### reportReshare ```solidity -function getPublicKey() external view returns (bytes) +function reportReshare(uint32 poolId, uint64[] operatorIds, uint64[] oldOperatorIds, uint64 newOperatorId, uint64 oldOperatorId, bytes shares, struct ISSVNetworkCore.Cluster cluster, struct ISSVNetworkCore.Cluster oldCluster, uint256 feeAmount, bool processed) external ``` -### getStatus +### withdrawLINKBalance ```solidity -function getStatus() external view returns (enum ICasimirPool.PoolStatus) +function withdrawLINKBalance(uint256 amount) external ``` -## CasimirRegistry - -### onlyOwnerOrPool +### withdrawSSVBalance ```solidity -modifier onlyOwnerOrPool(uint32 poolId) +function withdrawSSVBalance(uint256 amount) external ``` -_Validate the caller is owner or the authorized pool_ - -### constructor +### setFunctionsAddress ```solidity -constructor(address ssvNetworkViewsAddress) public +function setFunctionsAddress(address functionsAddress) external ``` -### registerOperator +### upkeepId ```solidity -function registerOperator(uint64 operatorId) external payable +function upkeepId() external view returns (uint256) ``` -Register an operator with the set - -#### Parameters +### latestActiveBalance -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +```solidity +function latestActiveBalance() external view returns (uint256) +``` -### depositCollateral +### feePercent ```solidity -function depositCollateral(uint64 operatorId) external payable +function feePercent() external view returns (uint32) ``` -Deposit collateral for an operator - -#### Parameters +### requestedWithdrawalBalance -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +```solidity +function requestedWithdrawalBalance() external view returns (uint256) +``` -### withdrawCollateral +### finalizableCompletedExits ```solidity -function withdrawCollateral(uint64 operatorId, uint256 amount) external +function finalizableCompletedExits() external view returns (uint256) ``` -Withdraw collateral from an operator - -#### Parameters +### reportPeriod -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | -| amount | uint256 | The amount to withdraw | +```solidity +function reportPeriod() external view returns (uint32) +``` -### requestDeregistration +### getTotalStake ```solidity -function requestDeregistration(uint64 operatorId) external +function getTotalStake() external view returns (uint256) ``` -Request deregistration for an operator - -#### Parameters +### getReadyPoolIds -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +```solidity +function getReadyPoolIds() external view returns (uint32[]) +``` -### addOperatorPool +### getPendingPoolIds ```solidity -function addOperatorPool(uint64 operatorId, uint32 poolId) external +function getPendingPoolIds() external view returns (uint32[]) ``` -Add a pool to an operator - -#### Parameters +### getStakedPoolIds -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | -| poolId | uint32 | The pool ID | +```solidity +function getStakedPoolIds() external view returns (uint32[]) +``` -### removeOperatorPool +### getBufferedBalance ```solidity -function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external +function getBufferedBalance() external view returns (uint256) ``` -Remove a pool from an operator - -#### Parameters +### getExpectedEffectiveBalance -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | -| poolId | uint32 | The pool ID | -| blameAmount | uint256 | The amount to recover from collateral | +```solidity +function getExpectedEffectiveBalance() external view returns (uint256) +``` -### getOperator +### getPendingWithdrawalEligibility ```solidity -function getOperator(uint64 operatorId) external view returns (struct ICasimirRegistry.Operator operator) +function getPendingWithdrawalEligibility(uint256 index, uint256 period) external view returns (bool) ``` -Get an operator by ID - -#### Parameters +### getWithdrawableBalance -| Name | Type | Description | -| ---- | ---- | ----------- | -| operatorId | uint64 | The operator ID | +```solidity +function getWithdrawableBalance() external view returns (uint256) +``` -#### Return Values +### getUserStake -| Name | Type | Description | -| ---- | ---- | ----------- | -| operator | struct ICasimirRegistry.Operator | The operator | +```solidity +function getUserStake(address userAddress) external view returns (uint256) +``` -### getOperatorIds +### getPoolAddress ```solidity -function getOperatorIds() external view returns (uint64[]) +function getPoolAddress(uint32 poolId) external view returns (address) ``` -Get the operator IDs +### getRegistryAddress -#### Return Values +```solidity +function getRegistryAddress() external view returns (address) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | uint64[] | operatorIds The operator IDs | +### getUpkeepAddress -## CasimirUpkeep +```solidity +function getUpkeepAddress() external view returns (address) +``` -### reportHeartbeat +### getUpkeepBalance ```solidity -uint256 reportHeartbeat +function getUpkeepBalance() external view returns (uint256 upkeepBalance) ``` -Oracle heartbeat +## ICasimirPool -### poolCapacity +### PoolConfig ```solidity -uint256 poolCapacity +struct PoolConfig { + uint32 poolId; + bytes publicKey; + uint64[] operatorIds; + uint256 reshares; + enum ICasimirPool.PoolStatus status; +} ``` -Pool capacity - -### reportPeriod +### PoolStatus ```solidity -uint32 reportPeriod +enum PoolStatus { + PENDING, + ACTIVE, + EXITING_FORCED, + EXITING_REQUESTED, + WITHDRAWN +} ``` -Current report period - -### reportRemainingRequests +### depositRewards ```solidity -uint256 reportRemainingRequests +function depositRewards() external ``` -Current report remaining request count - -### reportRequestBlock +### withdrawBalance ```solidity -uint256 reportRequestBlock +function withdrawBalance(uint32[] blamePercents) external ``` -Current report block - -### reportCompoundablePoolIds +### setOperatorIds ```solidity -uint32[5] reportCompoundablePoolIds +function setOperatorIds(uint64[] operatorIds) external ``` -Current report compoundable pools - -### finalizableCompoundablePoolIds +### setReshares ```solidity -uint32[5] finalizableCompoundablePoolIds +function setReshares(uint256 reshares) external ``` -Finalizable compoundable pools - -### requestCBOR +### setStatus ```solidity -bytes requestCBOR +function setStatus(enum ICasimirPool.PoolStatus status) external ``` -Binary request source code - -### fulfillGasLimit +### getBalance ```solidity -uint32 fulfillGasLimit +function getBalance() external view returns (uint256) ``` -Fulfillment gas limit - -### constructor +### getConfig ```solidity -constructor(address linkFunctionsAddress) public +function getConfig() external view returns (struct ICasimirPool.PoolConfig) ``` -Constructor - -#### Parameters +### getOperatorIds -| Name | Type | Description | -| ---- | ---- | ----------- | -| linkFunctionsAddress | address | The functions oracle contract address | +```solidity +function getOperatorIds() external view returns (uint64[]) +``` -### generateRequest +### getPublicKey ```solidity -function generateRequest(string source, bytes secrets, string[] args) public pure returns (bytes) +function getPublicKey() external view returns (bytes) ``` -Generate a new Functions.Request(off-chain, saving gas) +### getStatus -#### Parameters +```solidity +function getStatus() external view returns (enum ICasimirPool.PoolStatus) +``` -| Name | Type | Description | -| ---- | ---- | ----------- | -| source | string | JavaScript source code | -| secrets | bytes | Encrypted secrets payload | -| args | string[] | List of arguments accessible from within the source code | +## ICasimirRegistry -### setRequest +### OperatorRegistered ```solidity -function setRequest(uint32 _fulfillGasLimit, uint64 _linkSubscriptionId, bytes _requestCBOR) external +event OperatorRegistered(uint64 operatorId) ``` -Set the bytes representing the CBOR-encoded Functions.Request - -#### Parameters +### DeregistrationRequested -| Name | Type | Description | -| ---- | ---- | ----------- | -| _fulfillGasLimit | uint32 | Maximum amount of gas used to call the client contract's `handleOracleFulfillment` function | -| _linkSubscriptionId | uint64 | The functions billing subscription ID used to pay for Functions requests | -| _requestCBOR | bytes | Bytes representing the CBOR-encoded Functions.Request | +```solidity +event DeregistrationRequested(uint64 operatorId) +``` -### checkUpkeep +### DeregistrationCompleted ```solidity -function checkUpkeep(bytes) public view returns (bool upkeepNeeded, bytes) +event DeregistrationCompleted(uint64 operatorId) ``` -Check if the upkeep is needed - -#### Return Values +### Operator -| Name | Type | Description | -| ---- | ---- | ----------- | -| upkeepNeeded | bool | True if the upkeep is needed | -| [1] | bytes | | +```solidity +struct Operator { + uint64 id; + bool active; + bool resharing; + int256 collateral; + uint256 poolCount; +} +``` -### performUpkeep +### registerOperator ```solidity -function performUpkeep(bytes) external +function registerOperator(uint64 operatorId) external payable ``` -Perform the upkeep - -### fulfillRequest +### depositCollateral ```solidity -function fulfillRequest(bytes32 requestId, bytes response, bytes _error) internal +function depositCollateral(uint64 operatorId) external payable ``` -Callback that is invoked once the DON has resolved the request or hit an error - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The request ID, returned by sendRequest() | -| response | bytes | Aggregated response from the user code | -| _error | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | - -### setOracleAddress +### withdrawCollateral ```solidity -function setOracleAddress(address newOracleAddress) external +function withdrawCollateral(uint64 operatorId, uint256 amount) external ``` -Update the functions oracle address - -#### Parameters +### requestDeregistration -| Name | Type | Description | -| ---- | ---- | ----------- | -| newOracleAddress | address | New oracle address | +```solidity +function requestDeregistration(uint64 operatorId) external +``` -### encodeResponse +### addOperatorPool ```solidity -function encodeResponse(uint128 activeBalance, uint32 activatedDeposits, uint32 completedExits, uint32 slashedExits) external pure returns (bytes) +function addOperatorPool(uint64 operatorId, uint32 poolId) external ``` -Encode the response for testing - -#### Parameters +### removeOperatorPool -| Name | Type | Description | -| ---- | ---- | ----------- | -| activeBalance | uint128 | Active balance | -| activatedDeposits | uint32 | Count of new deposits | -| completedExits | uint32 | Count of new exits | -| slashedExits | uint32 | Count of new slashedExits | +```solidity +function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external +``` -### mockFulfillRequest +### getOperator ```solidity -function mockFulfillRequest(bytes32 requestId, bytes response, bytes err) external +function getOperator(uint64 operatorId) external view returns (struct ICasimirRegistry.Operator) ``` -Fulfill the request for testing - -#### Parameters +### getOperatorIds -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | The request ID, returned by sendRequest() | -| response | bytes | Aggregated response from the user code | -| err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | +```solidity +function getOperatorIds() external view returns (uint64[]) +``` ## ICasimirUpkeep @@ -2149,6 +1962,193 @@ struct RegistrationParams { function registerUpkeep(struct KeeperRegistrarInterface.RegistrationParams requestParams) external returns (uint256) ``` +## CasimirViews + +### constructor + +```solidity +constructor(address managerAddress, address registryAddress) public +``` + +### getCompoundablePoolIds + +```solidity +function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5] poolIds) +``` + +Get the next five compoundable pool IDs + +_Should be called off-chain_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolIds | uint32[5] | The next five compoundable pool IDs | + +### getOperators + +```solidity +function getOperators(uint256 startIndex, uint256 endIndex) external view returns (struct ICasimirRegistry.Operator[]) +``` + +Get operators + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | struct ICasimirRegistry.Operator[] | operators The operators | + +### getPendingValidatorPublicKeys + +```solidity +function getPendingValidatorPublicKeys(uint256 startIndex, uint256 endIndex) external view returns (bytes[]) +``` + +Get the pending validator public keys + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes[] | validatorPublicKeys The pending validator public keys | + +### getStakedValidatorPublicKeys + +```solidity +function getStakedValidatorPublicKeys(uint256 startIndex, uint256 endIndex) external view returns (bytes[]) +``` + +Get the staked validator public keys + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes[] | validatorPublicKeys The staked validator public keys | + +### getPoolDetails + +```solidity +function getPoolDetails(uint32 poolId) external view returns (struct ICasimirViews.PoolDetails poolDetails) +``` + +Get a pool's details by ID + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolId | uint32 | The pool ID | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolDetails | struct ICasimirViews.PoolDetails | The pool details | + +### getSweptBalance + +```solidity +function getSweptBalance(uint256 startIndex, uint256 endIndex) public view returns (uint256 balance) +``` + +Get the swept balance + +_Should be called off-chain_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| balance | uint256 | The swept balance | + +## ICasimirViews + +### PoolDetails + +```solidity +struct PoolDetails { + uint32 id; + uint256 balance; + bytes publicKey; + uint64[] operatorIds; + enum ICasimirPool.PoolStatus status; +} +``` + +### getCompoundablePoolIds + +```solidity +function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5]) +``` + +### getOperators + +```solidity +function getOperators(uint256 startIndex, uint256 endIndex) external view returns (struct ICasimirRegistry.Operator[]) +``` + +### getPoolDetails + +```solidity +function getPoolDetails(uint32 poolId) external view returns (struct ICasimirViews.PoolDetails) +``` + +### getPendingValidatorPublicKeys + +```solidity +function getPendingValidatorPublicKeys(uint256 startIndex, uint256 endIndex) external view returns (bytes[]) +``` + +### getStakedValidatorPublicKeys + +```solidity +function getStakedValidatorPublicKeys(uint256 startIndex, uint256 endIndex) external view returns (bytes[]) +``` + +### getSweptBalance + +```solidity +function getSweptBalance(uint256 startIndex, uint256 endIndex) external view returns (uint256) +``` + ## MockFunctionsOracle ### constructor diff --git a/contracts/ethereum/hardhat.config.ts b/contracts/ethereum/hardhat.config.ts index 3c9ac9876..e34b3f33e 100644 --- a/contracts/ethereum/hardhat.config.ts +++ b/contracts/ethereum/hardhat.config.ts @@ -5,6 +5,7 @@ import '@typechain/hardhat' import '@nomiclabs/hardhat-ethers' import 'solidity-docgen' import '@openzeppelin/hardhat-upgrades' +import '@nomicfoundation/hardhat-toolbox' // Seed is provided const mnemonic = process.env.BIP39_SEED as string diff --git a/contracts/ethereum/helpers/oracle.ts b/contracts/ethereum/helpers/oracle.ts index 6f1d93ab4..389c49d30 100644 --- a/contracts/ethereum/helpers/oracle.ts +++ b/contracts/ethereum/helpers/oracle.ts @@ -92,7 +92,14 @@ export async function reportCompletedExitsHandler({ manager, views, signer, args if (poolDetails.status === 2 || poolDetails.status === 3) { remaining-- const operatorIds = poolDetails.operatorIds.map((operatorId) => operatorId.toNumber()) - const blamePercents = [0, 0, 0, 0] + + // Hardcoded blame to the first operator if less than 32 ETH + // In production, we use the SSV performance data to determine blame + let blamePercents = [0, 0, 0, 0] + if (poolDetails.balance.lt(ethers.utils.parseEther('32'))) { + blamePercents = [100, 0, 0, 0] + } + const clusterDetails = await getClusterDetails({ provider: ethers.provider, ownerAddress: manager.address, diff --git a/contracts/ethereum/package.json b/contracts/ethereum/package.json index 324566aab..f91007634 100644 --- a/contracts/ethereum/package.json +++ b/contracts/ethereum/package.json @@ -19,6 +19,7 @@ }, "devDependencies": { "@nomicfoundation/hardhat-network-helpers": "^1.0.6", + "@nomicfoundation/hardhat-toolbox": "^2.0.2", "@nomiclabs/hardhat-ethers": "^2.0.6", "@openzeppelin/hardhat-upgrades": "^1.21.0", "@typechain/ethers-v5": "^10.1.0", diff --git a/contracts/ethereum/src/v1/CasimirManager.sol b/contracts/ethereum/src/v1/CasimirManager.sol index 413ceec75..50585815e 100644 --- a/contracts/ethereum/src/v1/CasimirManager.sol +++ b/contracts/ethereum/src/v1/CasimirManager.sol @@ -109,8 +109,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { int256 private latestActiveRewardBalance; /** Exited pool count */ uint256 public finalizableCompletedExits; - /** Exited balance */ + /** Report finalizable exited balance */ uint256 private finalizableExitedBalance; + /** Report finalizable recovered balance */ + uint256 private finalizableRecoveredBalance; /** Token addresses */ mapping(Token => address) private tokenAddresses; /** All users */ @@ -338,10 +340,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { delete poolAddresses[poolId]; uint256 balance = msg.value + recoveredBalances[poolId]; delete recoveredBalances[poolId]; - exitedBalance += balance; finalizableExitedBalance += balance; - finalizableCompletedExits++; } @@ -353,6 +353,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint32 poolId ) external payable onlyRegistry { recoveredBalances[poolId] += msg.value; + finalizableRecoveredBalance += msg.value; } /** @@ -471,7 +472,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ) external onlyUpkeep { uint256 expectedActivatedBalance = activatedDeposits * poolCapacity; uint256 expectedExitedBalance = completedExits * poolCapacity; - int256 rewards = int256(activeBalance + sweptBalance - expectedExitedBalance) - int256(getExpectedEffectiveBalance()); + int256 rewards = int256(activeBalance + sweptBalance + finalizableRecoveredBalance) - int256(getExpectedEffectiveBalance() + expectedExitedBalance); int256 change = rewards - latestActiveRewardBalance; if (change > 0) { uint256 gain = uint256(change); @@ -503,15 +504,18 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { emit StakeRebalanced(loss); } - uint256 sweptRewards = sweptBalance - finalizableExitedBalance; - latestActiveRewardBalance = rewards - int256(sweptRewards); latestActiveBalance = activeBalance; + int256 sweptRewards = int256(sweptBalance + finalizableRecoveredBalance) - int256(finalizableExitedBalance); + if (sweptRewards > 0) { + latestActiveBalanceAfterFees -= subtractFees(uint256(sweptRewards)); + } latestActiveBalanceAfterFees += expectedActivatedBalance; - latestActiveBalanceAfterFees -= subtractFees(sweptRewards); latestActiveBalanceAfterFees -= finalizableExitedBalance; + latestActiveRewardBalance = rewards - sweptRewards; reportPeriod++; finalizableExitedBalance = 0; + finalizableRecoveredBalance = 0; finalizableCompletedExits = 0; } @@ -631,7 +635,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { user.actionPeriodTimestamp == 0 || user.actionCount < maxActionsPerPeriod || block.timestamp >= user.actionPeriodTimestamp + actionPeriod, - "User action period maximum reached" + "Action period maximum reached" ); if (block.timestamp >= user.actionPeriodTimestamp + actionPeriod) { user.actionPeriodTimestamp = block.timestamp; @@ -783,7 +787,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint32 poolId = stakedPoolIds[index]; ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); - ICasimirPool.PoolStatus poolStatus = pool.getStatus(); + ICasimirPool.PoolStatus poolStatus = pool.status(); if ( poolStatus == ICasimirPool.PoolStatus.PENDING || poolStatus == ICasimirPool.PoolStatus.ACTIVE @@ -831,7 +835,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { for (uint256 i = 0; i < poolIds.length; i++) { uint32 poolId = poolIds[i]; ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); - ICasimirPool.PoolStatus poolStatus = pool.getStatus(); + ICasimirPool.PoolStatus poolStatus = pool.status(); require( poolStatus != ICasimirPool.PoolStatus.EXITING_FORCED, "Forced exit already reported" @@ -858,28 +862,27 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ) external onlyOracle { uint32 poolId = stakedPoolIds[poolIndex]; ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); - ICasimirPool.PoolConfig memory poolConfig = pool.getConfig(); + ICasimirPool.PoolStatus poolStatus = pool.status(); require( - poolConfig.status == ICasimirPool.PoolStatus.EXITING_FORCED || - poolConfig.status == ICasimirPool.PoolStatus.EXITING_REQUESTED, + poolStatus == ICasimirPool.PoolStatus.EXITING_FORCED || + poolStatus == ICasimirPool.PoolStatus.EXITING_REQUESTED, "Pool not exiting" ); stakedPoolIds.remove(poolIndex); - uint64[] memory operatorIds = poolConfig.operatorIds; - bytes memory publicKey = poolConfig.publicKey; + uint64[] memory operatorIds = pool.getOperatorIds(); + bytes memory publicKey = pool.publicKey(); - if (poolConfig.status == ICasimirPool.PoolStatus.EXITING_REQUESTED) { + if (poolStatus == ICasimirPool.PoolStatus.EXITING_REQUESTED) { requestedExits--; } else if ( - poolConfig.status == ICasimirPool.PoolStatus.EXITING_FORCED + poolStatus == ICasimirPool.PoolStatus.EXITING_FORCED ) { forcedExits--; } pool.setStatus(ICasimirPool.PoolStatus.WITHDRAWN); pool.withdrawBalance(blamePercents); - ssvNetwork.removeValidator(publicKey, operatorIds, cluster); emit ExitCompleted(poolId); @@ -911,15 +914,15 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { bool processed ) external onlyOracle { ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); - ICasimirPool.PoolConfig memory poolConfig = pool.getConfig(); + ICasimirPool.PoolDetails memory poolDetails = pool.getDetails(); require( - poolConfig.status == ICasimirPool.PoolStatus.PENDING || - poolConfig.status == ICasimirPool.PoolStatus.ACTIVE, + poolDetails.status == ICasimirPool.PoolStatus.PENDING || + poolDetails.status == ICasimirPool.PoolStatus.ACTIVE, "Pool not active" ); - require(poolConfig.reshares < 2, "Pool already reshared twice"); + require(poolDetails.reshares < 2, "Pool already reshared twice"); - pool.setReshares(poolConfig.reshares + 1); + pool.setReshares(poolDetails.reshares + 1); registry.removeOperatorPool(oldOperatorId, poolId, 0); registry.addOperatorPool(newOperatorId, poolId); @@ -932,13 +935,13 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ssvToken.approve(address(ssvNetwork), ssvAmount); ssvNetwork.removeValidator( - poolConfig.publicKey, + poolDetails.publicKey, oldOperatorIds, oldCluster ); ssvNetwork.registerValidator( - poolConfig.publicKey, + poolDetails.publicKey, operatorIds, shares, ssvAmount, diff --git a/contracts/ethereum/src/v1/CasimirPool.sol b/contracts/ethereum/src/v1/CasimirPool.sol index 8b8c073df..c203bb75a 100644 --- a/contracts/ethereum/src/v1/CasimirPool.sol +++ b/contracts/ethereum/src/v1/CasimirPool.sol @@ -19,19 +19,24 @@ contract CasimirPool is ICasimirPool, Ownable, ReentrancyGuard { uint256 poolCapacity = 32 ether; ICasimirManager private immutable manager; ICasimirRegistry private immutable registry; - PoolConfig private config; + uint32 public immutable id; + bytes public publicKey; + uint64[] private operatorIds; + uint256 public reshares; + PoolStatus public status; + constructor( address registryAddress, - uint32 poolId, - bytes memory publicKey, - uint64[] memory operatorIds + uint32 _id, + bytes memory _publicKey, + uint64[] memory _operatorIds ) { manager = ICasimirManager(msg.sender); registry = ICasimirRegistry(registryAddress); - config.poolId = poolId; - config.publicKey = publicKey; - config.operatorIds = operatorIds; + id = _id; + publicKey = _publicKey; + operatorIds = _operatorIds; } function depositRewards() external onlyOwner { @@ -40,56 +45,53 @@ contract CasimirPool is ICasimirPool, Ownable, ReentrancyGuard { } function withdrawBalance(uint32[] memory blamePercents) external onlyOwner { - require(config.status == PoolStatus.WITHDRAWN, "Pool must be withdrawn"); + require(status == PoolStatus.WITHDRAWN, "Pool must be withdrawn"); uint256 balance = address(this).balance; - uint256 rewards = poolCapacity - balance; + int256 rewards = int256(balance) - int256(poolCapacity); if (rewards > 0) { - manager.depositRewards{value: rewards}(); + manager.depositRewards{value: uint256(rewards)}(); } - uint256 exitedBalance = balance - rewards; - uint256 lostBalance = poolCapacity - exitedBalance; for (uint256 i = 0; i < blamePercents.length; i++) { uint256 blameAmount; - if (lostBalance > 0) { + if (rewards < 0) { uint256 blamePercent = blamePercents[i]; - blameAmount = Math.mulDiv(lostBalance, blamePercent, 100); + blameAmount = Math.mulDiv(uint256(-rewards), blamePercent, 100); } - registry.removeOperatorPool(config.operatorIds[i], config.poolId, blameAmount); + registry.removeOperatorPool(operatorIds[i], id, blameAmount); } - manager.depositExitedBalance{value: balance}(config.poolId); + manager.depositExitedBalance{value: balance}(id); } - function setOperatorIds(uint64[] memory operatorIds) external onlyOwner { - config.operatorIds = operatorIds; + function setOperatorIds(uint64[] memory _operatorIds) external onlyOwner { + operatorIds = _operatorIds; } - function setReshares(uint256 reshares) external onlyOwner { - config.reshares = reshares; + function setReshares(uint256 _reshares) external onlyOwner { + reshares = _reshares; } - function setStatus(PoolStatus status) external onlyOwner { - config.status = status; + function setStatus(PoolStatus _status) external onlyOwner { + status = _status; } - function getBalance() external view returns (uint256) { - return address(this).balance; + function getDetails() external view returns (PoolDetails memory) { + return PoolDetails({ + id: id, + balance: address(this).balance, + publicKey: publicKey, + operatorIds: operatorIds, + reshares: reshares, + status: status + }); } - function getConfig() external view override returns (PoolConfig memory) { - return config; + function getBalance() external view returns (uint256) { + return address(this).balance; } function getOperatorIds() external view returns (uint64[] memory) { - return config.operatorIds; - } - - function getPublicKey() external view returns (bytes memory) { - return config.publicKey; - } - - function getStatus() external view returns (PoolStatus) { - return config.status; + return operatorIds; } } \ No newline at end of file diff --git a/contracts/ethereum/src/v1/CasimirViews.sol b/contracts/ethereum/src/v1/CasimirViews.sol index c99dad11c..b7e9d25b8 100644 --- a/contracts/ethereum/src/v1/CasimirViews.sol +++ b/contracts/ethereum/src/v1/CasimirViews.sol @@ -94,8 +94,7 @@ contract CasimirViews is ICasimirViews { uint32 poolId = pendingPoolIds[i]; address poolAddress = manager.getPoolAddress(poolId); ICasimirPool pool = ICasimirPool(poolAddress); - ICasimirPool.PoolConfig memory poolConfig = pool.getConfig(); - validatorPublicKeys[count] = poolConfig.publicKey; + validatorPublicKeys[count] = pool.publicKey(); count++; } return validatorPublicKeys; @@ -118,8 +117,7 @@ contract CasimirViews is ICasimirViews { uint32 poolId = stakedPoolIds[i]; address poolAddress = manager.getPoolAddress(poolId); ICasimirPool pool = ICasimirPool(poolAddress); - ICasimirPool.PoolConfig memory poolConfig = pool.getConfig(); - validatorPublicKeys[count] = poolConfig.publicKey; + validatorPublicKeys[count] = pool.publicKey(); count++; } return validatorPublicKeys; @@ -130,20 +128,11 @@ contract CasimirViews is ICasimirViews { * @param poolId The pool ID * @return poolDetails The pool details */ - function getPoolDetails( - uint32 poolId - ) external view returns (PoolDetails memory poolDetails) { + function getPoolDetails(uint32 poolId) external view returns (ICasimirPool.PoolDetails memory poolDetails) { address poolAddress = manager.getPoolAddress(poolId); if (poolAddress != address(0)) { ICasimirPool pool = ICasimirPool(poolAddress); - ICasimirPool.PoolConfig memory poolConfig = pool.getConfig(); - poolDetails = PoolDetails({ - id: poolId, - balance: pool.getBalance(), - publicKey: poolConfig.publicKey, - operatorIds: poolConfig.operatorIds, - status: poolConfig.status - }); + poolDetails = pool.getDetails(); } } diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirPool.sol b/contracts/ethereum/src/v1/interfaces/ICasimirPool.sol index 3c94e8228..8e7fa1469 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirPool.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirPool.sol @@ -6,16 +6,15 @@ interface ICasimirPool { /* Structs */ /***********/ - /** Pool config */ - struct PoolConfig { - uint32 poolId; + struct PoolDetails { + uint32 id; + uint256 balance; bytes publicKey; uint64[] operatorIds; uint256 reshares; - PoolStatus status; + ICasimirPool.PoolStatus status; } - /** Pool status */ enum PoolStatus { PENDING, ACTIVE, @@ -25,7 +24,7 @@ interface ICasimirPool { } /*************/ - /* Functions */ + /* Mutations */ /*************/ function depositRewards() external; @@ -38,13 +37,25 @@ interface ICasimirPool { function setStatus(PoolStatus status) external; - function getBalance() external view returns (uint256); + /*************/ + /* Variables */ + /*************/ - function getConfig() external view returns (PoolConfig memory); + function id() external view returns (uint32); - function getOperatorIds() external view returns (uint64[] memory); + function publicKey() external view returns (bytes memory); + + function reshares() external view returns (uint256); + + function status() external view returns (PoolStatus); - function getPublicKey() external view returns (bytes memory); + /***********/ + /* Getters */ + /***********/ + + function getDetails() external view returns (PoolDetails memory); - function getStatus() external view returns (PoolStatus); + function getBalance() external view returns (uint256); + + function getOperatorIds() external view returns (uint64[] memory); } \ No newline at end of file diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirViews.sol b/contracts/ethereum/src/v1/interfaces/ICasimirViews.sol index f6a4866b3..a1995ee8d 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirViews.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirViews.sol @@ -1,21 +1,10 @@ // SPDX-License-Identifier: Apache pragma solidity 0.8.18; +import './ICasimirPool.sol'; import './ICasimirRegistry.sol'; interface ICasimirViews { - /***********/ - /* Structs */ - /***********/ - - struct PoolDetails { - uint32 id; - uint256 balance; - bytes publicKey; - uint64[] operatorIds; - ICasimirPool.PoolStatus status; - } - /***********/ /* Getters */ /***********/ @@ -30,7 +19,7 @@ interface ICasimirViews { ) external view returns (ICasimirRegistry.Operator[] memory); function getPoolDetails( uint32 poolId - ) external view returns (PoolDetails memory); + ) external view returns (ICasimirPool.PoolDetails memory); function getPendingValidatorPublicKeys( uint256 startIndex, uint256 endIndex diff --git a/contracts/ethereum/test/operators.ts b/contracts/ethereum/test/operators.ts index 542bcab4c..854be236e 100644 --- a/contracts/ethereum/test/operators.ts +++ b/contracts/ethereum/test/operators.ts @@ -1,10 +1,11 @@ import { ethers, network } from 'hardhat' -import { loadFixture } from '@nomicfoundation/hardhat-network-helpers' +import { loadFixture, setBalance, time } from '@nomicfoundation/hardhat-network-helpers' import { expect } from 'chai' -import { deploymentFixture } from './fixtures/shared' +import { deploymentFixture, secondUserDepositFixture } from './fixtures/shared' import { ICasimirRegistry } from '../build/artifacts/types' import { round } from '../helpers/math' -import { initiateDepositHandler } from '../helpers/oracle' +import { initiateDepositHandler, reportCompletedExitsHandler } from '../helpers/oracle' +import { fulfillReport, runUpkeep } from '../helpers/upkeep' describe('Operators', async function () { it('Registration of operators 1 through 4 creates 4 eligible operators', async function () { @@ -101,4 +102,52 @@ describe('Operators', async function () { expect(deregisteredOperator.collateral.toString()).equal('0') expect(ethers.utils.formatEther(operatorOwnerBalanceAfter.sub(operatorOwnerBalanceBefore).toString())).contains('3.9') }) + + it('Pool exits with 31.0 and recovers from the blamed operator', async function () { + const { manager, registry, upkeep, views, secondUser, keeper, oracle, requestId } = await loadFixture(secondUserDepositFixture) + + const secondStake = await manager.getUserStake(secondUser.address) + const withdraw = await manager.connect(secondUser).requestWithdrawal(secondStake) + await withdraw.wait() + + const sweptExitedBalance = 31 + const withdrawnPoolId = (await manager.getStakedPoolIds())[0] + const withdrawnPoolAddress = await manager.getPoolAddress(withdrawnPoolId) + const currentBalance = await ethers.provider.getBalance(withdrawnPoolAddress) + const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptExitedBalance.toString())) + await setBalance(withdrawnPoolAddress, nextBalance) + + await time.increase(time.duration.days(1)) + + await runUpkeep({ upkeep, keeper }) + + const nextValues = { + activeBalance: 0, + sweptBalance: sweptExitedBalance, + activatedDeposits: 0, + forcedExits: 0, + completedExits: 1, + compoundablePoolIds: [0, 0, 0, 0, 0] + } + + await fulfillReport({ + upkeep, + keeper, + values: nextValues, + requestId + }) + + await reportCompletedExitsHandler({ manager, views, signer: oracle, args: { count: 1 } }) + + await runUpkeep({ upkeep, keeper }) + + const stake = await manager.getTotalStake() + const userStake = await manager.getUserStake(secondUser.address) + const blamedOperatorId = 1 // Hardcoded the first operator + const blamedOperator = await registry.getOperator(blamedOperatorId) + + expect(ethers.utils.formatEther(stake)).equal('16.0') + expect(ethers.utils.formatEther(userStake)).equal('0.0') + expect(blamedOperator.collateral.toString()).equal(ethers.utils.parseEther('3.0').toString()) + }) }) \ No newline at end of file diff --git a/contracts/ethereum/test/reports.ts b/contracts/ethereum/test/reports.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/contracts/ethereum/test/users.ts b/contracts/ethereum/test/users.ts index 5762dab7d..182087e8c 100644 --- a/contracts/ethereum/test/users.ts +++ b/contracts/ethereum/test/users.ts @@ -7,7 +7,7 @@ import { initiateDepositHandler, reportCompletedExitsHandler } from '../helpers/ import { fulfillReport, runUpkeep } from '../helpers/upkeep' describe('Users', async function () { - it('User 16.0 stake and half withdrawal updates total and user stake, and user balance', async function () { + it('User\'s 16.0 stake and half withdrawal updates total and user stake, and user balance', async function () { const { manager } = await loadFixture(deploymentFixture) const [, user] = await ethers.getSigners() @@ -34,7 +34,7 @@ describe('Users', async function () { expect(ethers.utils.formatEther(userBalanceAfter.sub(userBalanceBefore))).contains('7.9') }) - it('User 64.0 stake and half withdrawal updates total and user stake, and user balance', async function () { + it('User\'s 64.0 stake and half withdrawal updates total and user stake, and user balance', async function () { const { manager, upkeep, views, keeper, oracle } = await loadFixture(deploymentFixture) const [, user] = await ethers.getSigners() @@ -133,5 +133,22 @@ describe('Users', async function () { expect(ethers.utils.formatEther(stake)).equal('32.0') expect(ethers.utils.formatEther(userStake)).equal('32.0') expect(ethers.utils.formatEther(userBalanceAfter.sub(userBalanceBefore))).contains('31.9') - }) + }) + + it('User\'s 16.0 stake and five withdrawal requests fails on the 6th daily action', async function () { + const { manager } = await loadFixture(deploymentFixture) + const [, user] = await ethers.getSigners() + + const depositAmount = round(16 * ((100 + await manager.feePercent()) / 100), 10) + const deposit = await manager.connect(user).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) + await deposit.wait() + + for (let i = 0; i < 4; i++) { + const withdrawalRequest = await manager.connect(user).requestWithdrawal(ethers.utils.parseEther('2.0')) + await withdrawalRequest.wait() + } + + const failedWithdrawalRequest = manager.connect(user).requestWithdrawal(ethers.utils.parseEther('2.0')) + await expect(failedWithdrawalRequest).to.be.rejectedWith('Action period maximum reached') + }) }) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4b0ef3d4e..bce69032f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -286,6 +286,7 @@ "name": "@casimir/types" }, "common/uniswap": { + "name": "@casimir/uniswap", "dependencies": { "ethers": "^5.7.2" }, @@ -353,6 +354,7 @@ }, "devDependencies": { "@nomicfoundation/hardhat-network-helpers": "^1.0.6", + "@nomicfoundation/hardhat-toolbox": "^2.0.2", "@nomiclabs/hardhat-ethers": "^2.0.6", "@openzeppelin/hardhat-upgrades": "^1.21.0", "@typechain/ethers-v5": "^10.1.0", @@ -4478,6 +4480,26 @@ "node": ">=14" } }, + "node_modules/@nomicfoundation/hardhat-chai-matchers": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz", + "integrity": "sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ==", + "dev": true, + "peer": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@types/chai-as-promised": "^7.1.3", + "chai-as-promised": "^7.1.1", + "deep-eql": "^4.0.1", + "ordinal": "^1.0.3" + }, + "peerDependencies": { + "@nomiclabs/hardhat-ethers": "^2.0.0", + "chai": "^4.2.0", + "ethers": "^5.0.0", + "hardhat": "^2.9.4" + } + }, "node_modules/@nomicfoundation/hardhat-network-helpers": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz", @@ -4490,6 +4512,33 @@ "hardhat": "^2.9.5" } }, + "node_modules/@nomicfoundation/hardhat-toolbox": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.2.tgz", + "integrity": "sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg==", + "dev": true, + "peerDependencies": { + "@ethersproject/abi": "^5.4.7", + "@ethersproject/providers": "^5.4.7", + "@nomicfoundation/hardhat-chai-matchers": "^1.0.0", + "@nomicfoundation/hardhat-network-helpers": "^1.0.0", + "@nomiclabs/hardhat-ethers": "^2.0.0", + "@nomiclabs/hardhat-etherscan": "^3.0.0", + "@typechain/ethers-v5": "^10.1.0", + "@typechain/hardhat": "^6.1.2", + "@types/chai": "^4.2.0", + "@types/mocha": ">=9.1.0", + "@types/node": ">=12.0.0", + "chai": "^4.2.0", + "ethers": "^5.4.7", + "hardhat": "^2.11.0", + "hardhat-gas-reporter": "^1.0.8", + "solidity-coverage": "^0.8.1", + "ts-node": ">=8.0.0", + "typechain": "^8.1.0", + "typescript": ">=4.5.0" + } + }, "node_modules/@nomicfoundation/solidity-analyzer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", @@ -5472,6 +5521,16 @@ "superstruct": "^0.14.2" } }, + "node_modules/@solidity-parser/parser": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", + "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", + "dev": true, + "peer": true, + "dependencies": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", @@ -5869,6 +5928,26 @@ "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", "dev": true }, + "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==", + "dev": true, + "peer": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/connect": { "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", @@ -5914,6 +5993,16 @@ "@types/send": "*" } }, + "node_modules/@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/fs-extra": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.1.tgz", @@ -5924,6 +6013,17 @@ "@types/node": "*" } }, + "node_modules/@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, + "peer": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "node_modules/@types/graceful-fs": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", @@ -6042,6 +6142,13 @@ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, + "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, + "peer": true + }, "node_modules/@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", @@ -6900,6 +7007,13 @@ "@walletconnect/window-getters": "^1.0.0" } }, + "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, + "peer": true + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -7028,6 +7142,16 @@ "node": ">=0.4.0" } }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/adm-zip": { "version": "0.4.16", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", @@ -7152,6 +7276,17 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.4.2" + } + }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -7250,6 +7385,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/antlr4ts": { + "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", + "dev": true, + "peer": true + }, "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -7317,6 +7459,16 @@ "node": ">=8" } }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/array.prototype.map": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.5.tgz", @@ -7336,6 +7488,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.reduce": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", + "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "peer": true + }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -9110,6 +9289,19 @@ "node": ">=4" } }, + "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==", + "dev": true, + "peer": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -9141,6 +9333,16 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "node_modules/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, + "peer": true, + "engines": { + "node": "*" + } + }, "node_modules/chart.js": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.3.0.tgz", @@ -9359,6 +9561,70 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "dev": true, + "peer": true, + "dependencies": { + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "colors": "^1.1.2" + } + }, + "node_modules/cli-table3/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "peer": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-table3/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/cli-truncate": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", @@ -9506,6 +9772,16 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/combine-source-map": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", @@ -9937,6 +10213,16 @@ "node": ">= 8" } }, + "node_modules/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, + "peer": true, + "engines": { + "node": "*" + } + }, "node_modules/crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -10416,6 +10702,13 @@ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" }, + "node_modules/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, + "peer": true + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -10841,6 +11134,21 @@ "node": ">=8" } }, + "node_modules/detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "dev": true, + "peer": true, + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + } + }, "node_modules/detective": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", @@ -10896,6 +11204,19 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, + "node_modules/difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "dev": true, + "peer": true, + "dependencies": { + "heap": ">= 0.2.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/dijkstrajs": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", @@ -12120,1131 +12441,2693 @@ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" }, - "node_modules/eth-json-rpc-filters": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz", - "integrity": "sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw==", + "node_modules/eth-gas-reporter": { + "version": "0.2.25", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", + "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==", + "dev": true, + "peer": true, "dependencies": { - "@metamask/safe-event-emitter": "^2.0.0", - "async-mutex": "^0.2.6", - "eth-json-rpc-middleware": "^6.0.0", - "eth-query": "^2.1.2", - "json-rpc-engine": "^6.1.0", - "pify": "^5.0.0" + "@ethersproject/abi": "^5.0.0-beta.146", + "@solidity-parser/parser": "^0.14.0", + "cli-table3": "^0.5.0", + "colors": "1.4.0", + "ethereum-cryptography": "^1.0.3", + "ethers": "^4.0.40", + "fs-readdir-recursive": "^1.1.0", + "lodash": "^4.17.14", + "markdown-table": "^1.1.3", + "mocha": "^7.1.1", + "req-cwd": "^2.0.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.5", + "sha1": "^1.1.1", + "sync-request": "^6.0.0" + }, + "peerDependencies": { + "@codechecks/client": "^0.1.0" + }, + "peerDependenciesMeta": { + "@codechecks/client": { + "optional": true + } } }, - "node_modules/eth-json-rpc-filters/node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "node_modules/eth-gas-reporter/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==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "peer": true + }, + "node_modules/eth-gas-reporter/node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "dev": true, + "peer": true + }, + "node_modules/eth-gas-reporter/node_modules/ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true, + "peer": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/eth-json-rpc-infura": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz", - "integrity": "sha512-THzLye3PHUSGn1EXMhg6WTLW9uim7LQZKeKaeYsS9+wOBcamRiCQVGHa6D2/4P0oS0vSaxsBnU/J6qvn0MPdow==", - "dependencies": { - "eth-json-rpc-middleware": "^6.0.0", - "eth-rpc-errors": "^3.0.0", - "json-rpc-engine": "^5.3.0", - "node-fetch": "^2.6.0" + "node_modules/eth-gas-reporter/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" } }, - "node_modules/eth-json-rpc-infura/node_modules/json-rpc-engine": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz", - "integrity": "sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g==", + "node_modules/eth-gas-reporter/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, + "peer": true, "dependencies": { - "eth-rpc-errors": "^3.0.0", - "safe-event-emitter": "^1.0.1" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/eth-json-rpc-middleware": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz", - "integrity": "sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ==", + "node_modules/eth-gas-reporter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "peer": true, "dependencies": { - "btoa": "^1.2.1", - "clone": "^2.1.1", - "eth-query": "^2.1.2", - "eth-rpc-errors": "^3.0.0", - "eth-sig-util": "^1.4.2", - "ethereumjs-util": "^5.1.2", - "json-rpc-engine": "^5.3.0", - "json-stable-stringify": "^1.0.1", - "node-fetch": "^2.6.1", - "pify": "^3.0.0", - "safe-event-emitter": "^1.0.1" + "sprintf-js": "~1.0.2" } }, - "node_modules/eth-json-rpc-middleware/node_modules/bn.js": { + "node_modules/eth-gas-reporter/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==" + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true, + "peer": true }, - "node_modules/eth-json-rpc-middleware/node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "engines": { - "node": ">=0.8" + "node_modules/eth-gas-reporter/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, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "node_modules/eth-gas-reporter/node_modules/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, + "peer": true, "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/eth-json-rpc-middleware/node_modules/json-rpc-engine": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz", - "integrity": "sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g==", + "node_modules/eth-gas-reporter/node_modules/chalk/node_modules/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, + "peer": true, "dependencies": { - "eth-rpc-errors": "^3.0.0", - "safe-event-emitter": "^1.0.1" + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/eth-json-rpc-middleware/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "node_modules/eth-gas-reporter/node_modules/chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "peer": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + }, "engines": { - "node": ">=4" + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.1" } }, - "node_modules/eth-lib": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "node_modules/eth-gas-reporter/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "peer": true, "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "node_modules/eth-lib/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/eth-gas-reporter/node_modules/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, + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } }, - "node_modules/eth-lib/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/eth-gas-reporter/node_modules/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, + "peer": true }, - "node_modules/eth-lib/node_modules/ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "node_modules/eth-gas-reporter/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "peer": true, "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" + "ms": "^2.1.1" } }, - "node_modules/eth-query": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", - "integrity": "sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==", - "dependencies": { - "json-rpc-random-id": "^1.0.0", - "xtend": "^4.0.1" + "node_modules/eth-gas-reporter/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.3.1" } }, - "node_modules/eth-rpc-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz", - "integrity": "sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg==", - "dependencies": { - "fast-safe-stringify": "^2.0.6" + "node_modules/eth-gas-reporter/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true, + "peer": true + }, + "node_modules/eth-gas-reporter/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, + "peer": true, + "engines": { + "node": ">=0.8.0" } }, - "node_modules/eth-sig-util": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", - "integrity": "sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw==", - "deprecated": "Deprecated in favor of '@metamask/eth-sig-util'", + "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dev": true, + "peer": true, "dependencies": { - "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", - "ethereumjs-util": "^5.1.1" + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" } }, - "node_modules/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/eth-gas-reporter/node_modules/ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "dev": true, + "peer": true, + "dependencies": { + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } }, - "node_modules/eth-sig-util/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "node_modules/eth-gas-reporter/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "peer": true, "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "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==", + "node_modules/eth-gas-reporter/node_modules/flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "peer": true, "dependencies": { - "js-sha3": "^0.8.0" + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" } }, - "node_modules/ethereum-common": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", - "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==" - }, - "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/eth-gas-reporter/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/ethereumjs-abi": { - "version": "0.6.8", - "resolved": "git+ssh://git@github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0", - "license": "MIT", + "node_modules/eth-gas-reporter/node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "peer": true, "dependencies": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" + "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" + }, + "engines": { + "node": "*" } }, - "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==", + "node_modules/eth-gas-reporter/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, + "peer": true, "dependencies": { - "@types/node": "*" + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "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/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==", - "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/eth-gas-reporter/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, + "peer": true, + "engines": { + "node": ">=4" } }, - "node_modules/ethereumjs-account": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", - "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", + "node_modules/eth-gas-reporter/node_modules/hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "peer": true, "dependencies": { - "ethereumjs-util": "^5.0.0", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" } }, - "node_modules/ethereumjs-account/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-account/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "node_modules/eth-gas-reporter/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "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" + } + ], + "peer": true, + "engines": { + "node": ">=4" } }, - "node_modules/ethereumjs-block": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", - "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", - "deprecated": "New package name format for new versions: @ethereumjs/block. Please update.", - "dependencies": { - "async": "^2.0.1", - "ethereum-common": "0.2.0", - "ethereumjs-tx": "^1.2.2", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" + "node_modules/eth-gas-reporter/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" } }, - "node_modules/ethereumjs-block/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/eth-gas-reporter/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", + "dev": true, + "peer": true }, - "node_modules/ethereumjs-block/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "node_modules/eth-gas-reporter/node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "peer": true, "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/ethereumjs-common": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz", - "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==", - "deprecated": "New package name format for new versions: @ethereumjs/common. Please update." - }, - "node_modules/ethereumjs-tx": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", - "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", - "deprecated": "New package name format for new versions: @ethereumjs/tx. Please update.", + "node_modules/eth-gas-reporter/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "peer": true, "dependencies": { - "ethereum-common": "^0.0.18", - "ethereumjs-util": "^5.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/ethereumjs-tx/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-tx/node_modules/ethereum-common": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", - "integrity": "sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ==" - }, - "node_modules/ethereumjs-tx/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "node_modules/eth-gas-reporter/node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "peer": true, "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" } }, - "node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "node_modules/eth-gas-reporter/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "peer": true, "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10.0.0" + "node": "*" } }, - "node_modules/ethereumjs-vm": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", - "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", - "deprecated": "New package name format for new versions: @ethereumjs/vm. Please update.", + "node_modules/eth-gas-reporter/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "peer": true, "dependencies": { - "async": "^2.1.2", - "async-eventemitter": "^0.2.2", - "ethereumjs-account": "^2.0.3", - "ethereumjs-block": "~2.2.0", - "ethereumjs-common": "^1.1.0", - "ethereumjs-util": "^6.0.0", - "fake-merkle-patricia-tree": "^1.0.1", - "functional-red-black-tree": "^1.0.1", - "merkle-patricia-tree": "^2.3.2", - "rustbn.js": "~0.2.0", - "safe-buffer": "^5.1.1" + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/ethereumjs-vm/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==", + "node_modules/eth-gas-reporter/node_modules/mocha": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", + "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", + "dev": true, + "peer": true, "dependencies": { - "@types/node": "*" + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "node_modules/ethereumjs-vm/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-vm/node_modules/ethereumjs-block": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", - "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", - "deprecated": "New package name format for new versions: @ethereumjs/block. Please update.", - "dependencies": { - "async": "^2.0.1", - "ethereumjs-common": "^1.5.0", - "ethereumjs-tx": "^2.1.1", - "ethereumjs-util": "^5.0.0", - "merkle-patricia-tree": "^2.1.2" - } + "node_modules/eth-gas-reporter/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true, + "peer": true }, - "node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "node_modules/eth-gas-reporter/node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "peer": true, "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", - "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", - "deprecated": "New package name format for new versions: @ethereumjs/tx. Please update.", + "node_modules/eth-gas-reporter/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "peer": true, "dependencies": { - "ethereumjs-common": "^1.5.0", - "ethereumjs-util": "^6.0.0" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ethereumjs-vm/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==", + "node_modules/eth-gas-reporter/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "peer": true, "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, - "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" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/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/eth-gas-reporter/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" } }, - "node_modules/ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "node_modules/eth-gas-reporter/node_modules/readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "peer": true, "dependencies": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" + "picomatch": "^2.0.4" }, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": ">= 8" } }, - "node_modules/ethjs-unit/node_modules/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==" + "node_modules/eth-gas-reporter/node_modules/scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", + "dev": true, + "peer": true }, - "node_modules/ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "node_modules/eth-gas-reporter/node_modules/setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", + "dev": true, + "peer": true + }, + "node_modules/eth-gas-reporter/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "peer": true, "dependencies": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": ">=6" } }, - "node_modules/event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", + "node_modules/eth-gas-reporter/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "peer": true, "dependencies": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, - "node_modules/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, + "ansi-regex": "^4.1.0" + }, "engines": { "node": ">=6" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/eth-gas-reporter/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, + "peer": true, "engines": { - "node": ">=0.8.x" + "node": ">=0.10.0" } }, - "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==", + "node_modules/eth-gas-reporter/node_modules/supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "peer": true, "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/eth-gas-reporter/node_modules/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "peer": true + }, + "node_modules/eth-gas-reporter/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "peer": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" + "isexe": "^2.0.0" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "bin": { + "which": "bin/which" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "node_modules/eth-gas-reporter/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=6" } }, - "node_modules/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "node_modules/eth-gas-reporter/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true, + "peer": true + }, + "node_modules/eth-gas-reporter/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "peer": true, "dependencies": { - "@jest/expect-utils": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "node_modules/eth-gas-reporter/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "peer": true, "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "peer": true, + "dependencies": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" }, "engines": { - "node": ">= 0.10.0" + "node": ">=6" } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/eth-json-rpc-filters": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.2.tgz", + "integrity": "sha512-DGtqpLU7bBg63wPMWg1sCpkKCf57dJ+hj/k3zF26anXMzkmtSBDExL8IhUu7LUd34f0Zsce3PYNO2vV2GaTzaw==", "dependencies": { - "ms": "2.0.0" + "@metamask/safe-event-emitter": "^2.0.0", + "async-mutex": "^0.2.6", + "eth-json-rpc-middleware": "^6.0.0", + "eth-query": "^2.1.2", + "json-rpc-engine": "^6.1.0", + "pify": "^5.0.0" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/eth-json-rpc-filters/node_modules/pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "node_modules/eth-json-rpc-infura": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eth-json-rpc-infura/-/eth-json-rpc-infura-5.1.0.tgz", + "integrity": "sha512-THzLye3PHUSGn1EXMhg6WTLW9uim7LQZKeKaeYsS9+wOBcamRiCQVGHa6D2/4P0oS0vSaxsBnU/J6qvn0MPdow==", "dependencies": { - "type": "^2.7.2" + "eth-json-rpc-middleware": "^6.0.0", + "eth-rpc-errors": "^3.0.0", + "json-rpc-engine": "^5.3.0", + "node-fetch": "^2.6.0" } }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, + "node_modules/eth-json-rpc-infura/node_modules/json-rpc-engine": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz", + "integrity": "sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g==", "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" + "eth-rpc-errors": "^3.0.0", + "safe-event-emitter": "^1.0.1" } }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, + "node_modules/eth-json-rpc-middleware": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz", + "integrity": "sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" + "btoa": "^1.2.1", + "clone": "^2.1.1", + "eth-query": "^2.1.2", + "eth-rpc-errors": "^3.0.0", + "eth-sig-util": "^1.4.2", + "ethereumjs-util": "^5.1.2", + "json-rpc-engine": "^5.3.0", + "json-stable-stringify": "^1.0.1", + "node-fetch": "^2.6.1", + "pify": "^3.0.0", + "safe-event-emitter": "^1.0.1" } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] + "node_modules/eth-json-rpc-middleware/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/eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "node_modules/eth-json-rpc-middleware/node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "engines": { - "node": "> 0.1.90" + "node": ">=0.8" } }, - "node_modules/fake-merkle-patricia-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz", - "integrity": "sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA==", + "node_modules/eth-json-rpc-middleware/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", "dependencies": { - "checkpoint-store": "^1.1.0" + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/fast-base64-decode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", - "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==", - "dev": true - }, - "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==" - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, + "node_modules/eth-json-rpc-middleware/node_modules/json-rpc-engine": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-5.4.0.tgz", + "integrity": "sha512-rAffKbPoNDjuRnXkecTjnsE3xLLrb00rEkdgalINhaYVYIxDwWtvYBr9UFbhTvPB1B2qUOLoFd/cV6f4Q7mh7g==", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" + "eth-rpc-errors": "^3.0.0", + "safe-event-emitter": "^1.0.1" } }, - "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, - "dependencies": { - "is-glob": "^4.0.1" - }, + "node_modules/eth-json-rpc-middleware/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "engines": { - "node": ">= 6" + "node": ">=4" } }, - "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==" - }, - "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 + "node_modules/eth-lib": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" + } }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + "node_modules/eth-lib/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/fast-stable-stringify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", - "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==" + "node_modules/eth-lib/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/fast-xml-parser": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.1.2.tgz", - "integrity": "sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg==", + "node_modules/eth-lib/node_modules/ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - }, - "funding": { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" } }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, + "node_modules/eth-query": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/eth-query/-/eth-query-2.1.2.tgz", + "integrity": "sha512-srES0ZcvwkR/wd5OQBRA1bIJMww1skfGS0s8wlwK3/oNP4+wnds60krvu5R1QbpRQjMmpG5OMIWro5s7gvDPsA==", "dependencies": { - "reusify": "^1.0.4" + "json-rpc-random-id": "^1.0.0", + "xtend": "^4.0.1" } }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, + "node_modules/eth-rpc-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz", + "integrity": "sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg==", "dependencies": { - "bser": "2.1.1" + "fast-safe-stringify": "^2.0.6" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], + "node_modules/eth-sig-util": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/eth-sig-util/-/eth-sig-util-1.4.2.tgz", + "integrity": "sha512-iNZ576iTOGcfllftB73cPB5AN+XUQAT/T8xzsILsghXC1o8gJUqe3RHlcDqagu+biFpYQ61KQrZZJza8eRSYqw==", + "deprecated": "Deprecated in favor of '@metamask/eth-sig-util'", "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" + "ethereumjs-abi": "git+https://github.com/ethereumjs/ethereumjs-abi.git", + "ethereumjs-util": "^5.1.1" } }, - "node_modules/figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "dev": true, + "node_modules/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/eth-sig-util/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "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==", + "dependencies": { + "js-sha3": "^0.8.0" } }, - "node_modules/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, + "node_modules/ethereum-common": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.2.0.tgz", + "integrity": "sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA==" + }, + "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": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "@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/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, + "node_modules/ethereumjs-abi": { + "version": "0.6.8", + "resolved": "git+ssh://git@github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0", + "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "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": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "@types/node": "*" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "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/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, + "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==", "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" + "@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/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==", - "dev": true, + "node_modules/ethereumjs-account": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz", + "integrity": "sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA==", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "ethereumjs-util": "^5.0.0", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" + "node_modules/ethereumjs-account/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-account/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dependencies": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, + "node_modules/ethereumjs-block": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", + "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", + "deprecated": "New package name format for new versions: @ethereumjs/block. Please update.", "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "async": "^2.0.1", + "ethereum-common": "0.2.0", + "ethereumjs-tx": "^1.2.2", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" } }, - "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 + "node_modules/ethereumjs-block/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/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node_modules/ethereumjs-block/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dependencies": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "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==", + "node_modules/ethereumjs-common": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz", + "integrity": "sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA==", + "deprecated": "New package name format for new versions: @ethereumjs/common. Please update." + }, + "node_modules/ethereumjs-tx": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz", + "integrity": "sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA==", + "deprecated": "New package name format for new versions: @ethereumjs/tx. Please update.", "dependencies": { - "is-callable": "^1.1.3" + "ethereum-common": "^0.0.18", + "ethereumjs-util": "^5.0.0" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" + "node_modules/ethereumjs-tx/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-tx/node_modules/ethereum-common": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/ethereum-common/-/ethereum-common-0.0.18.tgz", + "integrity": "sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ==" + }, + "node_modules/ethereumjs-tx/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dependencies": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" } }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" }, "engines": { - "node": ">= 0.12" + "node": ">=10.0.0" } }, - "node_modules/form-data-encoder": { - "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, - "engines": { - "node": ">= 14.17" + "node_modules/ethereumjs-vm": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz", + "integrity": "sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw==", + "deprecated": "New package name format for new versions: @ethereumjs/vm. Please update.", + "dependencies": { + "async": "^2.1.2", + "async-eventemitter": "^0.2.2", + "ethereumjs-account": "^2.0.3", + "ethereumjs-block": "~2.2.0", + "ethereumjs-common": "^1.1.0", + "ethereumjs-util": "^6.0.0", + "fake-merkle-patricia-tree": "^1.0.1", + "functional-red-black-tree": "^1.0.1", + "merkle-patricia-tree": "^2.3.2", + "rustbn.js": "~0.2.0", + "safe-buffer": "^5.1.1" } }, - "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==", - "dev": true, + "node_modules/ethereumjs-vm/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": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" + "@types/node": "*" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" + "node_modules/ethereumjs-vm/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-vm/node_modules/ethereumjs-block": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz", + "integrity": "sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg==", + "deprecated": "New package name format for new versions: @ethereumjs/block. Please update.", + "dependencies": { + "async": "^2.0.1", + "ethereumjs-common": "^1.5.0", + "ethereumjs-tx": "^2.1.1", + "ethereumjs-util": "^5.0.0", + "merkle-patricia-tree": "^2.1.2" + } + }, + "node_modules/ethereumjs-vm/node_modules/ethereumjs-block/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dependencies": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/ethereumjs-vm/node_modules/ethereumjs-tx": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", + "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", + "deprecated": "New package name format for new versions: @ethereumjs/tx. Please update.", + "dependencies": { + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" + } + }, + "node_modules/ethereumjs-vm/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==", + "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/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" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/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/ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "dependencies": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/ethjs-unit/node_modules/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==" + }, + "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==", + "dependencies": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", + "dev": true, + "dependencies": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "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==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", + "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", + "engines": { + "node": "> 0.1.90" + } + }, + "node_modules/fake-merkle-patricia-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz", + "integrity": "sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA==", + "dependencies": { + "checkpoint-store": "^1.1.0" + } + }, + "node_modules/fast-base64-decode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", + "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==", + "dev": true + }, + "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==" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "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, + "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==" + }, + "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 + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fast-stable-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", + "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==" + }, + "node_modules/fast-xml-parser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.1.2.tgz", + "integrity": "sha512-CDYeykkle1LiA/uqQyNwYpFbyF6Axec6YapmpUP+/RHWIoR1zKjocdvNaTsxCxZzQ6v9MLXaSYm9Qq0thv0DHg==", + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + }, + "funding": { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/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, + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "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 + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "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==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/form-data-encoder": { + "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, + "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==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dev": true + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dependencies": { + "minipass": "^2.6.0" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true, + "peer": true + }, + "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==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "dev": true, + "dependencies": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ftp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/ftp/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/ftp/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + }, + "node_modules/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, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fx": { + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/fx/-/fx-28.0.0.tgz", + "integrity": "sha512-vKQDA9g868cZiW8ulgs2uN1yx1i7/nsS33jTMOxekk0Z03BJLffVcdW6AVD32fWb3E6RtmWWuBXBZOk8cLXFNQ==", + "dev": true, + "bin": { + "fx": "index.js" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + }, + "node_modules/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==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", + "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/get-uri/node_modules/file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/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, + "peer": true, + "dependencies": { + "chalk": "^2.4.2", + "node-emoji": "^1.10.0" + }, + "bin": { + "testrpc-sc": "index.js" + } + }, + "node_modules/ghost-testrpc/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, + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/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, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/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, + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ghost-testrpc/node_modules/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, + "peer": true + }, + "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, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ghost-testrpc/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, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/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, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/git-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "dev": true, + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" + } + }, + "node_modules/git-url-parse": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", + "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", + "dev": true, + "dependencies": { + "git-up": "^7.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "peer": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "peer": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/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, + "peer": true + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.0.tgz", + "integrity": "sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "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": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "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==" + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/hardhat": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.14.0.tgz", + "integrity": "sha512-73jsInY4zZahMSVFurSK+5TNCJTXMv+vemvGia0Ac34Mm19fYp6vEPVGF3sucbumszsYxiTT2TbS8Ii2dsDSoQ==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-blockchain": "7.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-evm": "2.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-statemanager": "2.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-vm": "7.0.1", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "abort-controller": "^3.0.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "chokidar": "^3.4.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": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "qs": "^6.7.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "bin": { + "hardhat": "internal/cli/bootstrap.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/hardhat-gas-reporter": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", + "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", + "dev": true, + "peer": true, + "dependencies": { + "array-uniq": "1.0.3", + "eth-gas-reporter": "^0.2.25", + "sha1": "^1.1.1" + }, + "peerDependencies": { + "hardhat": "^2.0.2" + } + }, + "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==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/hardhat/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hardhat/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hardhat/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==", + "dev": true + }, + "node_modules/hardhat/node_modules/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, + "dependencies": { + "color-name": "1.1.3" } }, - "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==", + "node_modules/hardhat/node_modules/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 }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "node_modules/hardhat/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, "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" + "node": ">=0.8.0" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" + "node_modules/hardhat/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dev": true, + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" } }, - "node_modules/from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", - "dev": true + "node_modules/hardhat/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/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==", + "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==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.0", + "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" }, @@ -13252,196 +15135,191 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "node_modules/hardhat/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, "dependencies": { - "minipass": "^2.6.0" + "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" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "node_modules/hardhat/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, + "engines": { + "node": ">=4" } }, - "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==" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "node_modules/hardhat/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=4" } }, - "node_modules/ftp": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", - "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==", + "node_modules/hardhat/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "dependencies": { - "readable-stream": "1.1.x", - "xregexp": "2.0.0" + "p-try": "^1.0.0" }, "engines": { - "node": ">=0.8.0" + "node": ">=4" } }, - "node_modules/ftp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "node_modules/ftp/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "node_modules/hardhat/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/ftp/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true + "node_modules/hardhat/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "node_modules/hardhat/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "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==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" + "path-parse": "^1.0.6" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" - }, - "node_modules/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==", + "node_modules/hardhat/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/fx": { - "version": "28.0.0", - "resolved": "https://registry.npmjs.org/fx/-/fx-28.0.0.tgz", - "integrity": "sha512-vKQDA9g868cZiW8ulgs2uN1yx1i7/nsS33jTMOxekk0Z03BJLffVcdW6AVD32fWb3E6RtmWWuBXBZOk8cLXFNQ==", + "node_modules/hardhat/node_modules/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, - "bin": { - "fx": "index.js" + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4.0" } }, - "node_modules/get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" - }, - "node_modules/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==", - "engines": { - "node": "6.* || 8.* || >= 10.*" + "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, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "get-intrinsic": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "engines": { - "node": ">=8.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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==", "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-symbol-description": { + "node_modules/has-tostringtag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -13450,625 +15328,706 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-tsconfig": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", - "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-uri": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", - "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", - "dev": true, + "node_modules/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==", "dependencies": { - "@tootallnate/once": "1", - "data-uri-to-buffer": "3", - "debug": "4", - "file-uri-to-path": "2", - "fs-extra": "^8.1.0", - "ftp": "^0.3.10" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" }, "engines": { - "node": ">= 6" + "node": ">=4" } }, - "node_modules/get-uri/node_modules/file-uri-to-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", - "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", - "dev": true, + "node_modules/hash-base/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { "node": ">= 6" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "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==", "dependencies": { - "assert-plus": "^1.0.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, - "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" + "bin": { + "he": "bin/he" } }, - "node_modules/git-url-parse": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", - "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", "dev": true, + "peer": true + }, + "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==", "dependencies": { - "git-up": "^7.0.0" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==", "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=0.10" } }, - "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/http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", "dev": true, + "peer": true, "dependencies": { - "is-glob": "^4.0.3" + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">=6.0.0" } }, - "node_modules/global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "node_modules/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==" + }, + "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==", "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "node_modules/http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "dependencies": { - "ini": "2.0.0" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.0.0" } }, - "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "dependencies": { - "type-fest": "^0.20.2" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=12.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", "dev": true, + "peer": true, "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/node": "^10.0.3" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true, + "peer": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dependencies": { - "get-intrinsic": "^1.1.3" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "node_modules/got": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.0.tgz", - "integrity": "sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==", - "dev": true, + "node_modules/http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "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": "^3.0.0" + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "node": ">=10.19.0" } }, - "node_modules/graceful-fs": { - "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==" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, + "node_modules/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==", "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" + "node": ">= 6" } }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=10.17.0" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": { + "ms": "^2.0.0" } }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "node_modules/husky": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "dev": true, + "bin": { + "husky": "lib/bin.js" }, "engines": { - "node": ">=6" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" } }, - "node_modules/hardhat": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.14.0.tgz", - "integrity": "sha512-73jsInY4zZahMSVFurSK+5TNCJTXMv+vemvGia0Ac34Mm19fYp6vEPVGF3sucbumszsYxiTT2TbS8Ii2dsDSoQ==", - "dev": true, + "node_modules/iconoir": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/iconoir/-/iconoir-5.5.2.tgz", + "integrity": "sha512-198g3lHrs1nMr4FBfJL3cBMl89NhJat342c684JVYJPlPpjFY2RBZAzD/rpAtg8LIOGXzNjcZzIb+IQCfY4Dqw==" + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-blockchain": "7.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-evm": "2.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-statemanager": "2.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "@nomicfoundation/ethereumjs-vm": "7.0.1", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", - "abort-controller": "^3.0.0", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "chalk": "^2.4.2", - "chokidar": "^3.4.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": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "qs": "^6.7.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "bin": { - "hardhat": "internal/cli/bootstrap.js" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "ts-node": "*", - "typescript": "*" + "node": ">=0.10.0" + } + }, + "node_modules/idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "dependencies": { + "punycode": "2.1.0" }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } + "engines": { + "node": ">=4.0.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==", - "dev": true, + "node_modules/idna-uts46-hx/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } ] }, - "node_modules/hardhat/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==", + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" + }, + "node_modules/immutable": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", + "dev": true + }, + "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==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hardhat/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hardhat/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==", - "dev": true + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } }, - "node_modules/hardhat/node_modules/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==", + "node_modules/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==", "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { - "color-name": "1.1.3" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/hardhat/node_modules/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 + "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/hardhat/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==", + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">=10" } }, - "node_modules/hardhat/node_modules/ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", - "dev": true, + "node_modules/inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", "dependencies": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" + "source-map": "~0.5.3" } }, - "node_modules/hardhat/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "node_modules/inquirer": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.0.tgz", + "integrity": "sha512-WWERbVqjsTXjXub1ZW0ZHDit1dyHqy0T9XIkky9TnmKAPrjU9Jkd59nZPK0dUuM3s73GZAZu2Jo4iFU3XSPVLA==", "dev": true, "dependencies": { - "locate-path": "^2.0.0" + "ansi-escapes": "^6.0.0", + "chalk": "^5.2.0", + "cli-cursor": "^4.0.0", + "cli-width": "^4.0.0", + "external-editor": "^3.0.3", + "figures": "^5.0.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^6.1.2", + "run-async": "^2.4.0", + "rxjs": "^7.8.0", + "string-width": "^5.1.2", + "strip-ansi": "^7.0.1", + "through": "^2.3.6", + "wrap-ansi": "^8.1.0" }, "engines": { - "node": ">=4" + "node": ">=14.18.0" } }, - "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==", + "node_modules/inquirer/node_modules/ansi-escapes": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", + "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "type-fest": "^3.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hardhat/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/inquirer/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "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" - }, "engines": { - "node": "*" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/hardhat/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==", + "node_modules/inquirer/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, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", "dev": true, "engines": { - "node": ">=4" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/hardhat/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "node_modules/inquirer/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hardhat/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/inquirer/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "dependencies": { - "p-try": "^1.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hardhat/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "dependencies": { - "p-limit": "^1.1.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/hardhat/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "node_modules/inquirer/node_modules/type-fest": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.10.0.tgz", + "integrity": "sha512-hmAPf1datm+gt3c2mvu0sJyhFy6lTkIGf0GzyaZWxRLnabQfPUqg6tF95RPg6sLxKI7nFLGdFxBcf2/7+GXI+A==", "dev": true, "engines": { - "node": ">=4" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "peerDependencies": { + "typescript": ">=4.7.0" } }, - "node_modules/hardhat/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "node_modules/inquirer/node_modules/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, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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==", - "dev": true, + "node_modules/insert-module-globals": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", + "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", "dependencies": { - "path-parse": "^1.0.6" + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "insert-module-globals": "bin/cmd.js" } }, - "node_modules/hardhat/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/int64-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-1.0.1.tgz", + "integrity": "sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw==", + "engines": { + "node": ">= 4.5.0" } }, - "node_modules/hardhat/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" }, "engines": { - "node": ">=4" + "node": ">= 0.4" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "engines": { - "node": ">= 0.4.0" + "node": ">=12" } }, - "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==", + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.10" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "node_modules/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==", + "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "fp-ts": "^1.0.0" } }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.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==", + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -14076,2817 +16035,2957 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "node_modules/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 + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "dependencies": { + "has-bigints": "^1.0.1" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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==", + "node_modules/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==", + "dev": true, "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/hash-base/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==", + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">= 6" - } - }, - "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==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "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==", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "node_modules/htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==", + "node_modules/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==", "engines": { - "node": ">=0.10" - } - }, - "node_modules/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==" - }, - "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==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "node": ">= 0.4" }, - "engines": { - "node": ">= 0.8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "dev": true, "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "ci-info": "^3.2.0" }, - "engines": { - "node": ">=8.0.0" + "bin": { + "is-ci": "bin.js" } }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "has": "^1.0.3" }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "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==", "dev": true, "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "engines": { - "node": ">=10.19.0" + "node": ">=0.10.0" } }, - "node_modules/https-browserify": { + "node_modules/is-fn": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" - }, - "node_modules/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==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, + "resolved": "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz", + "integrity": "sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg==", "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "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, "engines": { - "node": ">=10.17.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dependencies": { - "ms": "^2.0.0" - } + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" }, - "node_modules/husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, - "bin": { - "husky": "lib/bin.js" - }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" + "node": ">=6" } }, - "node_modules/iconoir": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/iconoir/-/iconoir-5.5.2.tgz", - "integrity": "sha512-198g3lHrs1nMr4FBfJL3cBMl89NhJat342c684JVYJPlPpjFY2RBZAzD/rpAtg8LIOGXzNjcZzIb+IQCfY4Dqw==" - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "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==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { - "punycode": "2.1.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=4.0.0" + "node": ">=0.10.0" } }, - "node_modules/idna-uts46-hx/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==", + "node_modules/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==", "engines": { - "node": ">=6" + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, "engines": { - "node": ">= 4" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/immediate": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", - "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" - }, - "node_modules/immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", - "dev": true - }, - "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==", + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "dev": true, "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, "engines": { - "node": ">=0.8.19" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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==", + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", "dev": true, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inflation": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", - "integrity": "sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==", + "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==", + "dev": true, "engines": { - "node": ">= 0.8.0" + "node": ">=0.12.0" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/ini": { + "node_modules/is-obj": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true, "engines": { - "node": ">=10" - } - }, - "node_modules/inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", - "dependencies": { - "source-map": "~0.5.3" + "node": ">=8" } }, - "node_modules/inquirer": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.0.tgz", - "integrity": "sha512-WWERbVqjsTXjXub1ZW0ZHDit1dyHqy0T9XIkky9TnmKAPrjU9Jkd59nZPK0dUuM3s73GZAZu2Jo4iFU3XSPVLA==", + "node_modules/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, - "dependencies": { - "ansi-escapes": "^6.0.0", - "chalk": "^5.2.0", - "cli-cursor": "^4.0.0", - "cli-width": "^4.0.0", - "external-editor": "^3.0.3", - "figures": "^5.0.0", - "lodash": "^4.17.21", - "mute-stream": "1.0.0", - "ora": "^6.1.2", - "run-async": "^2.4.0", - "rxjs": "^7.8.0", - "string-width": "^5.1.2", - "strip-ansi": "^7.0.1", - "through": "^2.3.6", - "wrap-ansi": "^8.1.0" - }, "engines": { - "node": ">=14.18.0" + "node": ">=8" } }, - "node_modules/inquirer/node_modules/ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, - "dependencies": { - "type-fest": "^3.0.0" - }, "engines": { - "node": ">=14.16" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, "engines": { - "node": ">=12" + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/inquirer/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==", + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", "dev": true, - "engines": { - "node": ">=12" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/inquirer/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "node_modules/is-ssh": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "dev": true, + "dependencies": { + "protocols": "^2.0.1" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inquirer/node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "dependencies": { - "restore-cursor": "^4.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/inquirer/node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "has-symbols": "^1.0.2" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", "dependencies": { - "ansi-regex": "^6.0.1" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/inquirer/node_modules/type-fest": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.10.0.tgz", - "integrity": "sha512-hmAPf1datm+gt3c2mvu0sJyhFy6lTkIGf0GzyaZWxRLnabQfPUqg6tF95RPg6sLxKI7nFLGdFxBcf2/7+GXI+A==", + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "dev": true, "engines": { - "node": ">=14.16" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" - }, - "peerDependencies": { - "typescript": ">=4.7.0" } }, - "node_modules/inquirer/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "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==", "dev": true, "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" + "call-bind": "^1.0.2" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/insert-module-globals": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", - "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, "dependencies": { - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "JSONStream": "^1.0.3", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" + "is-docker": "^2.0.0" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, "bin": { - "insert-module-globals": "bin/cmd.js" + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/int64-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-1.0.1.tgz", - "integrity": "sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw==", + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "dev": true, "engines": { - "node": ">= 4.5.0" + "node": ">=12" } }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isomorphic-unfetch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", + "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", + "dev": true, + "dependencies": { + "node-fetch": "^2.6.1", + "unfetch": "^4.2.0" + } + }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/issue-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10.13" } }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, "engines": { - "node": ">= 0.10" + "node": ">=8" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/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==", + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "dependencies": { - "fp-ts": "^1.0.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/istanbul-lib-source-maps/node_modules/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, "engines": { - "node": ">= 0.10" + "node": ">=0.10.0" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "node_modules/iterate-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", + "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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 - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", "dev": true, "dependencies": { - "has-bigints": "^1.0.1" + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/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==", - "dev": true, + "node_modules/jayson": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-3.7.0.tgz", + "integrity": "sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ==", "dependencies": { - "binary-extensions": "^2.0.0" + "@types/connect": "^3.4.33", + "@types/node": "^12.12.54", + "@types/ws": "^7.4.4", + "commander": "^2.20.3", + "delay": "^5.0.0", + "es6-promisify": "^5.0.0", + "eyes": "^0.1.8", + "isomorphic-ws": "^4.0.1", + "json-stringify-safe": "^5.0.1", + "JSONStream": "^1.3.5", + "lodash": "^4.17.20", + "uuid": "^8.3.2", + "ws": "^7.4.5" + }, + "bin": { + "jayson": "bin/jayson.js" }, "engines": { "node": ">=8" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "node_modules/jayson/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "node_modules/jayson/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/jest": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "@jest/core": "^29.5.0", + "@jest/types": "^29.5.0", + "import-local": "^3.0.2", + "jest-cli": "^29.5.0" }, - "engines": { - "node": ">= 0.4" + "bin": { + "jest": "bin/jest.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/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==", "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, - "bin": { - "is-ci": "bin.js" + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "node_modules/jest-changed-files": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", + "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "dev": true, "dependencies": { - "has": "^1.0.3" + "execa": "^5.0.0", + "p-limit": "^3.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/jest-circus": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", + "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "@jest/environment": "^29.5.0", + "@jest/expect": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.5.0", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.5.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "node_modules/jest-cli": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", + "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", "dev": true, + "dependencies": { + "@jest/core": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "prompts": "^2.0.1", + "yargs": "^17.3.1" + }, "bin": { - "is-docker": "cli.js" + "jest": "bin/jest.js" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fn/-/is-fn-1.0.0.tgz", - "integrity": "sha512-XoFPJQmsAShb3jEQRfzf2rqXavq7fIqF/jOekp308JlThqrODnMpweVSGilKTCXELfLhltGP2AGgbQGVP8F1dg==", - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "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==", + "node_modules/jest-config": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", + "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.5.0", + "@jest/types": "^29.5.0", + "babel-jest": "^29.5.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.5.0", + "jest-environment-node": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-runner": "^29.5.0", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">=12" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "node_modules/jest-diff": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", + "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/jest-docblock": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", + "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "detect-newline": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/jest-each": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", + "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", "dev": true, "dependencies": { - "is-extglob": "^2.1.1" + "@jest/types": "^29.5.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "jest-util": "^29.5.0", + "pretty-format": "^29.5.0" }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/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==", + "node_modules/jest-environment-node": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", + "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-mock": "^29.5.0", + "jest-util": "^29.5.0" + }, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", "dev": true, - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "node_modules/jest-haste-map": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", + "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", "dev": true, "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" + "@jest/types": "^29.5.0", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.4.3", + "jest-util": "^29.5.0", + "jest-worker": "^29.5.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" }, "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "node_modules/jest-leak-detector": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", + "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "node_modules/jest-matcher-utils": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", + "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "node_modules/jest-message-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", + "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.5.0", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.5.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "node_modules/jest-mock": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", + "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "@jest/types": "^29.5.0", + "@types/node": "*", + "jest-util": "^29.5.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=6" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } } }, - "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==", + "node_modules/jest-regex-util": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", + "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", "dev": true, "engines": { - "node": ">=0.12.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/jest-resolve": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", + "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.5.0", + "jest-validate": "^29.5.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "node_modules/jest-resolve-dependencies": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", + "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", "dev": true, + "dependencies": { + "jest-regex-util": "^29.4.3", + "jest-snapshot": "^29.5.0" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/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==", + "node_modules/jest-runner": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", + "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", "dev": true, + "dependencies": { + "@jest/console": "^29.5.0", + "@jest/environment": "^29.5.0", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.4.3", + "jest-environment-node": "^29.5.0", + "jest-haste-map": "^29.5.0", + "jest-leak-detector": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-resolve": "^29.5.0", + "jest-runtime": "^29.5.0", + "jest-util": "^29.5.0", + "jest-watcher": "^29.5.0", + "jest-worker": "^29.5.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "node_modules/jest-runner/node_modules/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, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/jest-runner/node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/jest-runtime": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", + "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "@jest/environment": "^29.5.0", + "@jest/fake-timers": "^29.5.0", + "@jest/globals": "^29.5.0", + "@jest/source-map": "^29.4.3", + "@jest/test-result": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-mock": "^29.5.0", + "jest-regex-util": "^29.4.3", + "jest-resolve": "^29.5.0", + "jest-snapshot": "^29.5.0", + "jest-util": "^29.5.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "node_modules/jest-snapshot": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", + "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.5.0", + "@jest/transform": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/babel__traverse": "^7.0.6", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.5.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.5.0", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.5.0", + "jest-message-util": "^29.5.0", + "jest-util": "^29.5.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.5.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "node_modules/jest-util": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", + "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "@jest/types": "^29.5.0", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "node_modules/jest-validate": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", + "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", "dev": true, "dependencies": { - "protocols": "^2.0.1" + "@jest/types": "^29.5.0", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.4.3", + "leven": "^3.1.0", + "pretty-format": "^29.5.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/jest-watcher": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", + "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", "dev": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "@jest/test-result": "^29.5.0", + "@jest/types": "^29.5.0", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.5.0", + "string-length": "^4.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/jest-worker": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", + "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "@types/node": "*", + "jest-util": "^29.5.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "node_modules/jest-worker/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==", + "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "node_modules/jiti": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", + "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jose": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.6.tgz", + "integrity": "sha512-FVoPY7SflDodE4lknJmbAHSUjLCzE2H1F6MS0RYKMQ8SR+lNccpMf8R4eqkNYyyUjR5qZReOzZo5C5YiHOCjjg==", + "dependencies": { + "@panva/asn1.js": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10.13.0 < 13 || >=13.7.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/panva" } }, - "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==", + "node_modules/js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", + "dev": true + }, + "node_modules/js-sdsl": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "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==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "is-docker": "^2.0.0" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=8" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/is-wsl/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "bin": { - "is-docker": "cli.js" + "jsesc": "bin/jsesc" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "dev": true, + "node_modules/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==" + }, + "node_modules/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 + }, + "node_modules/json-rpc-engine": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz", + "integrity": "sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==", + "dependencies": { + "@metamask/safe-event-emitter": "^2.0.0", + "eth-rpc-errors": "^4.0.2" + }, "engines": { - "node": ">=12" + "node": ">=10.0.0" } }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + "node_modules/json-rpc-engine/node_modules/eth-rpc-errors": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz", + "integrity": "sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==", + "dependencies": { + "fast-safe-stringify": "^2.0.6" + } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "node_modules/json-rpc-random-id": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", + "integrity": "sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, - "node_modules/isomorphic-unfetch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", - "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", - "dev": true, + "node_modules/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==" + }, + "node_modules/json-stable-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz", + "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==", "dependencies": { - "node-fetch": "^2.6.1", - "unfetch": "^4.2.0" + "jsonify": "^0.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/isomorphic-ws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", - "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "peerDependencies": { - "ws": "*" - } + "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 }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + "node_modules/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==" }, - "node_modules/issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", - "dev": true, - "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=10.13" + "node": ">=6" } }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/jsonschema": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz", + "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==", "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, "bin": { - "semver": "bin/semver.js" + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, + "node_modules/jsonwebtoken": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", + "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" }, "engines": { - "node": ">=8" + "node": ">=12", + "npm": ">=6" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" }, "engines": { - "node": ">=10" + "node": ">=0.6.0" } }, - "node_modules/istanbul-lib-source-maps/node_modules/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, - "engines": { - "node": ">=0.10.0" + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" } }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, + "node_modules/jwks-rsa": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-2.1.5.tgz", + "integrity": "sha512-IODtn1SwEm7n6GQZnQLY0oxKDrMh7n/jRH1MzE8mlxWMrh2NnMyOsXTebu8vJ1qCpmuTJcL4DdiE0E4h8jnwsA==", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "@types/express": "^4.17.14", + "@types/jsonwebtoken": "^8.5.9", + "debug": "^4.3.4", + "jose": "^2.0.6", + "limiter": "^1.1.5", + "lru-memoizer": "^2.1.4" }, "engines": { - "node": ">=8" + "node": ">=10 < 13 || >=14" } }, - "node_modules/iterate-iterator": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", - "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" } }, - "node_modules/iterate-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", - "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", - "dev": true, + "node_modules/keccak": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", + "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", + "hasInstallScript": true, "dependencies": { - "es-get-iterator": "^1.0.2", - "iterate-iterator": "^1.0.1" + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10.0.0" } }, - "node_modules/jayson": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/jayson/-/jayson-3.7.0.tgz", - "integrity": "sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ==", - "dependencies": { - "@types/connect": "^3.4.33", - "@types/node": "^12.12.54", - "@types/ws": "^7.4.4", - "commander": "^2.20.3", - "delay": "^5.0.0", - "es6-promisify": "^5.0.0", - "eyes": "^0.1.8", - "isomorphic-ws": "^4.0.1", - "json-stringify-safe": "^5.0.1", - "JSONStream": "^1.3.5", - "lodash": "^4.17.20", - "uuid": "^8.3.2", - "ws": "^7.4.5" - }, - "bin": { - "jayson": "bin/jayson.js" + "node_modules/keccak/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/jayson/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + "node_modules/keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dependencies": { + "json-buffer": "3.0.1" + } }, - "node_modules/jayson/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "node_modules/keyvaluestorage-interface": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz", + "integrity": "sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==" }, - "node_modules/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "node_modules/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, - "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", - "import-local": "^3.0.2", - "jest-cli": "^29.5.0" - }, - "bin": { - "jest": "bin/jest.js" - }, + "peer": true, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/jest-changed-files": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", - "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", "dev": true, - "dependencies": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "optionalDependencies": { + "graceful-fs": "^4.1.9" } }, - "node_modules/jest-circus": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6" } }, - "node_modules/jest-cli": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "node_modules/labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "dependencies": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } + }, + "node_modules/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, "dependencies": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" + "package-json": "^8.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": ">=14.16" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-config": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "node_modules/level": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", "dev": true, "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" + "node": ">=12" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/level" } }, - "node_modules/jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", - "dev": true, + "node_modules/level-codec": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", + "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" + }, + "node_modules/level-errors": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", + "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "errno": "~0.1.1" } }, - "node_modules/jest-docblock": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", - "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", - "dev": true, + "node_modules/level-iterator-stream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", + "integrity": "sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==", "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "inherits": "^2.0.1", + "level-errors": "^1.0.3", + "readable-stream": "^1.0.33", + "xtend": "^4.0.0" } }, - "node_modules/jest-each": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "node_modules/level-iterator-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/level-iterator-stream/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/level-iterator-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/level-supports": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", "dev": true, - "dependencies": { - "@jest/types": "^29.5.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/jest-environment-node": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "node_modules/level-transcoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "buffer": "^6.0.3", + "module-error": "^1.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node_modules/level-ws": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", + "integrity": "sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==", + "dependencies": { + "readable-stream": "~1.0.15", + "xtend": "~2.1.1" } }, - "node_modules/jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", - "dev": true, + "node_modules/level-ws/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/level-ws/node_modules/object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" + }, + "node_modules/level-ws/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dependencies": { - "@jest/types": "^29.5.0", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, - "node_modules/jest-leak-detector": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", - "dev": true, + "node_modules/level-ws/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/level-ws/node_modules/xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", "dependencies": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "object-keys": "~0.4.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=0.4" } }, - "node_modules/jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", - "dev": true, + "node_modules/levelup": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", + "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "deferred-leveldown": "~1.2.1", + "level-codec": "~7.0.0", + "level-errors": "~1.0.3", + "level-iterator-stream": "~1.3.0", + "prr": "~1.0.1", + "semver": "~5.4.1", + "xtend": "~4.0.0" } }, - "node_modules/jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "node_modules/levelup/node_modules/semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6" } }, - "node_modules/jest-mock": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "node_modules/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, "dependencies": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "jest-util": "^29.5.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.8.0" } }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "node_modules/libphonenumber-js": { + "version": "1.10.30", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.30.tgz", + "integrity": "sha512-PLGc+xfrQrkya/YK2/5X+bPpxRmyJBHM+xxz9krUdSgk4Vs2ZwxX5/Ow0lv3r9PDlDtNWb4u+it8MY5rZ0IyGw==" + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } + "node": ">=10" } }, - "node_modules/jest-regex-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", - "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + }, + "node_modules/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 + }, + "node_modules/lint-staged": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", + "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", "dev": true, + "dependencies": { + "chalk": "5.2.0", + "cli-truncate": "^3.1.0", + "commander": "^10.0.0", + "debug": "^4.3.4", + "execa": "^7.0.0", + "lilconfig": "2.1.0", + "listr2": "^5.0.7", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.3", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.2.2" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" } }, - "node_modules/jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/jest-resolve-dependencies": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "node_modules/lint-staged/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, - "dependencies": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=14" } }, - "node_modules/jest-runner": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "node_modules/lint-staged/node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/jest-runner/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/lint-staged/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-runner/node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "node": ">=14.18.0" } }, - "node_modules/jest-runtime": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", + "node_modules/lint-staged/node_modules/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, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-snapshot": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "node_modules/lint-staged/node_modules/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, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.5.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "path-key": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-validate": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "node_modules/lint-staged/node_modules/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, "dependencies": { - "@jest/types": "^29.5.0", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "leven": "^3.1.0", - "pretty-format": "^29.5.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/lint-staged/node_modules/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, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-watcher": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "node_modules/lint-staged/node_modules/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, - "dependencies": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.5.0", - "string-length": "^4.0.1" - }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.5.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "node": ">=12" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-worker/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==", + "node_modules/listr2": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "cli-truncate": "^2.1.0", + "colorette": "^2.0.19", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.8.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=10" + "node": "^14.13.1 || >=16.0.0" }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } } }, - "node_modules/jiti": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", - "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", + "node_modules/listr2/node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/jose": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/jose/-/jose-2.0.6.tgz", - "integrity": "sha512-FVoPY7SflDodE4lknJmbAHSUjLCzE2H1F6MS0RYKMQ8SR+lNccpMf8R4eqkNYyyUjR5qZReOzZo5C5YiHOCjjg==", "dependencies": { - "@panva/asn1.js": "^1.0.0" + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" }, "engines": { - "node": ">=10.13.0 < 13 || >=13.7.0" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/panva" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/js-cookie": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", - "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", + "node_modules/listr2/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==", "dev": true }, - "node_modules/js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "node_modules/listr2/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, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "engines": { + "node": ">=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==" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/listr2/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/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==" - }, - "node_modules/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 - }, - "node_modules/json-rpc-engine": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/json-rpc-engine/-/json-rpc-engine-6.1.0.tgz", - "integrity": "sha512-NEdLrtrq1jUZyfjkr9OCz9EzCNhnRyWtt1PAnvnhwy6e8XETS0Dtc+ZNCO2gvuAoKsIn2+vCSowXTYE4CkgnAQ==", + "node_modules/listr2/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==", + "dev": true, "dependencies": { - "@metamask/safe-event-emitter": "^2.0.0", - "eth-rpc-errors": "^4.0.2" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/json-rpc-engine/node_modules/eth-rpc-errors": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eth-rpc-errors/-/eth-rpc-errors-4.0.3.tgz", - "integrity": "sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==", - "dependencies": { - "fast-safe-stringify": "^2.0.6" + "node": ">=8" } }, - "node_modules/json-rpc-random-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz", - "integrity": "sha512-RJ9YYNCkhVDBuP4zN5BBtYAzEl03yq/jIIsyif0JY9qyJuQQZNeDK7anAPKKlyEtLSj2s8h6hNh2F8zO5q7ScA==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/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==" - }, - "node_modules/json-stable-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz", - "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==", - "dependencies": { - "jsonify": "^0.0.1" + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/antfu" } }, - "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 - }, - "node_modules/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==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/localtunnel": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", + "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", + "dev": true, + "dependencies": { + "axios": "0.21.4", + "debug": "4.3.2", + "openurl": "1.1.1", + "yargs": "17.1.1" + }, "bin": { - "json5": "lib/cli.js" + "lt": "bin/lt.js" }, "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.3.0" } }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/jsonschema": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.2.tgz", - "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==", - "engines": { - "node": "*" + "node_modules/localtunnel/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "node_modules/localtunnel/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "ms": "2.1.2" }, - "bin": { - "JSONStream": "bin.js" + "engines": { + "node": ">=6.0" }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/localtunnel/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==", + "dev": true + }, + "node_modules/localtunnel/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, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "node_modules/localtunnel/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==", + "dev": true, "dependencies": { - "jws": "^3.2.2", - "lodash": "^4.17.21", - "ms": "^2.1.1", - "semver": "^7.3.8" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=12", - "npm": ">=6" + "node": ">=8" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "node_modules/localtunnel/node_modules/yargs": { + "version": "17.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", + "dev": true, "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "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" }, "engines": { - "node": ">=0.6.0" + "node": ">=12" } }, - "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" + "node_modules/localtunnel/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" } }, - "node_modules/jwks-rsa": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-2.1.5.tgz", - "integrity": "sha512-IODtn1SwEm7n6GQZnQLY0oxKDrMh7n/jRH1MzE8mlxWMrh2NnMyOsXTebu8vJ1qCpmuTJcL4DdiE0E4h8jnwsA==", + "node_modules/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==", + "dev": true, "dependencies": { - "@types/express": "^4.17.14", - "@types/jsonwebtoken": "^8.5.9", - "debug": "^4.3.4", - "jose": "^2.0.6", - "limiter": "^1.1.5", - "lru-memoizer": "^2.1.4" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=10 < 13 || >=14" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/keccak": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", - "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", - "hasInstallScript": true, + "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 + }, + "node_modules/lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", + "dev": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==" + }, + "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 + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "peer": true + }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dev": true, "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/keccak/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==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true, "engines": { - "node": ">= 6" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, "dependencies": { - "json-buffer": "3.0.1" + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/keyvaluestorage-interface": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz", - "integrity": "sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==" + "node_modules/log-update/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==", + "dev": true }, - "node_modules/klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "node_modules/log-update/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, - "optionalDependencies": { - "graceful-fs": "^4.1.9" + "engines": { + "node": ">=8" } }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "node_modules/log-update/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, + "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/labeled-stream-splicer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", - "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "node_modules/log-update/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==", + "dev": true, "dependencies": { - "inherits": "^2.0.1", - "stream-splicer": "^2.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/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==", + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "dependencies": { - "package-json": "^8.1.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "dev": true, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dependencies": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" + "js-tokens": "^3.0.0 || ^4.0.0" }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/level-codec": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/level-codec/-/level-codec-7.0.1.tgz", - "integrity": "sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ==" + "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==", + "dev": true }, - "node_modules/level-errors": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/level-errors/-/level-errors-1.0.5.tgz", - "integrity": "sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig==", + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dependencies": { - "errno": "~0.1.1" + "yallist": "^3.0.2" } }, - "node_modules/level-iterator-stream": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", - "integrity": "sha512-1qua0RHNtr4nrZBgYlpV0qHHeHpcRRWTxEZJ8xsemoHAXNL5tbooh4tPEEqIqsbWCAJBmUmkwYK/sW5OrFjWWw==", + "node_modules/lru-memoizer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.2.0.tgz", + "integrity": "sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==", "dependencies": { - "inherits": "^2.0.1", - "level-errors": "^1.0.3", - "readable-stream": "^1.0.33", - "xtend": "^4.0.0" + "lodash.clonedeep": "^4.5.0", + "lru-cache": "~4.0.0" } }, - "node_modules/level-iterator-stream/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/level-iterator-stream/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "node_modules/lru-memoizer/node_modules/lru-cache": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", + "integrity": "sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "pseudomap": "^1.0.1", + "yallist": "^2.0.0" } }, - "node_modules/level-iterator-stream/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + "node_modules/lru-memoizer/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", + "node_modules/ltgt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", + "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==" + }, + "node_modules/macos-release": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.1.0.tgz", + "integrity": "sha512-/M/R0gCDgM+Cv1IuBG1XGdfTFnMEG6PZeT+KGWHO/OG+imqmaD9CH5vHBTycEM3+Kc4uG2Il+tFAuUWLqQOeUA==", "dev": true, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dev": true, "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" + "sourcemap-codec": "^1.4.8" } }, - "node_modules/level-ws": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/level-ws/-/level-ws-0.0.0.tgz", - "integrity": "sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==", + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, "dependencies": { - "readable-stream": "~1.0.15", - "xtend": "~2.1.1" + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/level-ws/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/level-ws/node_modules/object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==" + "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==", + "dev": true }, - "node_modules/level-ws/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "tmpl": "1.0.5" } }, - "node_modules/level-ws/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + "node_modules/map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", + "dev": true }, - "node_modules/level-ws/node_modules/xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==", + "node_modules/markdown-table": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", + "dev": true, + "peer": true + }, + "node_modules/mcl-wasm": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", + "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", + "dev": true, + "engines": { + "node": ">=8.9.0" + } + }, + "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==", "dependencies": { - "object-keys": "~0.4.0" - }, + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "engines": { - "node": ">=0.4" + "node": ">= 0.6" } }, - "node_modules/levelup": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-1.3.9.tgz", - "integrity": "sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==", + "node_modules/memdown": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", + "integrity": "sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==", "dependencies": { - "deferred-leveldown": "~1.2.1", - "level-codec": "~7.0.0", - "level-errors": "~1.0.3", - "level-iterator-stream": "~1.3.0", - "prr": "~1.0.1", - "semver": "~5.4.1", - "xtend": "~4.0.0" + "abstract-leveldown": "~2.7.1", + "functional-red-black-tree": "^1.0.1", + "immediate": "^3.2.3", + "inherits": "~2.0.1", + "ltgt": "~2.2.0", + "safe-buffer": "~5.1.1" } }, - "node_modules/levelup/node_modules/semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", - "bin": { - "semver": "bin/semver" + "node_modules/memdown/node_modules/abstract-leveldown": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", + "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", + "dependencies": { + "xtend": "~4.0.0" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/memdown/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/memory-level": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", + "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", "dev": true, "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "abstract-level": "^1.0.0", + "functional-red-black-tree": "^1.0.1", + "module-error": "^1.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">=12" } }, - "node_modules/libphonenumber-js": { - "version": "1.10.30", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.30.tgz", - "integrity": "sha512-PLGc+xfrQrkya/YK2/5X+bPpxRmyJBHM+xxz9krUdSgk4Vs2ZwxX5/Ow0lv3r9PDlDtNWb4u+it8MY5rZ0IyGw==" - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "dev": true, "engines": { - "node": ">=10" + "node": ">= 0.10.0" } }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, - "node_modules/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==", + "node_modules/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 }, - "node_modules/lint-staged": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.2.tgz", - "integrity": "sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==", + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "dependencies": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", - "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.2" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" + "node": ">= 8" } }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node_modules/merkle-lib": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", + "integrity": "sha512-XrNQvUbn1DL5hKNe46Ccs+Tu3/PYOlrcZILuGUhb95oKBPjc/nmIC8D462PQkipVDGKRvwhn+QFg2cCdIvmDJA==" + }, + "node_modules/merkle-patricia-tree": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", + "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", + "dependencies": { + "async": "^1.4.2", + "ethereumjs-util": "^5.0.0", + "level-ws": "0.0.0", + "levelup": "^1.2.1", + "memdown": "^1.0.0", + "readable-stream": "^2.0.0", + "rlp": "^2.0.0", + "semaphore": ">=1.0.1" } }, - "node_modules/lint-staged/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, + "node_modules/merkle-patricia-tree/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" + }, + "node_modules/merkle-patricia-tree/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/merkle-patricia-tree/node_modules/ethereumjs-util": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", + "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", + "dependencies": { + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "^0.1.3", + "rlp": "^2.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "engines": { - "node": ">=14" + "node": ">= 0.6" } }, - "node_modules/lint-staged/node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">=8.6" } }, - "node_modules/lint-staged/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" } }, - "node_modules/lint-staged/node_modules/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, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node_modules/miller-rabin/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/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, - "node_modules/lint-staged/node_modules/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, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/lint-staged/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "path-key": "^4.0.0" + "mime-db": "1.52.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/lint-staged/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/lint-staged/node_modules/path-key": { + "node_modules/mimic-response": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "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, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lint-staged/node_modules/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, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" } }, - "node_modules/listr2": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", - "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", - "dev": true, + "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==" + }, + "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==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } + "node": "*" } }, - "node_modules/listr2/node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, + "node_modules/minimatch/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==", "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/listr2/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==", - "dev": true + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/listr2/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==", + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "dev": true, "engines": { "node": ">=8" } }, - "node_modules/listr2/node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, + "node_modules/minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "minipass": "^2.9.0" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/listr2/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==", - "dev": true, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", + "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "mkdirp": "*" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/local-pkg": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", - "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "node_modules/mnemonist": { + "version": "0.38.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", + "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "dependencies": { + "obliterator": "^2.0.0" } }, - "node_modules/localtunnel": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", - "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, "dependencies": { - "axios": "0.21.4", - "debug": "4.3.2", - "openurl": "1.1.1", - "yargs": "17.1.1" + "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" }, "bin": { - "lt": "bin/lt.js" + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/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==", + "dev": true, "engines": { - "node": ">=8.3.0" + "node": ">=6" } }, - "node_modules/localtunnel/node_modules/cliui": { + "node_modules/mocha/node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", @@ -16897,87 +18996,77 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/localtunnel/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "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==", "dev": true, - "dependencies": { - "ms": "2.1.2" - }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=0.3.1" } }, - "node_modules/localtunnel/node_modules/emoji-regex": { + "node_modules/mocha/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==", "dev": true }, - "node_modules/localtunnel/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==", + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, + "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" + }, "engines": { - "node": ">=8" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/localtunnel/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==", + "node_modules/mocha/node_modules/glob/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, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/localtunnel/node_modules/yargs": { - "version": "17.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz", - "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", + "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==", "dev": true, "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/localtunnel/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/mocha/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, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/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==", + "node_modules/mocha/node_modules/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==", "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, "engines": { "node": ">=10" }, @@ -16985,154 +19074,53 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "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 - }, - "node_modules/lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "dev": true - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==" - }, - "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 - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true, - "peer": true - }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "node_modules/mocha/node_modules/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==", "dev": true, "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "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==", "dev": true, "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/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==", + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/log-update/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update/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==", + "node_modules/mocha/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==", "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/log-update/node_modules/string-width": { + "node_modules/mocha/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==", @@ -17146,1644 +19134,1708 @@ "node": ">=8" } }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "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==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "node": ">=10" }, - "bin": { - "loose-envify": "cli.js" + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, "dependencies": { - "get-func-name": "^2.0.0" + "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" + }, + "engines": { + "node": ">=10" } }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "node_modules/mocha/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==", + "dev": true, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "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==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } + "node_modules/mock-fs": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" }, - "node_modules/lru-memoizer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.2.0.tgz", - "integrity": "sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==", + "node_modules/modern-node-polyfills": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/modern-node-polyfills/-/modern-node-polyfills-0.1.3.tgz", + "integrity": "sha512-/4dB85Sdkt9MjWwtpKnsNTYhh0+fqjFC4ZEgDP4B0e6kyzbGUnX4NDxTUCaVwRLVF9gcEDcRQjol8pn05B3TUQ==", + "dev": true, "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "~4.0.0" + "@jspm/core": "2.0.0-beta.24", + "@rollup/pluginutils": "^3.1.0", + "esbuild": "^0.14.54", + "local-pkg": "^0.4.3" } }, - "node_modules/lru-memoizer/node_modules/lru-cache": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", - "integrity": "sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==", - "dependencies": { - "pseudomap": "^1.0.1", - "yallist": "^2.0.0" + "node_modules/modern-node-polyfills/node_modules/@esbuild/linux-loong64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", + "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/lru-memoizer/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - }, - "node_modules/ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==" - }, - "node_modules/macos-release": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.1.0.tgz", - "integrity": "sha512-/M/R0gCDgM+Cv1IuBG1XGdfTFnMEG6PZeT+KGWHO/OG+imqmaD9CH5vHBTycEM3+Kc4uG2Il+tFAuUWLqQOeUA==", + "node_modules/modern-node-polyfills/node_modules/esbuild": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", + "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "@esbuild/linux-loong64": "0.14.54", + "esbuild-android-64": "0.14.54", + "esbuild-android-arm64": "0.14.54", + "esbuild-darwin-64": "0.14.54", + "esbuild-darwin-arm64": "0.14.54", + "esbuild-freebsd-64": "0.14.54", + "esbuild-freebsd-arm64": "0.14.54", + "esbuild-linux-32": "0.14.54", + "esbuild-linux-64": "0.14.54", + "esbuild-linux-arm": "0.14.54", + "esbuild-linux-arm64": "0.14.54", + "esbuild-linux-mips64le": "0.14.54", + "esbuild-linux-ppc64le": "0.14.54", + "esbuild-linux-riscv64": "0.14.54", + "esbuild-linux-s390x": "0.14.54", + "esbuild-netbsd-64": "0.14.54", + "esbuild-openbsd-64": "0.14.54", + "esbuild-sunos-64": "0.14.54", + "esbuild-windows-32": "0.14.54", + "esbuild-windows-64": "0.14.54", + "esbuild-windows-arm64": "0.14.54" } }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "node_modules/modern-node-polyfills/node_modules/esbuild-android-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", + "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/modern-node-polyfills/node_modules/esbuild-android-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", + "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/modern-node-polyfills/node_modules/esbuild-darwin-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", + "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", + "cpu": [ + "x64" + ], "dev": true, - "bin": { - "semver": "bin/semver.js" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "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==", - "dev": true + "node_modules/modern-node-polyfills/node_modules/esbuild-darwin-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", + "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "node_modules/modern-node-polyfills/node_modules/esbuild-freebsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", + "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "tmpl": "1.0.5" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==", - "dev": true - }, - "node_modules/mcl-wasm": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", + "node_modules/modern-node-polyfills/node_modules/esbuild-freebsd-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", + "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8.9.0" + "node": ">=12" } }, - "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==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "node_modules/modern-node-polyfills/node_modules/esbuild-linux-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", + "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "node_modules/modern-node-polyfills/node_modules/esbuild-linux-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", + "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/memdown": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/memdown/-/memdown-1.4.1.tgz", - "integrity": "sha512-iVrGHZB8i4OQfM155xx8akvG9FIj+ht14DX5CQkCTG4EHzZ3d3sgckIf/Lm9ivZalEsFuEVnWv2B2WZvbrro2w==", - "dependencies": { - "abstract-leveldown": "~2.7.1", - "functional-red-black-tree": "^1.0.1", - "immediate": "^3.2.3", - "inherits": "~2.0.1", - "ltgt": "~2.2.0", - "safe-buffer": "~5.1.1" + "node_modules/modern-node-polyfills/node_modules/esbuild-linux-arm": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", + "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/memdown/node_modules/abstract-leveldown": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz", - "integrity": "sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w==", - "dependencies": { - "xtend": "~4.0.0" + "node_modules/modern-node-polyfills/node_modules/esbuild-linux-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", + "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/memdown/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/memory-level": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", - "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", + "node_modules/modern-node-polyfills/node_modules/esbuild-linux-mips64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", + "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "abstract-level": "^1.0.0", - "functional-red-black-tree": "^1.0.1", - "module-error": "^1.0.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=12" } }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "node_modules/modern-node-polyfills/node_modules/esbuild-linux-ppc64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", + "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", + "cpu": [ + "ppc64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.10.0" + "node": ">=12" } }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/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 - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/modern-node-polyfills/node_modules/esbuild-linux-riscv64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", + "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", + "cpu": [ + "riscv64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/merkle-lib": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/merkle-lib/-/merkle-lib-2.0.10.tgz", - "integrity": "sha512-XrNQvUbn1DL5hKNe46Ccs+Tu3/PYOlrcZILuGUhb95oKBPjc/nmIC8D462PQkipVDGKRvwhn+QFg2cCdIvmDJA==" - }, - "node_modules/merkle-patricia-tree": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz", - "integrity": "sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g==", - "dependencies": { - "async": "^1.4.2", - "ethereumjs-util": "^5.0.0", - "level-ws": "0.0.0", - "levelup": "^1.2.1", - "memdown": "^1.0.0", - "readable-stream": "^2.0.0", - "rlp": "^2.0.0", - "semaphore": ">=1.0.1" + "node_modules/modern-node-polyfills/node_modules/esbuild-linux-s390x": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", + "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/merkle-patricia-tree/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" - }, - "node_modules/merkle-patricia-tree/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/merkle-patricia-tree/node_modules/ethereumjs-util": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz", - "integrity": "sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ==", - "dependencies": { - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "^0.1.3", - "rlp": "^2.0.0", - "safe-buffer": "^5.1.1" + "node_modules/modern-node-polyfills/node_modules/esbuild-netbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", + "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "node_modules/modern-node-polyfills/node_modules/esbuild-openbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", + "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/modern-node-polyfills/node_modules/esbuild-sunos-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", + "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=8.6" + "node": ">=12" } }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" + "node_modules/modern-node-polyfills/node_modules/esbuild-windows-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", + "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/miller-rabin/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/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, + "node_modules/modern-node-polyfills/node_modules/esbuild-windows-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/modern-node-polyfills/node_modules/esbuild-windows-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", + "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/module-deps": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", + "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", "dependencies": { - "mime-db": "1.52.0" + "browser-resolve": "^2.0.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.2.0", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "module-deps": "bin/cmd.js" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8.0" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/module-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", "dev": true, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/mimic-response": { - "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, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "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/multibase": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" } }, - "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "node_modules/multibase/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "dom-walk": "^0.1.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "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==" + "node_modules/multicodec": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", + "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "varint": "^5.0.0" + } }, - "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==" + "node_modules/multihashes": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "dependencies": { + "buffer": "^5.5.0", + "multibase": "^0.7.0", + "varint": "^5.0.0" + } }, - "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/multihashes/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/minimatch/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==", + "node_modules/multihashes/node_modules/multibase": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", + "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "base-x": "^3.0.8", + "buffer": "^5.5.0" } }, - "node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", "dev": true, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, "dependencies": { - "minipass": "^2.9.0" + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" } }, - "node_modules/minizlib/node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { - "mkdirp": "bin/cmd.js" + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=10" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "node_modules/mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", - "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", - "dependencies": { - "mkdirp": "*" - }, - "engines": { - "node": ">=4" - } + "node_modules/napi-macros": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", + "dev": true }, - "node_modules/mnemonist": { - "version": "0.38.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", - "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", - "dev": true, - "dependencies": { - "obliterator": "^2.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 }, - "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "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" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true }, - "node_modules/mocha/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==", - "dev": true, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/mocha/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } + "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 }, - "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==", + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "dev": true, "engines": { - "node": ">=0.3.1" + "node": ">= 0.4.0" } }, - "node_modules/mocha/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==", - "dev": true - }, - "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/new-github-release-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", + "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", "dev": true, "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" + "type-fest": "^2.5.1" }, "engines": { - "node": "*" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/glob/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==", + "node_modules/new-github-release-url/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "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==" + }, + "node_modules/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==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], "engines": { - "node": "*" + "node": ">=10.5.0" } }, - "node_modules/mocha/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==", + "node_modules/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, - "engines": { - "node": ">=8" + "peer": true, + "dependencies": { + "lodash": "^4.17.21" } }, - "node_modules/mocha/node_modules/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==", + "node_modules/node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peer": true, + "dependencies": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" } }, - "node_modules/mocha/node_modules/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==", + "node_modules/node-environment-flags/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">=10" + "node": "4.x || >=6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "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==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" + "node_modules/node-gyp-build": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, - "node_modules/mocha/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==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" + }, + "node_modules/nodemailer": { + "version": "6.9.2", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.2.tgz", + "integrity": "sha512-4+TYaa/e1nIxQfyw/WzNPYTEZ5OvHIDEnmjs4LPmIfccPQN+2CYKmGHjWixn/chzD3bmUTu5FMfpltizMxqzdg==", "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=6.0.0" } }, - "node_modules/mocha/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==", + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12.19" } }, - "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==", + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", "dev": true, + "peer": true, "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" + "abbrev": "1" }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "bin": { + "nopt": "bin/nopt.js" } }, - "node_modules/mocha/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/mocha/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==", + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/mock-fs": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", - "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" - }, - "node_modules/modern-node-polyfills": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/modern-node-polyfills/-/modern-node-polyfills-0.1.3.tgz", - "integrity": "sha512-/4dB85Sdkt9MjWwtpKnsNTYhh0+fqjFC4ZEgDP4B0e6kyzbGUnX4NDxTUCaVwRLVF9gcEDcRQjol8pn05B3TUQ==", + "node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", "dev": true, - "dependencies": { - "@jspm/core": "2.0.0-beta.24", - "@rollup/pluginutils": "^3.1.0", - "esbuild": "^0.14.54", - "local-pkg": "^0.4.3" + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/modern-node-polyfills/node_modules/@esbuild/linux-loong64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", - "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", - "cpu": [ - "loong64" - ], + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "path-key": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", - "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "boolbase": "^1.0.0" }, - "engines": { - "node": ">=12" + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/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==", + "dependencies": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" }, - "optionalDependencies": { - "@esbuild/linux-loong64": "0.14.54", - "esbuild-android-64": "0.14.54", - "esbuild-android-arm64": "0.14.54", - "esbuild-darwin-64": "0.14.54", - "esbuild-darwin-arm64": "0.14.54", - "esbuild-freebsd-64": "0.14.54", - "esbuild-freebsd-arm64": "0.14.54", - "esbuild-linux-32": "0.14.54", - "esbuild-linux-64": "0.14.54", - "esbuild-linux-arm": "0.14.54", - "esbuild-linux-arm64": "0.14.54", - "esbuild-linux-mips64le": "0.14.54", - "esbuild-linux-ppc64le": "0.14.54", - "esbuild-linux-riscv64": "0.14.54", - "esbuild-linux-s390x": "0.14.54", - "esbuild-netbsd-64": "0.14.54", - "esbuild-openbsd-64": "0.14.54", - "esbuild-sunos-64": "0.14.54", - "esbuild-windows-32": "0.14.54", - "esbuild-windows-64": "0.14.54", - "esbuild-windows-arm64": "0.14.54" + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/number-to-bn/node_modules/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==" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-android-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", - "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-android-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", - "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", - "cpu": [ - "arm64" - ], + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true, - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=12" + "node": ">= 6" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-darwin-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", - "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-darwin-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", - "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-freebsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", - "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", - "cpu": [ - "x64" - ], + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-freebsd-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", - "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", - "cpu": [ - "arm64" - ], + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz", + "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "peer": true, + "dependencies": { + "array.prototype.reduce": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "safe-array-concat": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-linux-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", - "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/obliterator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", + "dev": true + }, + "node_modules/oboe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", + "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", + "dependencies": { + "http-https": "^1.0.0" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-linux-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", - "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", - "cpu": [ - "x64" - ], + "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==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "mimic-fn": "^2.1.0" + }, "engines": { - "node": ">=12" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-linux-arm": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", - "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", - "cpu": [ - "arm" - ], + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, "engines": { - "node": ">=12" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-linux-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", - "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", - "cpu": [ - "arm64" - ], + "node_modules/openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", + "dev": true + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "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.3" + }, "engines": { - "node": ">=12" + "node": ">= 0.8.0" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-linux-mips64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", - "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", - "cpu": [ - "mips64el" - ], + "node_modules/ora": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.0.tgz", + "integrity": "sha512-1/D8uRFY0ay2kgBpmAwmSA404w4OoPVhHMqRqtjvrcK/dnzcEZxMJ+V4DUbyICu8IIVRclHcOf5wlD1tMY4GUQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" + }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-linux-ppc64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", - "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", - "cpu": [ - "ppc64" - ], + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-linux-riscv64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", - "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", - "cpu": [ - "riscv64" - ], + "node_modules/ora/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-linux-s390x": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", - "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", - "cpu": [ - "s390x" - ], + "node_modules/ora/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "restore-cursor": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-netbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", - "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", - "cpu": [ - "x64" - ], + "node_modules/ora/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-openbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", - "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", - "cpu": [ - "x64" - ], + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-sunos-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", - "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", - "cpu": [ - "x64" - ], + "node_modules/ordinal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", + "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } + "peer": true }, - "node_modules/modern-node-polyfills/node_modules/esbuild-windows-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", - "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", - "cpu": [ - "ia32" - ], + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" + }, + "node_modules/os-name": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.1.0.tgz", + "integrity": "sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "macos-release": "^3.1.0", + "windows-release": "^5.0.1" + }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-windows-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", - "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", - "cpu": [ - "x64" - ], + "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==", "dev": true, - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/modern-node-polyfills/node_modules/esbuild-windows-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", - "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "engines": { - "node": ">=12" + "node": ">=12.20" } }, - "node_modules/module-deps": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", - "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { - "browser-resolve": "^2.0.0", - "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.2.0", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "JSONStream": "^1.0.3", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" + "yocto-queue": "^0.1.0" }, - "bin": { - "module-deps": "bin/cmd.js" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", + "node_modules/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==", "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } }, - "node_modules/multibase": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", - "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/pac-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "dev": true, "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/multibase/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/pac-resolver": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", + "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "dev": true, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "degenerator": "^3.0.2", + "ip": "^1.1.5", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/multicodec": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", - "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/package-json": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", + "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", + "dev": true, "dependencies": { - "varint": "^5.0.0" + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/multihashes": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", - "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "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, "dependencies": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/multihashes/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "path-platform": "~0.11.15" } }, - "node_modules/multihashes/node_modules/multibase": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", - "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, - "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", + "dev": true, + "peer": true + }, + "node_modules/parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + }, + "node_modules/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, + "dependencies": { + "@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" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "node_modules/parse-path": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", "dev": true, "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "protocols": "^2.0.0" } }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" - }, - "node_modules/nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" + "node_modules/parse-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "dev": true, + "dependencies": { + "parse-path": "^7.0.0" + } }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">= 0.8" } }, - "node_modules/napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", - "dev": true + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, - "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 + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true + "node_modules/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==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/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, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "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 + "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==" }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "dev": true, + "node_modules/path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", "engines": { - "node": ">= 0.4.0" + "node": ">= 0.8.0" } }, - "node_modules/new-github-release-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", - "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", + "node_modules/path-scurry": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", + "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", "dev": true, "dependencies": { - "type-fest": "^2.5.1" + "lru-cache": "^9.1.1", + "minipass": "^5.0.0 || ^6.0.2" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/new-github-release-url/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", + "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", "dev": true, "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "14 || >=16.14" } }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + "node_modules/path-scurry/node_modules/minipass": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", + "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } }, - "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==" + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, - "node_modules/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_modules/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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], "engines": { - "node": ">=10.5.0" + "node": ">=8" } }, - "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "engines": { + "node": "*" + } + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dev": true, "dependencies": { - "whatwg-url": "^5.0.0" + "through": "~2.3" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" }, "engines": { - "node": "4.x || >=6.0.0" + "node": ">=0.12" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/pg": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.0.tgz", + "integrity": "sha512-meLUVPn2TWgJyLmy7el3fQQVwft4gU5NGyvV0XbD41iU9Jbg8lCH4zexhIkihDzVHJStlt6r088G6/fWeNjhXA==", + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.6.0", + "pg-pool": "^3.6.0", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.0" }, "peerDependencies": { - "encoding": "^0.1.0" + "pg-native": ">=3.0.1" }, "peerDependenciesMeta": { - "encoding": { + "pg-native": { "optional": true } } }, - "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" - }, - "node_modules/nodemailer": { - "version": "6.9.2", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.2.tgz", - "integrity": "sha512-4+TYaa/e1nIxQfyw/WzNPYTEZ5OvHIDEnmjs4LPmIfccPQN+2CYKmGHjWixn/chzD3bmUTu5FMfpltizMxqzdg==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/nofilter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", - "dev": true, - "engines": { - "node": ">=12.19" - } + "node_modules/pg-cloudflare": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.0.tgz", + "integrity": "sha512-tGM8/s6frwuAIyRcJ6nWcIvd3+3NmUKIs6OjviIm1HPPFEt5MzQDOTBQyhPWg/m0kCl95M6gA1JaIXtS8KovOA==", + "optional": true }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/pg-connection-string": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.0.tgz", + "integrity": "sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==" }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", "engines": { - "node": ">=0.10.0" + "node": ">=4.0.0" } }, - "node_modules/normalize-url": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", - "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/pg-pool": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", + "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", + "peerDependencies": { + "pg": ">=8.0" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", "dependencies": { - "path-key": "^3.0.0" + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "split2": "^4.1.0" } }, - "node_modules/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==", - "dependencies": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/number-to-bn/node_modules/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==" - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, "engines": { - "node": "*" + "node": ">=0.10" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "node_modules/pirates": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", "dev": true, "engines": { "node": ">= 6" } }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" + "find-up": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==", - "dev": true - }, - "node_modules/oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", - "dependencies": { - "http-https": "^1.0.0" + "node": ">=8" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "dependencies": { - "ee-first": "1.1.1" + "p-locate": "^4.1.0" }, "engines": { - "node": ">= 0.8" - } - }, - "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==", - "dependencies": { - "wrappy": "1" + "node": ">=8" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" + "p-try": "^2.0.0" }, "engines": { "node": ">=6" @@ -18792,986 +20844,1057 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/openurl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", - "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==", - "dev": true + "node_modules/platform-deploy-client": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/platform-deploy-client/-/platform-deploy-client-0.6.0.tgz", + "integrity": "sha512-mBfnOvF2gb9acGJjlXBQ6VOAkKFRdljsNKHUVY5xKqzKP2PNh/RqCIvi5AR5NqLMrQ3XaMIwRvmwAjtGw7JhYg==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.6.3", + "axios": "^0.21.2", + "defender-base-client": "^1.44.0", + "lodash": "^4.17.19", + "node-fetch": "^2.6.0" + } + }, + "node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "engines": { + "node": ">=4.0.0" + } }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, + "node_modules/postcss": { + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "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.3" + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { - "node": ">= 0.8.0" + "node": "^10 || ^12 || >=14" } }, - "node_modules/ora": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.0.tgz", - "integrity": "sha512-1/D8uRFY0ay2kgBpmAwmSA404w4OoPVhHMqRqtjvrcK/dnzcEZxMJ+V4DUbyICu8IIVRclHcOf5wlD1tMY4GUQ==", + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dev": true, "dependencies": { - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=14.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.0.0" } }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "camelcase-css": "^2.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": "^12 || ^14 || >= 16" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" } }, - "node_modules/ora/node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", "dev": true, "dependencies": { - "restore-cursor": "^4.0.0" + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/ora/node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", "dev": true, "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "postcss-selector-parser": "^6.0.11" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" } }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=4" } }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true }, - "node_modules/os-name": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.1.0.tgz", - "integrity": "sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==", - "dev": true, - "dependencies": { - "macos-release": "^3.1.0", - "windows-release": "^5.0.1" - }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "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==", - "dev": true, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", "engines": { "node": ">=0.10.0" } }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", "engines": { - "node": ">=12.20" + "node": ">=0.10.0" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", "dependencies": { - "yocto-queue": "^0.1.0" + "xtend": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/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==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, + "node_modules/preact": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.4.1.tgz", + "integrity": "sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q==", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/preact" } }, - "node_modules/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==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, + "node_modules/precond": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", + "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/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, "engines": { - "node": ">=6" + "node": ">= 0.8.0" } }, - "node_modules/pac-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", - "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4", - "get-uri": "3", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "5", - "pac-resolver": "^5.0.0", - "raw-body": "^2.2.0", - "socks-proxy-agent": "5" + "node_modules/prettier": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "bin": { + "prettier": "bin-prettier.js" }, "engines": { - "node": ">= 8" + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/pac-resolver": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz", - "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==", + "node_modules/pretty-format": { + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", + "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", "dev": true, "dependencies": { - "degenerator": "^3.0.2", - "ip": "^1.1.5", - "netmask": "^2.0.2" + "@jest/schemas": "^29.4.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" }, "engines": { - "node": ">= 8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/package-json": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz", - "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, "engines": { - "node": ">=14.16" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/packet-reader": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", - "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "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, - "dependencies": { - "callsites": "^3.0.0" - }, + "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==", "engines": { - "node": ">=6" + "node": ">= 0.6.0" } }, - "node_modules/parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dev": true, + "peer": true, "dependencies": { - "path-platform": "~0.11.15" + "asap": "~2.0.6" } }, - "node_modules/parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "node_modules/promise-to-callback": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz", + "integrity": "sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA==", "dependencies": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "is-fn": "^1.0.0", + "set-immediate-shim": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/parse-headers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" - }, - "node_modules/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==", + "node_modules/promise.allsettled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.6.tgz", + "integrity": "sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==", "dev": true, "dependencies": { - "@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" + "array.prototype.map": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "iterate-value": "^1.0.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "dependencies": { - "protocols": "^2.0.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", "dev": true, "dependencies": { - "parse-path": "^7.0.0" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" } }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" - }, - "node_modules/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==", + "node_modules/proper-lockfile/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 4" } }, - "node_modules/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==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/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 }, - "node_modules/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, - "engines": { - "node": ">=8" + "node_modules/protobufjs": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" } }, - "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==" + "node_modules/protocols": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", + "dev": true }, - "node_modules/path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.10" } }, - "node_modules/path-scurry": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", - "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", + "node_modules/proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.2" + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 8" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", - "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", + "node_modules/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==" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" + }, + "node_modules/ps-tree": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", + "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", "dev": true, + "dependencies": { + "event-stream": "=3.3.4" + }, + "bin": { + "ps-tree": "bin/ps-tree.js" + }, "engines": { - "node": "14 || >=16.14" + "node": ">= 0.10" } }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", - "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "node_modules/public-encrypt/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/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, - "engines": { - "node": ">=8" + "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==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "dev": true, + "dependencies": { + "escape-goat": "^4.0.0" + }, "engines": { - "node": "*" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "node_modules/pure-rand": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", + "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/pushdata-bitcoin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz", + "integrity": "sha512-hw7rcYTJRAl4olM8Owe8x0fBuJJ+WGbMhQuLWOXEMN3PxPCKQHRkhfL+XG0+iXUmSHjkMmb3Ba55Mt21cZc9kQ==", "dependencies": { - "through": "~2.3" + "bitcoin-ops": "^1.3.0" } }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "node_modules/qrcode": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz", + "integrity": "sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==", "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "buffer": "^5.4.3", + "buffer-alloc": "^1.2.0", + "buffer-from": "^1.1.1", + "dijkstrajs": "^1.0.1", + "isarray": "^2.0.1", + "pngjs": "^3.3.0", + "yargs": "^13.2.4" + }, + "bin": { + "qrcode": "bin/qrcode" }, "engines": { - "node": ">=0.12" + "node": ">=4" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "node_modules/qrcode/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } }, - "node_modules/pg": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.0.tgz", - "integrity": "sha512-meLUVPn2TWgJyLmy7el3fQQVwft4gU5NGyvV0XbD41iU9Jbg8lCH4zexhIkihDzVHJStlt6r088G6/fWeNjhXA==", + "node_modules/qrcode/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==", "dependencies": { - "buffer-writer": "2.0.0", - "packet-reader": "1.0.0", - "pg-connection-string": "^2.6.0", - "pg-pool": "^3.6.0", - "pg-protocol": "^1.6.0", - "pg-types": "^2.1.0", - "pgpass": "1.x" + "color-convert": "^1.9.0" }, "engines": { - "node": ">= 8.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.1.0" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } + "node": ">=4" } }, - "node_modules/pg-cloudflare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.0.tgz", - "integrity": "sha512-tGM8/s6frwuAIyRcJ6nWcIvd3+3NmUKIs6OjviIm1HPPFEt5MzQDOTBQyhPWg/m0kCl95M6gA1JaIXtS8KovOA==", - "optional": true - }, - "node_modules/pg-connection-string": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.0.tgz", - "integrity": "sha512-x14ibktcwlHKoHxx9X3uTVW9zIGR41ZB6QNhHb21OPNdCCO3NaRnpJuwKIQSR4u+Yqjx4HCvy7Hh7VSy1U4dGg==" + "node_modules/qrcode/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "engines": { - "node": ">=4.0.0" + "node_modules/qrcode/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "node_modules/pg-pool": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.0.tgz", - "integrity": "sha512-clFRf2ksqd+F497kWFyM21tMjeikn60oGDmqMT8UBrynEwVEX/5R5xd2sdvdo1cZCFlguORNpVuqxIj+aK4cfQ==", - "peerDependencies": { - "pg": ">=8.0" + "node_modules/qrcode/node_modules/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==", + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/pg-protocol": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", - "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + "node_modules/qrcode/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "node_modules/qrcode/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/qrcode/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" + "locate-path": "^3.0.0" }, + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "engines": { "node": ">=4" } }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "node_modules/qrcode/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dependencies": { - "split2": "^4.1.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, + "node_modules/qrcode/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">=8.6" + "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" + "node_modules/qrcode/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" }, "engines": { - "node": ">=0.10" + "node": ">=6" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, + "node_modules/qrcode/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true, + "node_modules/qrcode/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, "engines": { - "node": ">= 6" + "node": ">=6" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, + "node_modules/qrcode/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dependencies": { - "find-up": "^4.0.0" + "ansi-regex": "^4.1.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, + "node_modules/qrcode/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, + "node_modules/qrcode/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/qrcode/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dependencies": { - "p-locate": "^4.1.0" + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/qrcode/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" }, "engines": { - "node": ">=8" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/query-string": { + "version": "6.13.5", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.5.tgz", + "integrity": "sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q==", + "dependencies": { + "decode-uri-component": "^0.2.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "engines": { + "node": ">=0.4.x" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/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, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "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==", "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "safe-buffer": "^5.1.0" } }, - "node_modules/platform-deploy-client": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/platform-deploy-client/-/platform-deploy-client-0.6.0.tgz", - "integrity": "sha512-mBfnOvF2gb9acGJjlXBQ6VOAkKFRdljsNKHUVY5xKqzKP2PNh/RqCIvi5AR5NqLMrQ3XaMIwRvmwAjtGw7JhYg==", - "dev": true, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dependencies": { - "@ethersproject/abi": "^5.6.3", - "axios": "^0.21.2", - "defender-base-client": "^1.44.0", - "lodash": "^4.17.19", - "node-fetch": "^2.6.0" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, - "node_modules/pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "engines": { - "node": ">=4.0.0" + "node": ">= 0.6" } }, - "node_modules/postcss": { - "version": "8.4.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", - "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">= 0.8" } }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" + "node": ">=0.10.0" } }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, - "peerDependencies": { - "postcss": "^8.4.21" + "bin": { + "rc": "cli.js" } }, - "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "node_modules/rc/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 + }, + "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, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", "dependencies": { - "postcss-selector-parser": "^6.0.11" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" }, "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" + "node": ">=0.10.0" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "react": "17.0.2" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/postgres-bytea": { + "node_modules/read-cache": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "engines": { - "node": ">=0.10.0" + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" } }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "node_modules/read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" + "readable-stream": "^2.0.2" } }, - "node_modules/preact": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.4.1.tgz", - "integrity": "sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/precond": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/precond/-/precond-0.2.3.tgz", - "integrity": "sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==", - "engines": { - "node": ">= 0.6" - } + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, - "node_modules/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, - "engines": { - "node": ">= 0.8.0" + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", - "bin": { - "prettier": "bin-prettier.js" + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" }, "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">=8.10.0" } }, - "node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "node_modules/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, "dependencies": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "resolve": "^1.1.6" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.10" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/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, - "engines": { - "node": ">=10" + "peer": true, + "dependencies": { + "minimatch": "^3.0.5" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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==", "engines": { - "node": ">= 0.6.0" + "node": ">=6.0.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/promise-to-callback": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/promise-to-callback/-/promise-to-callback-1.0.0.tgz", - "integrity": "sha512-uhMIZmKM5ZteDMfLgJnoSq9GCwsNKrYau73Awf1jIy6/eUcuuZ3P+CD9zUv0kJsIUbU+x6uLNIhXhLHDs1pNPA==", - "dependencies": { - "is-fn": "^1.0.0", - "set-immediate-shim": "^1.0.1" - }, + "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, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/promise.allsettled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.6.tgz", - "integrity": "sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==", + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { - "array.prototype.map": "^1.0.5", "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "iterate-value": "^1.0.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -19780,752 +21903,858 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", "dev": true, "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "@pnpm/npm-conf": "^2.1.0" }, "engines": { - "node": ">= 6" + "node": ">=14" } }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "node_modules/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, "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "node_modules/proper-lockfile/node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, + "rc": "1.2.8" + }, "engines": { - "node": ">= 4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/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 - }, - "node_modules/protobufjs": { - "version": "6.11.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", - "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", - "hasInstallScript": true, + "node_modules/release-it": { + "version": "15.10.3", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-15.10.3.tgz", + "integrity": "sha512-OSdHOg76gwkpLbSLBK09GZQj5XWXwBP+S6v//rSoQKkjqklaCLK04Gl5NkTwNrQOHHiihs4ToesDNh2+w55k3w==", + "dev": true, "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" + "@iarna/toml": "2.2.5", + "@octokit/rest": "19.0.7", + "async-retry": "1.3.3", + "chalk": "5.2.0", + "cosmiconfig": "8.1.3", + "execa": "7.1.1", + "git-url-parse": "13.1.0", + "globby": "13.1.4", + "got": "12.6.0", + "inquirer": "9.2.0", + "is-ci": "3.0.1", + "issue-parser": "6.0.0", + "lodash": "4.17.21", + "mime-types": "2.1.35", + "new-github-release-url": "2.0.0", + "node-fetch": "3.3.1", + "open": "9.1.0", + "ora": "6.3.0", + "os-name": "5.1.0", + "promise.allsettled": "1.0.6", + "proxy-agent": "5.0.0", + "semver": "7.5.0", + "shelljs": "0.8.5", + "update-notifier": "6.0.2", + "url-join": "5.0.0", + "wildcard-match": "5.1.2", + "yargs-parser": "21.1.1" }, "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, - "node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "release-it": "bin/release-it.js" + }, + "engines": { + "node": ">=14.9" + } + }, + "node_modules/release-it/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/release-it/node_modules/data-uri-to-buffer": { + "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==", + "dev": true, "engines": { - "node": ">= 0.10" + "node": ">= 12" } }, - "node_modules/proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", - "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", + "node_modules/release-it/node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", "dev": true, "dependencies": { - "agent-base": "^6.0.0", - "debug": "4", - "http-proxy-agent": "^4.0.0", - "https-proxy-agent": "^5.0.0", - "lru-cache": "^5.1.1", - "pac-proxy-agent": "^5.0.0", - "proxy-from-env": "^1.0.0", - "socks-proxy-agent": "^5.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">= 8" + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/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==" - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==" - }, - "node_modules/ps-tree": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", - "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", + "node_modules/release-it/node_modules/globby": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", "dev": true, "dependencies": { - "event-stream": "=3.3.4" - }, - "bin": { - "ps-tree": "bin/ps-tree.js" + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" }, "engines": { - "node": ">= 0.10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" + "node_modules/release-it/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" } }, - "node_modules/public-encrypt/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/pump": { + "node_modules/release-it/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" - }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, - "dependencies": { - "escape-goat": "^4.0.0" - }, "engines": { - "node": ">=12.20" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pure-rand": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", - "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "node_modules/release-it/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, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/pushdata-bitcoin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz", - "integrity": "sha512-hw7rcYTJRAl4olM8Owe8x0fBuJJ+WGbMhQuLWOXEMN3PxPCKQHRkhfL+XG0+iXUmSHjkMmb3Ba55Mt21cZc9kQ==", "dependencies": { - "bitcoin-ops": "^1.3.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/qrcode": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.4.4.tgz", - "integrity": "sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==", - "dependencies": { - "buffer": "^5.4.3", - "buffer-alloc": "^1.2.0", - "buffer-from": "^1.1.1", - "dijkstrajs": "^1.0.1", - "isarray": "^2.0.1", - "pngjs": "^3.3.0", - "yargs": "^13.2.4" - }, - "bin": { - "qrcode": "bin/qrcode" - }, + "node_modules/release-it/node_modules/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, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/qrcode/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/release-it/node_modules/node-fetch": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", + "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, - "node_modules/qrcode/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==", + "node_modules/release-it/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/qrcode/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/release-it/node_modules/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, "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/qrcode/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "node_modules/release-it/node_modules/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, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/qrcode/node_modules/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==", + "node_modules/release-it/node_modules/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "dev": true, "dependencies": { - "color-name": "1.1.3" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/qrcode/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/qrcode/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "node_modules/release-it/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/qrcode/node_modules/find-up": { + "node_modules/release-it/node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/req-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", + "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", + "dev": true, + "peer": true, "dependencies": { - "locate-path": "^3.0.0" + "req-from": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/qrcode/node_modules/is-fullwidth-code-point": { + "node_modules/req-from": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", + "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", + "dev": true, + "peer": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, "engines": { "node": ">=4" } }, - "node_modules/qrcode/node_modules/locate-path": { + "node_modules/req-from/node_modules/resolve-from": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, "engines": { - "node": ">=6" + "node": ">= 6" } }, - "node_modules/qrcode/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "peer": true, "dependencies": { - "p-try": "^2.0.0" + "lodash": "^4.17.19" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "request": "^2.34" } }, - "node_modules/qrcode/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dev": true, + "peer": true, "dependencies": { - "p-limit": "^2.0.0" + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" }, "engines": { - "node": ">=6" + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" } }, - "node_modules/qrcode/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "engines": { - "node": ">=4" + "node": ">=0.6" } }, - "node_modules/qrcode/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/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==", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/qrcode/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dependencies": { - "ansi-regex": "^4.1.0" + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=6" + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/qrcode/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "node_modules/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==" + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/qrcode/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - }, - "node_modules/qrcode/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "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, + "engines": { + "node": ">=4" } }, - "node_modules/qrcode/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" } }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "lowercase-keys": "^3.0.0" }, "engines": { - "node": ">=0.6" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/query-string": { - "version": "6.13.5", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.5.tgz", - "integrity": "sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q==", + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, "dependencies": { - "decode-uri-component": "^0.2.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, "engines": { - "node": ">=0.4.x" + "node": ">= 4" } }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, "engines": { - "node": ">=0.4.x" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "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" - } - ] + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "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==", + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/ripple-address-codec": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.2.5.tgz", + "integrity": "sha512-SZ96zZH+0REeyEcYVFl0vqcsGRXiFXS2RUgHupHhtVkOEk6men53vngVjJwBrSnY+oa6Cri15q1zSni3DEoxNw==", + "dependencies": { + "base-x": "^3.0.9", + "create-hash": "^1.1.2" + }, "engines": { - "node": ">=10" + "node": ">= 10" + } + }, + "node_modules/ripple-binary-codec": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-1.4.3.tgz", + "integrity": "sha512-P4ALjAJWBJpRApTQO+dJCrHE6mZxm7ypZot9OS0a3RCKOWTReNw0pDWfdhCGh1qXh71TeQnAk4CHdMLwR/76oQ==", + "dependencies": { + "assert": "^2.0.0", + "big-integer": "^1.6.48", + "buffer": "5.6.0", + "create-hash": "^1.2.0", + "decimal.js": "^10.2.0", + "ripple-address-codec": "^4.2.5" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 10" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/ripple-binary-codec/node_modules/assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", "dependencies": { - "safe-buffer": "^5.1.0" + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" } }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "node_modules/ripple-binary-codec/node_modules/buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/ripple-keypairs": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.1.5.tgz", + "integrity": "sha512-wLJXIBsMVazn2Yp/7oP4PvgA4Gd1HtuZLftdEJFNOLgraf82phqa2AnNK3t9f3XeQnApW1jAe/FcFFOY6QUn5w==", + "dependencies": { + "bn.js": "^5.1.1", + "brorand": "^1.0.5", + "elliptic": "^6.5.4", + "hash.js": "^1.0.3", + "ripple-address-codec": "^4.2.5" + }, "engines": { - "node": ">= 0.6" + "node": ">= 10" } }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "node_modules/ripple-lib": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/ripple-lib/-/ripple-lib-1.10.1.tgz", + "integrity": "sha512-OQk+Syl2JfxKxV2KuF/kBMtnh012I5tNnziP3G4WDGCGSIAgeqkOgkR59IQ0YDNrs1YW8GbApxrdMSRi/QClcA==", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "@types/lodash": "^4.14.136", + "@types/ws": "^7.2.0", + "bignumber.js": "^9.0.0", + "https-proxy-agent": "^5.0.0", + "jsonschema": "1.2.2", + "lodash": "^4.17.4", + "ripple-address-codec": "^4.1.1", + "ripple-binary-codec": "^1.1.3", + "ripple-keypairs": "^1.0.3", + "ripple-lib-transactionparser": "0.8.2", + "ws": "^7.2.0" }, "engines": { - "node": ">= 0.8" + "node": ">=10.13.0", + "yarn": "^1.15.2" } }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/ripple-lib-transactionparser": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/ripple-lib-transactionparser/-/ripple-lib-transactionparser-0.8.2.tgz", + "integrity": "sha512-1teosQLjYHLyOQrKUQfYyMjDR3MAq/Ga+MJuLUfpBMypl4LZB4bEoMcmG99/+WVTEiZOezJmH9iCSvm/MyxD+g==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" + "bignumber.js": "^9.0.0", + "lodash": "^4.17.15" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, + "node_modules/rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "bn.js": "^5.2.0" }, "bin": { - "rc": "cli.js" + "rlp": "bin/rlp" } }, - "node_modules/rc/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 + "node_modules/robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" }, - "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==", + "node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "peer": true, + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "node_modules/rollup-plugin-inject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", + "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", + "dev": true, "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" + "estree-walker": "^0.6.1", + "magic-string": "^0.25.3", + "rollup-pluginutils": "^2.8.1" } }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "node_modules/rollup-plugin-inject/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", "dev": true }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "node_modules/rollup-plugin-node-polyfills": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", + "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", "dev": true, "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", - "dependencies": { - "readable-stream": "^2.0.2" + "rollup-plugin-inject": "^3.0.0" } }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/rollup-plugin-polyfill-node": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-polyfill-node/-/rollup-plugin-polyfill-node-0.11.0.tgz", + "integrity": "sha512-5t+qhq4LAQKQBgbPOQJEoxxGzU5b+zLfvzpUAGy9u0MCMs8y+mrjUAv8+xrkWdxnwXQwJtjmCMnA9lCflsMzNw==", + "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "@rollup/plugin-inject": "^5.0.1" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0" } }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/readable-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/rollup-plugin-polyfill-node/node_modules/@rollup/plugin-inject": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.3.tgz", + "integrity": "sha512-411QlbL+z2yXpRWFXSmw/teQRMkXcAAC8aYTemc15gwJRpvEVDQwoe+N/HTFD8RFG8+88Bme9DK2V9CVm7hJdA==", + "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "@rollup/pluginutils": "^5.0.1", + "estree-walker": "^2.0.2", + "magic-string": "^0.27.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/rollup-plugin-polyfill-node/node_modules/@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", "dev": true, "dependencies": { - "picomatch": "^2.2.1" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=8.10.0" + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "node_modules/rollup-plugin-polyfill-node/node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "node_modules/rollup-plugin-polyfill-node/node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", "dev": true, "dependencies": { - "resolve": "^1.1.6" + "@jridgewell/sourcemap-codec": "^1.4.13" }, "engines": { - "node": ">= 0.10" + "node": ">=12" } }, - "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==", + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "estree-walker": "^0.6.1" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dev": true, + "node_modules/rpc-websockets": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.5.1.tgz", + "integrity": "sha512-kGFkeTsmd37pHPMaHIgN1LVKXMi0JD782v4Ds9ZKtLlwdTKjn+CxM9A9/gLT2LaOuEcEFGL98h1QWQtlOIdW0w==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" + "@babel/runtime": "^7.17.2", + "eventemitter3": "^4.0.7", + "uuid": "^8.3.2", + "ws": "^8.5.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "paypal", + "url": "https://paypal.me/kozjak" + }, + "optionalDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" } }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dev": true, - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, + "node_modules/rpc-websockets/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==", "engines": { - "node": ">=14" + "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/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", "dev": true, "dependencies": { - "rc": "1.2.8" + "execa": "^5.0.0" }, "engines": { "node": ">=12" @@ -20534,1372 +22763,1583 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/release-it": { - "version": "15.10.3", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-15.10.3.tgz", - "integrity": "sha512-OSdHOg76gwkpLbSLBK09GZQj5XWXwBP+S6v//rSoQKkjqklaCLK04Gl5NkTwNrQOHHiihs4ToesDNh2+w55k3w==", + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true, - "dependencies": { - "@iarna/toml": "2.2.5", - "@octokit/rest": "19.0.7", - "async-retry": "1.3.3", - "chalk": "5.2.0", - "cosmiconfig": "8.1.3", - "execa": "7.1.1", - "git-url-parse": "13.1.0", - "globby": "13.1.4", - "got": "12.6.0", - "inquirer": "9.2.0", - "is-ci": "3.0.1", - "issue-parser": "6.0.0", - "lodash": "4.17.21", - "mime-types": "2.1.35", - "new-github-release-url": "2.0.0", - "node-fetch": "3.3.1", - "open": "9.1.0", - "ora": "6.3.0", - "os-name": "5.1.0", - "promise.allsettled": "1.0.6", - "proxy-agent": "5.0.0", - "semver": "7.5.0", - "shelljs": "0.8.5", - "update-notifier": "6.0.2", - "url-join": "5.0.0", - "wildcard-match": "5.1.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "release-it": "bin/release-it.js" - }, "engines": { - "node": ">=14.9" + "node": ">=0.12.0" } }, - "node_modules/release-it/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "node_modules/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, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "node_modules/release-it/node_modules/data-uri-to-buffer": { - "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==", + "node_modules/run-parallel-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", + "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", "dev": true, - "engines": { - "node": ">= 12" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "node_modules/release-it/node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "node_modules/rustbn.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, + "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==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "tslib": "^2.1.0" } }, - "node_modules/release-it/node_modules/globby": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", "dev": true, + "peer": true, "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/release-it/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" + "node_modules/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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-event-emitter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz", + "integrity": "sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==", + "deprecated": "Renamed to @metamask/safe-event-emitter", + "dependencies": { + "events": "^3.0.0" } }, - "node_modules/release-it/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/release-it/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==", + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "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, + "peer": true, "dependencies": { - "yallist": "^4.0.0" + "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" }, - "engines": { - "node": ">=10" + "bin": { + "istanbul": "lib/cli.js" } }, - "node_modules/release-it/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "node_modules/sc-istanbul/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" } }, - "node_modules/release-it/node_modules/node-fetch": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", - "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", + "node_modules/sc-istanbul/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true, + "peer": true + }, + "node_modules/sc-istanbul/node_modules/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, + "peer": true, "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=0.12.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "optionalDependencies": { + "source-map": "~0.2.0" } }, - "node_modules/release-it/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "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==", "dev": true, - "dependencies": { - "path-key": "^4.0.0" + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/release-it/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "node_modules/sc-istanbul/node_modules/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, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sc-istanbul/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", "dev": true, + "peer": true, "dependencies": { - "mimic-fn": "^4.0.0" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/release-it/node_modules/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==", + "node_modules/sc-istanbul/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", "dev": true, + "peer": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/release-it/node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "node_modules/sc-istanbul/node_modules/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, + "peer": true, "dependencies": { - "lru-cache": "^6.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, "bin": { - "semver": "bin/semver.js" + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/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, + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/release-it/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "node_modules/sc-istanbul/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, - "engines": { - "node": ">=12" + "peer": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/release-it/node_modules/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==", + "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==", "dev": true, - "engines": { - "node": ">=12" + "peer": true, + "dependencies": { + "minimist": "^1.2.6" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/release-it/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "node_modules/sc-istanbul/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "peer": true, "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "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" }, "engines": { - "node": ">= 6" + "node": ">= 0.8.0" } }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "node_modules/sc-istanbul/node_modules/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, + "peer": true, "engines": { - "node": ">=0.6" + "node": ">= 0.8.0" } }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } + "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, + "peer": true }, - "node_modules/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==", + "node_modules/sc-istanbul/node_modules/source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, - "node_modules/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==", + "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, + "peer": true, + "dependencies": { + "has-flag": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "node_modules/sc-istanbul/node_modules/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, + "peer": true, "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "prelude-ls": "~1.1.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/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==" - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "node_modules/sc-istanbul/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "peer": true, "dependencies": { - "resolve-from": "^5.0.0" + "isexe": "^2.0.0" }, - "engines": { - "node": ">=8" + "bin": { + "which": "bin/which" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/scmp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.1.0.tgz", + "integrity": "sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==" + }, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "hasInstallScript": true, + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, "engines": { - "node": ">=8" + "node": ">=10.0.0" } }, - "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, + "node_modules/semaphore": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", + "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", "engines": { - "node": ">=4" + "node": ">=0.8.0" } }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, + "node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { "node": ">=10" } }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", "dev": true, "dependencies": { - "lowercase-keys": "^3.0.0" + "semver": "^7.3.5" }, "engines": { - "node": ">=14.16" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, + "node_modules/semver/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==", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "yallist": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">= 0.8.0" } }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "ms": "2.0.0" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "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==", + "dev": true, "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "randombytes": "^2.1.0" } }, - "node_modules/ripple-address-codec": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/ripple-address-codec/-/ripple-address-codec-4.2.5.tgz", - "integrity": "sha512-SZ96zZH+0REeyEcYVFl0vqcsGRXiFXS2RUgHupHhtVkOEk6men53vngVjJwBrSnY+oa6Cri15q1zSni3DEoxNw==", + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dependencies": { - "base-x": "^3.0.9", - "create-hash": "^1.1.2" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" }, "engines": { - "node": ">= 10" + "node": ">= 0.8.0" } }, - "node_modules/ripple-binary-codec": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ripple-binary-codec/-/ripple-binary-codec-1.4.3.tgz", - "integrity": "sha512-P4ALjAJWBJpRApTQO+dJCrHE6mZxm7ypZot9OS0a3RCKOWTReNw0pDWfdhCGh1qXh71TeQnAk4CHdMLwR/76oQ==", + "node_modules/servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", "dependencies": { - "assert": "^2.0.0", - "big-integer": "^1.6.48", - "buffer": "5.6.0", - "create-hash": "^1.2.0", - "decimal.js": "^10.2.0", - "ripple-address-codec": "^4.2.5" + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" }, "engines": { - "node": ">= 10" + "node": ">=6" } }, - "node_modules/ripple-binary-codec/node_modules/assert": { + "node_modules/set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", - "dependencies": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" - } + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, - "node_modules/ripple-binary-codec/node_modules/buffer": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", - "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "node_modules/set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/ripple-keypairs": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ripple-keypairs/-/ripple-keypairs-1.1.5.tgz", - "integrity": "sha512-wLJXIBsMVazn2Yp/7oP4PvgA4Gd1HtuZLftdEJFNOLgraf82phqa2AnNK3t9f3XeQnApW1jAe/FcFFOY6QUn5w==", + "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==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "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==", "dependencies": { - "bn.js": "^5.1.1", - "brorand": "^1.0.5", - "elliptic": "^6.5.4", - "hash.js": "^1.0.3", - "ripple-address-codec": "^4.2.5" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" }, - "engines": { - "node": ">= 10" + "bin": { + "sha.js": "bin.js" } }, - "node_modules/ripple-lib": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/ripple-lib/-/ripple-lib-1.10.1.tgz", - "integrity": "sha512-OQk+Syl2JfxKxV2KuF/kBMtnh012I5tNnziP3G4WDGCGSIAgeqkOgkR59IQ0YDNrs1YW8GbApxrdMSRi/QClcA==", + "node_modules/sha1": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", + "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", + "dev": true, + "peer": true, "dependencies": { - "@types/lodash": "^4.14.136", - "@types/ws": "^7.2.0", - "bignumber.js": "^9.0.0", - "https-proxy-agent": "^5.0.0", - "jsonschema": "1.2.2", - "lodash": "^4.17.4", - "ripple-address-codec": "^4.1.1", - "ripple-binary-codec": "^1.1.3", - "ripple-keypairs": "^1.0.3", - "ripple-lib-transactionparser": "0.8.2", - "ws": "^7.2.0" + "charenc": ">= 0.0.1", + "crypt": ">= 0.0.1" }, "engines": { - "node": ">=10.13.0", - "yarn": "^1.15.2" + "node": "*" } }, - "node_modules/ripple-lib-transactionparser": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/ripple-lib-transactionparser/-/ripple-lib-transactionparser-0.8.2.tgz", - "integrity": "sha512-1teosQLjYHLyOQrKUQfYyMjDR3MAq/Ga+MJuLUfpBMypl4LZB4bEoMcmG99/+WVTEiZOezJmH9iCSvm/MyxD+g==", + "node_modules/shasum-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", + "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", "dependencies": { - "bignumber.js": "^9.0.0", - "lodash": "^4.17.15" + "fast-safe-stringify": "^2.0.7" } }, - "node_modules/rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "node_modules/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, "dependencies": { - "bn.js": "^5.2.0" + "shebang-regex": "^3.0.0" }, - "bin": { - "rlp": "bin/rlp" + "engines": { + "node": ">=8" } }, - "node_modules/robust-predicates": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", - "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + "node_modules/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, + "engines": { + "node": ">=8" + } }, - "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, - "peer": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, "bin": { - "rollup": "dist/bin/rollup" + "shjs": "bin/shjs" }, "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=4" } }, - "node_modules/rollup-plugin-inject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", - "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", - "dev": true, + "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==", "dependencies": { - "estree-walker": "^0.6.1", - "magic-string": "^0.25.3", - "rollup-pluginutils": "^2.8.1" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rollup-plugin-inject/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "node_modules/rollup-plugin-node-polyfills": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", - "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", - "dev": true, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", + "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", "dependencies": { - "rollup-plugin-inject": "^3.0.0" + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, - "node_modules/rollup-plugin-polyfill-node": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-polyfill-node/-/rollup-plugin-polyfill-node-0.11.0.tgz", - "integrity": "sha512-5t+qhq4LAQKQBgbPOQJEoxxGzU5b+zLfvzpUAGy9u0MCMs8y+mrjUAv8+xrkWdxnwXQwJtjmCMnA9lCflsMzNw==", - "dev": true, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dependencies": { - "@rollup/plugin-inject": "^5.0.1" + "mimic-response": "^1.0.0" }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0" + "engines": { + "node": ">=4" } }, - "node_modules/rollup-plugin-polyfill-node/node_modules/@rollup/plugin-inject": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.3.tgz", - "integrity": "sha512-411QlbL+z2yXpRWFXSmw/teQRMkXcAAC8aYTemc15gwJRpvEVDQwoe+N/HTFD8RFG8+88Bme9DK2V9CVm7hJdA==", + "node_modules/simple-get/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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, "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "estree-walker": "^2.0.2", - "magic-string": "^0.27.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "node": ">=12" }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/rollup-plugin-polyfill-node/node_modules/@rollup/pluginutils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", - "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "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, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "node": ">= 10.13.0", + "npm": ">= 3.0.0" } }, - "node_modules/rollup-plugin-polyfill-node/node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true - }, - "node_modules/rollup-plugin-polyfill-node/node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "node_modules/socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", "dev": true, "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" }, "engines": { - "node": ">=12" + "node": ">= 6" } }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/solc": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", + "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", "dev": true, "dependencies": { - "estree-walker": "^0.6.1" + "command-exists": "^1.2.8", + "commander": "3.0.2", + "follow-redirects": "^1.12.1", + "fs-extra": "^0.30.0", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solcjs" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/rollup-pluginutils/node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "node_modules/solc/node_modules/commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", "dev": true }, - "node_modules/rpc-websockets": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.5.1.tgz", - "integrity": "sha512-kGFkeTsmd37pHPMaHIgN1LVKXMi0JD782v4Ds9ZKtLlwdTKjn+CxM9A9/gLT2LaOuEcEFGL98h1QWQtlOIdW0w==", + "node_modules/solc/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "dev": true, "dependencies": { - "@babel/runtime": "^7.17.2", - "eventemitter3": "^4.0.7", - "uuid": "^8.3.2", - "ws": "^8.5.0" - }, - "funding": { - "type": "paypal", - "url": "https://paypal.me/kozjak" - }, - "optionalDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" } }, - "node_modules/rpc-websockets/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==", - "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/solc/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/run-applescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "node_modules/solc/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">=12" + "glob": "^7.1.3" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "rimraf": "bin.js" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "node_modules/solc/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, - "engines": { - "node": ">=0.12.0" + "bin": { + "semver": "bin/semver" } }, - "node_modules/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==", + "node_modules/solidity-ast": { + "version": "0.4.49", + "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.49.tgz", + "integrity": "sha512-Pr5sCAj1SFqzwFZw1HPKSq0PehlQNdM8GwKyAVYh2DOn7/cCK8LUKD1HeHnKtTgBW7hi9h4nnnan7hpAg5RhWQ==", + "dev": true + }, + "node_modules/solidity-coverage": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", + "integrity": "sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==", "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" - } - ], + "peer": true, "dependencies": { - "queue-microtask": "^1.2.2" + "@ethersproject/abi": "^5.0.9", + "@solidity-parser/parser": "^0.14.1", + "chalk": "^2.4.2", + "death": "^1.1.0", + "detect-port": "^1.3.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.15", + "mocha": "7.1.2", + "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" + }, + "bin": { + "solidity-coverage": "plugins/bin.js" + }, + "peerDependencies": { + "hardhat": "^2.11.0" } }, - "node_modules/run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "node_modules/solidity-coverage/node_modules/ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "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" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" + "peer": true, + "engines": { + "node": ">=6" } }, - "node_modules/rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" - }, - "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==", + "node_modules/solidity-coverage/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, - "dependencies": { - "tslib": "^2.1.0" + "peer": true, + "engines": { + "node": ">=6" } }, - "node_modules/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==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-event-emitter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz", - "integrity": "sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==", - "deprecated": "Renamed to @metamask/safe-event-emitter", + "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, + "peer": true, "dependencies": { - "events": "^3.0.0" + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "node_modules/solidity-coverage/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "sprintf-js": "~1.0.2" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "node_modules/solidity-coverage/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, + "peer": true, "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/scmp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.1.0.tgz", - "integrity": "sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==" - }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, - "node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "hasInstallScript": true, + "node_modules/solidity-coverage/node_modules/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, + "peer": true, "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=4" } }, - "node_modules/semaphore": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semaphore/-/semaphore-1.1.0.tgz", - "integrity": "sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA==", + "node_modules/solidity-coverage/node_modules/chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "peer": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + }, "engines": { - "node": ">=0.8.0" + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.1" } }, - "node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "node_modules/solidity-coverage/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "peer": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "node_modules/solidity-coverage/node_modules/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, + "peer": true, "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "color-name": "1.1.3" } }, - "node_modules/semver/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==", + "node_modules/solidity-coverage/node_modules/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, + "peer": true + }, + "node_modules/solidity-coverage/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "peer": true, "dependencies": { - "yallist": "^4.0.0" - }, + "ms": "^2.1.1" + } + }, + "node_modules/solidity-coverage/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "peer": true, "engines": { - "node": ">=10" + "node": ">=0.3.1" } }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "node_modules/solidity-coverage/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true, + "peer": true }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "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, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/solidity-coverage/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "peer": true, "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "locate-path": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/solidity-coverage/node_modules/flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "peer": true, "dependencies": { - "ms": "2.0.0" + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/ms": { + "node_modules/solidity-coverage/node_modules/fsevents": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "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==", + "node_modules/solidity-coverage/node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, + "peer": true, "dependencies": { - "randombytes": "^2.1.0" + "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" + }, + "engines": { + "node": "*" } }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "node_modules/solidity-coverage/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, + "peer": true, "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 6" } }, - "node_modules/servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "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, + "peer": true, "dependencies": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" + "@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": ">=6" + "node": ">=8" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "node_modules/set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==", + "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, + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=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==" + "node_modules/solidity-coverage/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "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" + } + ], + "peer": true, + "engines": { + "node": ">=4" + } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "node_modules/solidity-coverage/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } }, - "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==", + "node_modules/solidity-coverage/node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "peer": true, "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, "bin": { - "sha.js": "bin.js" + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/shasum-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", - "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", - "dependencies": { - "fast-safe-stringify": "^2.0.7" + "node_modules/solidity-coverage/node_modules/jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "dev": true, + "peer": true, + "engines": { + "node": "*" } }, - "node_modules/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==", + "node_modules/solidity-coverage/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, + "peer": true, "dependencies": { - "shebang-regex": "^3.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/shebang-regex": { + "node_modules/solidity-coverage/node_modules/log-symbols": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, + "peer": true, + "dependencies": { + "chalk": "^2.4.2" + }, "engines": { "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/solidity-coverage/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "node_modules/solidity-coverage/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, + "peer": true, "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" + "minimist": "^1.2.5" }, "bin": { - "shjs": "bin/shjs" + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/solidity-coverage/node_modules/mocha": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", + "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" }, "engines": { - "node": ">=4" + "node": ">= 8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "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==", + "node_modules/solidity-coverage/node_modules/mocha/node_modules/supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "peer": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "has-flag": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "node_modules/solidity-coverage/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true, + "peer": true }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/solidity-coverage/node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "peer": true, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } }, - "node_modules/simple-get": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", - "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", + "node_modules/solidity-coverage/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "peer": true, "dependencies": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/simple-get/node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "node_modules/solidity-coverage/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "peer": true, "dependencies": { - "mimic-response": "^1.0.0" + "p-limit": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/simple-get/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==", + "node_modules/solidity-coverage/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "peer": true, "engines": { "node": ">=4" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "node_modules/solidity-coverage/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/solidity-coverage/node_modules/readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", "dev": true, + "peer": true, + "dependencies": { + "picomatch": "^2.0.4" + }, "engines": { - "node": ">=8" + "node": ">= 8" } }, - "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==", + "node_modules/solidity-coverage/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, + "peer": true, "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "node": ">=6" } }, - "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==", + "node_modules/solidity-coverage/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, - "engines": { - "node": ">=12" + "peer": true, + "dependencies": { + "ansi-regex": "^4.1.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=6" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "node_modules/solidity-coverage/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, + "peer": true, "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">=0.10.0" } }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "node_modules/solidity-coverage/node_modules/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, + "peer": true, "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" + "node": ">=4" } }, - "node_modules/socks-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", - "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "node_modules/solidity-coverage/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "peer": true, "dependencies": { - "agent-base": "^6.0.2", - "debug": "4", - "socks": "^2.3.3" + "isexe": "^2.0.0" }, - "engines": { - "node": ">= 6" + "bin": { + "which": "bin/which" } }, - "node_modules/socks/node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" - }, - "node_modules/solc": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", - "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", + "node_modules/solidity-coverage/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, + "peer": true, "dependencies": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "follow-redirects": "^1.12.1", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "bin": { - "solcjs": "solcjs" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=6" } }, - "node_modules/solc/node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==", - "dev": true + "node_modules/solidity-coverage/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "peer": true }, - "node_modules/solc/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "node_modules/solidity-coverage/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, + "peer": true, "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, - "node_modules/solc/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "node_modules/solidity-coverage/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "peer": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } }, - "node_modules/solc/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/solidity-coverage/node_modules/yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, + "peer": true, "dependencies": { - "glob": "^7.1.3" + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/solc/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" + "engines": { + "node": ">=6" } }, - "node_modules/solidity-ast": { - "version": "0.4.49", - "resolved": "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.49.tgz", - "integrity": "sha512-Pr5sCAj1SFqzwFZw1HPKSq0PehlQNdM8GwKyAVYh2DOn7/cCK8LUKD1HeHnKtTgBW7hi9h4nnnan7hpAg5RhWQ==", - "dev": true - }, "node_modules/solidity-docgen": { "version": "0.6.0-beta.35", "resolved": "https://registry.npmjs.org/solidity-docgen/-/solidity-docgen-0.6.0-beta.35.tgz", @@ -22076,6 +24516,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/stop-iteration-iterator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", @@ -22701,6 +25151,31 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dev": true, + "peer": true, + "dependencies": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dev": true, + "peer": true, + "dependencies": { + "get-port": "^3.1.0" + } + }, "node_modules/syntax-error": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", @@ -22951,6 +25426,36 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "dev": true, + "peer": true + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -26395,6 +28900,63 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "peer": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "peer": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", @@ -26648,6 +29210,16 @@ "node": ">=6.0" } }, + "node_modules/xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/xregexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", From ece601e283b24bf0027894b001fbaa41a6ed3b62 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Wed, 7 Jun 2023 21:49:50 -0400 Subject: [PATCH 65/78] Fill in inline docs --- contracts/ethereum/docs/index.md | 109 ++++++++------- contracts/ethereum/helpers/oracle.ts | 32 +++-- contracts/ethereum/scripts/dev.ts | 13 +- contracts/ethereum/src/v1/CasimirManager.sol | 127 ++++++------------ contracts/ethereum/src/v1/CasimirPool.sol | 67 ++++++++- contracts/ethereum/src/v1/CasimirRegistry.sol | 49 +++++-- contracts/ethereum/src/v1/CasimirUpkeep.sol | 49 +------ contracts/ethereum/src/v1/CasimirViews.sol | 8 ++ .../src/v1/interfaces/ICasimirManager.sol | 12 +- .../src/v1/interfaces/ICasimirPool.sol | 40 +++--- .../src/v1/interfaces/ICasimirRegistry.sol | 26 +++- .../src/v1/interfaces/ICasimirUpkeep.sol | 22 +-- contracts/ethereum/test/operators.ts | 4 +- services/oracle/src/index.ts | 2 +- services/oracle/src/providers/handlers.ts | 37 ++++- 15 files changed, 334 insertions(+), 263 deletions(-) diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index bc2a65f55..0c0bc0f66 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -744,10 +744,34 @@ Get the upkeep balance uint256 poolCapacity ``` +### id + +```solidity +uint32 id +``` + +### publicKey + +```solidity +bytes publicKey +``` + +### reshares + +```solidity +uint256 reshares +``` + +### status + +```solidity +enum ICasimirPool.PoolStatus status +``` + ### constructor ```solidity -constructor(address registryAddress, uint32 poolId, bytes publicKey, uint64[] operatorIds) public +constructor(address registryAddress, uint32 _id, bytes _publicKey, uint64[] _operatorIds) public ``` ### depositRewards @@ -765,31 +789,31 @@ function withdrawBalance(uint32[] blamePercents) external ### setOperatorIds ```solidity -function setOperatorIds(uint64[] operatorIds) external +function setOperatorIds(uint64[] _operatorIds) external ``` ### setReshares ```solidity -function setReshares(uint256 reshares) external +function setReshares(uint256 _reshares) external ``` ### setStatus ```solidity -function setStatus(enum ICasimirPool.PoolStatus status) external +function setStatus(enum ICasimirPool.PoolStatus _status) external ``` -### getBalance +### getDetails ```solidity -function getBalance() external view returns (uint256) +function getDetails() external view returns (struct ICasimirPool.PoolDetails) ``` -### getConfig +### getBalance ```solidity -function getConfig() external view returns (struct ICasimirPool.PoolConfig) +function getBalance() external view returns (uint256) ``` ### getOperatorIds @@ -798,18 +822,6 @@ function getConfig() external view returns (struct ICasimirPool.PoolConfig) function getOperatorIds() external view returns (uint64[]) ``` -### getPublicKey - -```solidity -function getPublicKey() external view returns (bytes) -``` - -### getStatus - -```solidity -function getStatus() external view returns (enum ICasimirPool.PoolStatus) -``` - ## CasimirRegistry ### onlyOwnerOrPool @@ -1537,11 +1549,12 @@ function getUpkeepBalance() external view returns (uint256 upkeepBalance) ## ICasimirPool -### PoolConfig +### PoolDetails ```solidity -struct PoolConfig { - uint32 poolId; +struct PoolDetails { + uint32 id; + uint256 balance; bytes publicKey; uint64[] operatorIds; uint256 reshares; @@ -1591,34 +1604,46 @@ function setReshares(uint256 reshares) external function setStatus(enum ICasimirPool.PoolStatus status) external ``` -### getBalance +### id ```solidity -function getBalance() external view returns (uint256) +function id() external view returns (uint32) ``` -### getConfig +### publicKey ```solidity -function getConfig() external view returns (struct ICasimirPool.PoolConfig) +function publicKey() external view returns (bytes) ``` -### getOperatorIds +### reshares ```solidity -function getOperatorIds() external view returns (uint64[]) +function reshares() external view returns (uint256) +``` + +### status + +```solidity +function status() external view returns (enum ICasimirPool.PoolStatus) ``` -### getPublicKey +### getDetails ```solidity -function getPublicKey() external view returns (bytes) +function getDetails() external view returns (struct ICasimirPool.PoolDetails) ``` -### getStatus +### getBalance ```solidity -function getStatus() external view returns (enum ICasimirPool.PoolStatus) +function getBalance() external view returns (uint256) +``` + +### getOperatorIds + +```solidity +function getOperatorIds() external view returns (uint64[]) ``` ## ICasimirRegistry @@ -2059,7 +2084,7 @@ Get the staked validator public keys ### getPoolDetails ```solidity -function getPoolDetails(uint32 poolId) external view returns (struct ICasimirViews.PoolDetails poolDetails) +function getPoolDetails(uint32 poolId) external view returns (struct ICasimirPool.PoolDetails poolDetails) ``` Get a pool's details by ID @@ -2074,7 +2099,7 @@ Get a pool's details by ID | Name | Type | Description | | ---- | ---- | ----------- | -| poolDetails | struct ICasimirViews.PoolDetails | The pool details | +| poolDetails | struct ICasimirPool.PoolDetails | The pool details | ### getSweptBalance @@ -2101,18 +2126,6 @@ _Should be called off-chain_ ## ICasimirViews -### PoolDetails - -```solidity -struct PoolDetails { - uint32 id; - uint256 balance; - bytes publicKey; - uint64[] operatorIds; - enum ICasimirPool.PoolStatus status; -} -``` - ### getCompoundablePoolIds ```solidity @@ -2128,7 +2141,7 @@ function getOperators(uint256 startIndex, uint256 endIndex) external view return ### getPoolDetails ```solidity -function getPoolDetails(uint32 poolId) external view returns (struct ICasimirViews.PoolDetails) +function getPoolDetails(uint32 poolId) external view returns (struct ICasimirPool.PoolDetails) ``` ### getPendingValidatorPublicKeys diff --git a/contracts/ethereum/helpers/oracle.ts b/contracts/ethereum/helpers/oracle.ts index 389c49d30..78c7b1942 100644 --- a/contracts/ethereum/helpers/oracle.ts +++ b/contracts/ethereum/helpers/oracle.ts @@ -61,16 +61,21 @@ export async function initiateDepositHandler({ manager, signer }: { manager: Cas } export async function depositUpkeepBalanceHandler({ manager, signer }: { manager: CasimirManager, signer: SignerWithAddress }) { + + /** + * In production, we check the upkeep balance before reporting + * We can set processed to true if the manager has enough SSV tokens + * Here, we're just depositing double the Chainlink registration minimum + */ const processed = false - const requiredBalancePerUpkeep = ethers.utils.parseEther('0.2') // Double the Chainlink minimum + const requiredBalance = ethers.utils.parseEther('0.2') const price = await getPrice({ provider: ethers.provider, tokenIn: wethTokenAddress, tokenOut: linkTokenAddress, uniswapFeeTier: 3000 }) - const feeAmount = ethers.utils.parseEther((Number(ethers.utils.formatEther(requiredBalancePerUpkeep)) * Number(price)).toPrecision(9)) - + const feeAmount = ethers.utils.parseEther((Number(ethers.utils.formatEther(requiredBalance)) * Number(price)).toPrecision(9)) const depositUpkeepBalance = await manager.connect(signer).depositUpkeepBalance( feeAmount, processed @@ -81,25 +86,32 @@ export async function depositUpkeepBalanceHandler({ manager, signer }: { manager export async function reportCompletedExitsHandler({ manager, views, signer, args }: { manager: CasimirManager, views: CasimirViews, signer: SignerWithAddress, args: Record }) { const { count } = args - // In production, we get the withdrawn exit order from the Beacon API (sorting by withdrawal epoch) - // Here, we're just reporting them in the order they were exited + /** + * In production, we get the completed exit order from the Beacon API (sorting by withdrawn epoch) + * We check all validators using: + * const stakedPublicKeys = await views.getStakedPublicKeys(startIndex, endIndex) + * Here, we're just grabbing the next exiting pool for each completed exit + */ + const stakedPoolIds = await manager.getStakedPoolIds() let remaining = count let poolIndex = 0 - const stakedPoolIds = await manager.getStakedPoolIds() while (remaining > 0) { const poolId = stakedPoolIds[poolIndex] const poolDetails = await views.getPoolDetails(poolId) if (poolDetails.status === 2 || poolDetails.status === 3) { remaining-- - const operatorIds = poolDetails.operatorIds.map((operatorId) => operatorId.toNumber()) - // Hardcoded blame to the first operator if less than 32 ETH - // In production, we use the SSV performance data to determine blame + /** + * In production, we use the SSV performance data to determine blame + * We check all validators using: + * const stakedPublicKeys = await views.getStakedPublicKeys(startIndex, endIndex) + * Here, we're just hardcoding blame to the first operator if less than 32 ETH + */ + const operatorIds = poolDetails.operatorIds.map((operatorId) => operatorId.toNumber()) let blamePercents = [0, 0, 0, 0] if (poolDetails.balance.lt(ethers.utils.parseEther('32'))) { blamePercents = [100, 0, 0, 0] } - const clusterDetails = await getClusterDetails({ provider: ethers.provider, ownerAddress: manager.address, diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 21d35f8dd..9a75ad4ae 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -5,6 +5,7 @@ import { round } from '@casimir/ethereum/helpers/math' import EventEmitter, { on } from 'events' import { time, setBalance } from '@nomicfoundation/hardhat-network-helpers' import ISSVNetworkViewsJson from '@casimir/ethereum/build/artifacts/scripts/resources/ssv-network/contracts/ISSVNetworkViews.sol/ISSVNetworkViews.json' +import { depositUpkeepBalanceHandler } from '../helpers/oracle' void async function () { const [, , , , fourthUser, keeper, oracle] = await ethers.getSigners() @@ -65,14 +66,12 @@ void async function () { await result.wait() } - /** Stake 320 from the fourth user */ - setTimeout(async () => { - const depositAmount = 320 * ((100 + await manager.feePercent()) / 100) - const stake = await manager.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) - await stake?.wait() - }, 1000) + const depositAmount = 320 * ((100 + await manager.feePercent()) / 100) + const stake = await manager.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) + await stake?.wait() + + await depositUpkeepBalanceHandler({ manager, signer: oracle }) - /** Simulate rewards per staked validator */ let requestId = 0 const blocksPerReward = 50 const rewardPerValidator = 0.105 diff --git a/contracts/ethereum/src/v1/CasimirManager.sol b/contracts/ethereum/src/v1/CasimirManager.sol index 50585815e..3b6bc97b0 100644 --- a/contracts/ethereum/src/v1/CasimirManager.sol +++ b/contracts/ethereum/src/v1/CasimirManager.sol @@ -161,7 +161,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } /** - * @dev Validate the caller is the manager oracle + * @dev Validate the caller is the oracle */ modifier onlyOracle() { require(msg.sender == oracleAddress, "Not oracle"); @@ -206,31 +206,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { _; } - /** - * @dev Validate a deposit - */ - modifier validDeposit() { - require(msg.value >= stakeMinimum, "Deposit less than minimum"); - _; - } - - /** - * @dev Validate a withdrawal - */ - modifier validWithdrawal(uint256 amount) { - require(amount >= stakeMinimum, "Withdrawal less than minimum"); - _; - } - - /** - * @dev Validate a distribution - * @param amount The amount to validate - */ - modifier validDistribution(uint256 amount) { - require(amount > 0, "Distribution amount is zero"); - _; - } - /** * @notice Constructor * @param _oracleAddress The manager oracle address @@ -290,18 +265,18 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** * @notice Deposit user stake */ - function depositStake() external payable nonReentrant validDeposit { + function depositStake() external payable nonReentrant { + require(msg.value >= stakeMinimum, "Stake less than minimum"); + setActionCount(msg.sender); User storage user = users[msg.sender]; uint256 depositAfterFees = subtractFees(msg.value); reservedFeeBalance += msg.value - depositAfterFees; - if (user.stake0 > 0) { user.stake0 = getUserStake(msg.sender); } user.stakeRatioSum0 = stakeRatioSum; user.stake0 += depositAfterFees; - distributeStake(depositAfterFees); emit StakeDeposited(msg.sender, depositAfterFees); @@ -337,9 +312,9 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function depositExitedBalance( uint32 poolId ) external payable onlyPool(poolId) { - delete poolAddresses[poolId]; uint256 balance = msg.value + recoveredBalances[poolId]; delete recoveredBalances[poolId]; + delete poolAddresses[poolId]; exitedBalance += balance; finalizableExitedBalance += balance; finalizableCompletedExits++; @@ -412,7 +387,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { } else { linkRegistry.addFunds(upkeepId, uint96(linkAmount)); } - if (upkeepId == 0) { revert("Upkeep not registered"); } @@ -431,6 +405,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function withdrawReservedFees(uint256 amount) external onlyOwner { require(amount <= reservedFeeBalance, "Withdrawing more than reserved"); + reservedFeeBalance -= amount; owner().send(amount); } @@ -439,7 +414,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { * @dev Distribute a given amount of stake * @param amount The amount of stake to distribute */ - function distributeStake(uint256 amount) private validDistribution(amount) { + function distributeStake(uint256 amount) private { while (amount > 0) { uint256 remainingCapacity = poolCapacity - prepoolBalance; if (remainingCapacity > amount) { @@ -470,6 +445,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uint256 activatedDeposits, uint256 completedExits ) external onlyUpkeep { + reportPeriod++; uint256 expectedActivatedBalance = activatedDeposits * poolCapacity; uint256 expectedExitedBalance = completedExits * poolCapacity; int256 rewards = int256(activeBalance + sweptBalance + finalizableRecoveredBalance) - int256(getExpectedEffectiveBalance() + expectedExitedBalance); @@ -503,17 +479,14 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { emit StakeRebalanced(loss); } - - latestActiveBalance = activeBalance; int256 sweptRewards = int256(sweptBalance + finalizableRecoveredBalance) - int256(finalizableExitedBalance); if (sweptRewards > 0) { latestActiveBalanceAfterFees -= subtractFees(uint256(sweptRewards)); } - latestActiveBalanceAfterFees += expectedActivatedBalance; latestActiveBalanceAfterFees -= finalizableExitedBalance; + latestActiveBalanceAfterFees += expectedActivatedBalance; latestActiveRewardBalance = rewards - sweptRewards; - - reportPeriod++; + latestActiveBalance = activeBalance; finalizableExitedBalance = 0; finalizableRecoveredBalance = 0; finalizableCompletedExits = 0; @@ -540,7 +513,8 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { */ function requestWithdrawal( uint256 amount - ) external nonReentrant validWithdrawal(amount) { + ) external nonReentrant { + require(amount > stakeMinimum, "Withdrawing less than minimum"); setActionCount(msg.sender); User storage user = users[msg.sender]; user.stake0 = getUserStake(msg.sender); @@ -587,17 +561,13 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function fulfillWithdrawals(uint256 count) external onlyUpkeep { while (count > 0) { count--; - if (requestedWithdrawalQueue.length == 0) { break; } - Withdrawal memory withdrawal = requestedWithdrawalQueue[0]; - if (withdrawal.period > reportPeriod) { break; } - requestedWithdrawalQueue.remove(0); requestedWithdrawalBalance -= withdrawal.amount; requestedWithdrawals--; @@ -619,7 +589,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { exitedBalance = 0; prepoolBalance -= remainder; } - sender.send(amount); emit WithdrawalFulfilled(sender, amount); @@ -673,11 +642,25 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { readyPoolIds.remove(0); pendingPoolIds.push(poolId); - poolAddresses[poolId] = deployPool( - poolId, - publicKey, - withdrawalCredentials, - operatorIds + poolAddresses[poolId] = address( + new CasimirPool( + address(registry), + poolId, + publicKey, + operatorIds + ) + ); + + bytes memory computedWithdrawalCredentials = abi.encodePacked( + bytes1(uint8(1)), + bytes11(0), + poolAddresses[poolId] + ); + + require( + keccak256(computedWithdrawalCredentials) == + keccak256(withdrawalCredentials), + "Invalid withdrawal credentials" ); registerPool( @@ -696,31 +679,6 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { emit DepositInitiated(poolId); } - function deployPool( - uint32 poolId, - bytes memory publicKey, - bytes memory withdrawalCredentials, - uint64[] memory operatorIds - ) private returns (address poolAddress) { - ICasimirPool pool = new CasimirPool( - address(registry), - poolId, - publicKey, - operatorIds - ); - poolAddress = address(pool); - bytes memory computedWithdrawalCredentials = abi.encodePacked( - bytes1(uint8(1)), - bytes11(0), - poolAddress - ); - require( - keccak256(computedWithdrawalCredentials) == - keccak256(withdrawalCredentials), - "Invalid withdrawal credentials" - ); - } - function registerPool( uint32 poolId, bytes32 depositDataRoot, @@ -750,6 +708,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { processed ); ssvToken.approve(address(ssvNetwork), ssvAmount); + ssvNetwork.registerValidator( publicKey, operatorIds, @@ -862,28 +821,26 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { ) external onlyOracle { uint32 poolId = stakedPoolIds[poolIndex]; ICasimirPool pool = ICasimirPool(poolAddresses[poolId]); - ICasimirPool.PoolStatus poolStatus = pool.status(); + ICasimirPool.PoolDetails memory poolDetails = pool.getDetails(); require( - poolStatus == ICasimirPool.PoolStatus.EXITING_FORCED || - poolStatus == ICasimirPool.PoolStatus.EXITING_REQUESTED, + poolDetails.status == ICasimirPool.PoolStatus.EXITING_FORCED || + poolDetails.status == ICasimirPool.PoolStatus.EXITING_REQUESTED, "Pool not exiting" ); stakedPoolIds.remove(poolIndex); - uint64[] memory operatorIds = pool.getOperatorIds(); - bytes memory publicKey = pool.publicKey(); - if (poolStatus == ICasimirPool.PoolStatus.EXITING_REQUESTED) { + if (poolDetails.status == ICasimirPool.PoolStatus.EXITING_REQUESTED) { requestedExits--; } else if ( - poolStatus == ICasimirPool.PoolStatus.EXITING_FORCED + poolDetails.status == ICasimirPool.PoolStatus.EXITING_FORCED ) { forcedExits--; } pool.setStatus(ICasimirPool.PoolStatus.WITHDRAWN); pool.withdrawBalance(blamePercents); - ssvNetwork.removeValidator(publicKey, operatorIds, cluster); + ssvNetwork.removeValidator(poolDetails.publicKey, poolDetails.operatorIds, cluster); emit ExitCompleted(poolId); } @@ -1005,8 +962,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { uniswapFeeTier ) ); - uint256 liquidity = swapPool.liquidity(); - require(liquidity >= amount, "Not enough liquidity"); + require(swapPool.liquidity() >= amount, "Not enough liquidity"); ISwapRouter.ExactInputSingleParams memory params = ISwapRouter .ExactInputSingleParams({ @@ -1150,11 +1106,10 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { function getPendingWithdrawalEligibility( uint256 index, uint256 period - ) public view returns (bool) { + ) public view returns (bool pendingWithdrawalEligibility) { if (requestedWithdrawals > index) { - return requestedWithdrawalQueue[index].period <= period; + pendingWithdrawalEligibility = requestedWithdrawalQueue[index].period <= period; } - return false; } /** diff --git a/contracts/ethereum/src/v1/CasimirPool.sol b/contracts/ethereum/src/v1/CasimirPool.sol index c203bb75a..79b760e18 100644 --- a/contracts/ethereum/src/v1/CasimirPool.sol +++ b/contracts/ethereum/src/v1/CasimirPool.sol @@ -15,17 +15,44 @@ import "hardhat/console.sol"; * @title Pool contract that accepts deposits and stakes a validator */ contract CasimirPool is ICasimirPool, Ownable, ReentrancyGuard { + /*************/ + /* Constants */ + /*************/ + /** Pool capacity */ uint256 poolCapacity = 32 ether; + + /*************/ + /* Immutable */ + /*************/ + + /** Manager contract */ ICasimirManager private immutable manager; + /** Registry contract */ ICasimirRegistry private immutable registry; - uint32 public immutable id; + + /*********/ + /* State */ + /*********/ + + /** Pool ID */ + uint32 public id; + /** Validator public key */ bytes public publicKey; + /** Operator IDs */ uint64[] private operatorIds; + /** Reshares */ uint256 public reshares; + /** Status */ PoolStatus public status; - + /** + * @notice Constructor + * @param registryAddress The registry address + * @param _id The pool ID + * @param _publicKey The validator public key + * @param _operatorIds The operator IDs + */ constructor( address registryAddress, uint32 _id, @@ -39,11 +66,18 @@ contract CasimirPool is ICasimirPool, Ownable, ReentrancyGuard { operatorIds = _operatorIds; } + /** + * @notice Deposit rewards from a pool to the manager + */ function depositRewards() external onlyOwner { uint256 balance = address(this).balance; manager.depositRewards{value: balance}(); } + /** + * @notice Withdraw balance from a pool to the manager + * @param blamePercents The operator loss blame percents + */ function withdrawBalance(uint32[] memory blamePercents) external onlyOwner { require(status == PoolStatus.WITHDRAWN, "Pool must be withdrawn"); @@ -60,24 +94,39 @@ contract CasimirPool is ICasimirPool, Ownable, ReentrancyGuard { } registry.removeOperatorPool(operatorIds[i], id, blameAmount); } - manager.depositExitedBalance{value: balance}(id); } + /** + * @notice Set the operator IDs + * @param _operatorIds The operator IDs + */ function setOperatorIds(uint64[] memory _operatorIds) external onlyOwner { operatorIds = _operatorIds; } + /** + * @notice Set the reshare count + * @param _reshares The reshare count + */ function setReshares(uint256 _reshares) external onlyOwner { reshares = _reshares; } + /** + * @notice Set the pool status + * @param _status The pool status + */ function setStatus(PoolStatus _status) external onlyOwner { status = _status; } - function getDetails() external view returns (PoolDetails memory) { - return PoolDetails({ + /** + * @notice Get the pool details + * @return poolDetails The pool details + */ + function getDetails() external view returns (PoolDetails memory poolDetails) { + poolDetails = PoolDetails({ id: id, balance: address(this).balance, publicKey: publicKey, @@ -87,10 +136,18 @@ contract CasimirPool is ICasimirPool, Ownable, ReentrancyGuard { }); } + /** + * @notice Get the pool balance + * @return balance The pool balance + */ function getBalance() external view returns (uint256) { return address(this).balance; } + /** + * @notice Get the operator IDs + * @return operatorIds The operator IDs + */ function getOperatorIds() external view returns (uint64[] memory) { return operatorIds; } diff --git a/contracts/ethereum/src/v1/CasimirRegistry.sol b/contracts/ethereum/src/v1/CasimirRegistry.sol index 97bf92ab7..39019f7a7 100644 --- a/contracts/ethereum/src/v1/CasimirRegistry.sol +++ b/contracts/ethereum/src/v1/CasimirRegistry.sol @@ -10,16 +10,45 @@ import "@openzeppelin/contracts/access/Ownable.sol"; // Dev-only imports import "hardhat/console.sol"; +/** + * @title Registry contract that manages operators + */ contract CasimirRegistry is ICasimirRegistry, Ownable { + /*************/ + /* Libraries */ + /*************/ + + /** Use internal type for address */ using TypesAddress for address; - ICasimirManager private manager; - ISSVNetworkViews private ssvNetworkViews; + /*************/ + /* Constants */ + /*************/ + + /** Required collateral */ uint256 private requiredCollateral = 4 ether; - uint256 private minimumCollateralDeposit = 100000000000000000; + /** Minimum collateral deposit (0.1 ETH) */ + uint256 private minimumCollateralDeposit = 100000000 gwei; + + /*************/ + /* Immutable */ + /*************/ + + /** Manager contract */ + ICasimirManager private immutable manager; + /** SSV network views contract */ + ISSVNetworkViews private immutable ssvNetworkViews; + + /*********/ + /* State */ + /*********/ + + /** Operator IDs */ + uint64[] private operatorIds; + /** Operators */ mapping(uint64 => Operator) private operators; + /** Operator pools */ mapping(uint64 => mapping (uint32 => bool)) private operatorPools; - uint64[] private operatorIds; /*************/ /* Modifiers */ @@ -37,6 +66,10 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { _; } + /** + * @notice Constructor + * @param ssvNetworkViewsAddress The SSV network views address + */ constructor(address ssvNetworkViewsAddress) { manager = ICasimirManager(msg.sender); ssvNetworkViews = ISSVNetworkViews(ssvNetworkViewsAddress); @@ -51,9 +84,7 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { msg.value >= requiredCollateral, "Insufficient registration collateral" ); - (address operatorOwner, , , , ) = ssvNetworkViews.getOperatorById( - operatorId - ); + (address operatorOwner, , , , ) = ssvNetworkViews.getOperatorById(operatorId); require( msg.sender == operatorOwner, "Only operator owner can register" @@ -94,11 +125,11 @@ contract CasimirRegistry is ICasimirRegistry, Ownable { } /** - * @notice Withdraw collateral from an operator + * @notice Request to withdraw collateral from an operator * @param operatorId The operator ID * @param amount The amount to withdraw */ - function withdrawCollateral(uint64 operatorId, uint256 amount) external { + function requestWithdrawal(uint64 operatorId, uint256 amount) external { Operator storage operator = operators[operatorId]; (address operatorOwner, , , , ) = ssvNetworkViews.getOperatorById(operatorId); require( diff --git a/contracts/ethereum/src/v1/CasimirUpkeep.sol b/contracts/ethereum/src/v1/CasimirUpkeep.sol index 9202c69b3..96ba397aa 100644 --- a/contracts/ethereum/src/v1/CasimirUpkeep.sol +++ b/contracts/ethereum/src/v1/CasimirUpkeep.sol @@ -11,13 +11,14 @@ import "@openzeppelin/contracts/access/Ownable.sol"; import "hardhat/console.sol"; /** - * @title Oracle contract that triggers and handles actions + * @title Upkeep contract that automates and handles reports */ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /*************/ /* Libraries */ /*************/ + /** Use Chainlink Functions */ using Functions for Functions.Request; /*************/ @@ -36,9 +37,9 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { /** Manager contract */ ICasimirManager private immutable manager; - /********************/ - /* Dynamic State */ - /********************/ + /*********/ + /* State */ + /*********/ /** Current report status */ ReportStatus private reportStatus; @@ -164,11 +165,9 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { if (reportStatus == ReportStatus.FINALIZED) { reportStatus = ReportStatus.REQUESTING; - reportRequestBlock = block.number; reportTimestamp = block.timestamp; reportPeriod = manager.reportPeriod(); - Functions.Request memory req; reportRemainingRequests = 2; for (uint256 i = 0; i < reportRemainingRequests; i++) { @@ -183,25 +182,20 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { ) { manager.fulfillWithdrawals(5); } - if (finalizableActivatedDeposits > 0) { uint256 maxActivatedDeposits = finalizableActivatedDeposits > 5 ? 5 : finalizableActivatedDeposits; finalizableActivatedDeposits -= maxActivatedDeposits; manager.activateDeposits(maxActivatedDeposits); } - if (!manager.getPendingWithdrawalEligibility(0, reportPeriod) && finalizableActivatedDeposits == 0) { reportStatus = ReportStatus.FINALIZED; - manager.rebalanceStake({ activeBalance: reportActiveBalance, sweptBalance: reportSweptBalance, activatedDeposits: reportActivatedDeposits, completedExits: reportCompletedExits }); - manager.compoundRewards(reportCompoundablePoolIds); - reportActiveBalance = 0; reportActivatedDeposits = 0; reportForcedExits = 0; @@ -228,19 +222,15 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { RequestType requestType = reportRequests[requestId]; require(requestType != RequestType.NONE, "Invalid request ID"); - reportResponseError = _error; // TODO: Handle error - + reportResponseError = _error; if (_error.length == 0) { - delete reportRequests[requestId]; reportRemainingRequests--; - if (requestType == RequestType.BALANCES) { ( uint128 activeBalance, uint128 sweptBalance ) = abi.decode(response, (uint128, uint128)); - reportActiveBalance = uint256(activeBalance); reportSweptBalance = uint256(sweptBalance); } else { @@ -250,28 +240,22 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { uint32 completedExits, uint32[5] memory compoundablePools ) = abi.decode(response, (uint32, uint32, uint32, uint32[5])); - reportActivatedDeposits = activatedDeposits; reportForcedExits = unexpectedExits; reportCompletedExits = completedExits; reportCompoundablePoolIds = compoundablePools; - finalizableActivatedDeposits = activatedDeposits; finalizableCompoundablePoolIds = compoundablePools; } - if (reportRemainingRequests == 0) { reportStatus = ReportStatus.PROCESSING; - if (reportForcedExits > 0) { manager.requestForcedExitReports(reportForcedExits); } - if (reportCompletedExits > 0) { manager.requestCompletedExitReports(reportCompletedExits); } } - } emit OCRResponse(requestId, response, _error); @@ -287,27 +271,6 @@ contract CasimirUpkeep is ICasimirUpkeep, FunctionsClient, Ownable { // Dev-only functions - /** - * @notice Encode the response for testing - * @param activeBalance Active balance - * @param activatedDeposits Count of new deposits - * @param completedExits Count of new exits - * @param slashedExits Count of new slashedExits - */ - function encodeResponse( - uint128 activeBalance, - uint32 activatedDeposits, - uint32 completedExits, - uint32 slashedExits - ) external pure returns (bytes memory) { - return abi.encode( - activeBalance, - activatedDeposits, - completedExits, - slashedExits - ); - } - /** * @notice Fulfill the request for testing * @param requestId The request ID, returned by sendRequest() diff --git a/contracts/ethereum/src/v1/CasimirViews.sol b/contracts/ethereum/src/v1/CasimirViews.sol index b7e9d25b8..b8a5dccaa 100644 --- a/contracts/ethereum/src/v1/CasimirViews.sol +++ b/contracts/ethereum/src/v1/CasimirViews.sol @@ -8,6 +8,9 @@ import './interfaces/ICasimirRegistry.sol'; // Dev-only imports import "hardhat/console.sol"; +/** + * @title Views contract that provides read-only access to the state + */ contract CasimirViews is ICasimirViews { /*************/ /* Constants */ @@ -25,6 +28,11 @@ contract CasimirViews is ICasimirViews { /** Registry contract */ ICasimirRegistry private immutable registry; + /** + * @notice Constructor + * @param managerAddress The manager address + * @param registryAddress The registry address + */ constructor(address managerAddress, address registryAddress) { manager = ICasimirManager(managerAddress); registry = ICasimirRegistry(registryAddress); diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol index 4dbf0a122..d79893c58 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol @@ -25,7 +25,6 @@ interface ICasimirManager { uint256 actionPeriodTimestamp; uint256 actionCount; } - struct Withdrawal { address user; uint256 amount; @@ -119,9 +118,9 @@ interface ICasimirManager { function withdrawSSVBalance(uint256 amount) external; function setFunctionsAddress(address functionsAddress) external; - /*************/ - /* Variables */ - /*************/ + /***********/ + /* Getters */ + /***********/ function upkeepId() external view returns (uint256); function latestActiveBalance() external view returns (uint256); @@ -129,11 +128,6 @@ interface ICasimirManager { function requestedWithdrawalBalance() external view returns (uint256); function finalizableCompletedExits() external view returns (uint256); function reportPeriod() external view returns (uint32); - - /***********/ - /* Getters */ - /***********/ - function getTotalStake() external view returns (uint256); function getReadyPoolIds() external view returns (uint32[] memory); function getPendingPoolIds() external view returns (uint32[] memory); diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirPool.sol b/contracts/ethereum/src/v1/interfaces/ICasimirPool.sol index 8e7fa1469..cda8de1e6 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirPool.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirPool.sol @@ -2,6 +2,18 @@ pragma solidity 0.8.18; interface ICasimirPool { + /***************/ + /* Enumerators */ + /***************/ + + enum PoolStatus { + PENDING, + ACTIVE, + EXITING_FORCED, + EXITING_REQUESTED, + WITHDRAWN + } + /***********/ /* Structs */ /***********/ @@ -15,47 +27,25 @@ interface ICasimirPool { ICasimirPool.PoolStatus status; } - enum PoolStatus { - PENDING, - ACTIVE, - EXITING_FORCED, - EXITING_REQUESTED, - WITHDRAWN - } - /*************/ /* Mutations */ /*************/ function depositRewards() external; - function withdrawBalance(uint32[] memory blamePercents) external; - function setOperatorIds(uint64[] memory operatorIds) external; - function setReshares(uint256 reshares) external; - function setStatus(PoolStatus status) external; - /*************/ - /* Variables */ - /*************/ + /***********/ + /* Getters */ + /***********/ function id() external view returns (uint32); - function publicKey() external view returns (bytes memory); - function reshares() external view returns (uint256); - function status() external view returns (PoolStatus); - - /***********/ - /* Getters */ - /***********/ - function getDetails() external view returns (PoolDetails memory); - function getBalance() external view returns (uint256); - function getOperatorIds() external view returns (uint64[] memory); } \ No newline at end of file diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirRegistry.sol b/contracts/ethereum/src/v1/interfaces/ICasimirRegistry.sol index bed519ed2..43458069c 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirRegistry.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirRegistry.sol @@ -4,9 +4,10 @@ pragma solidity 0.8.18; import './ICasimirManager.sol'; interface ICasimirRegistry { - event OperatorRegistered(uint64 operatorId); - event DeregistrationRequested(uint64 operatorId); - event DeregistrationCompleted(uint64 operatorId); + + /***********/ + /* Structs */ + /***********/ struct Operator { uint64 id; @@ -16,12 +17,29 @@ interface ICasimirRegistry { uint256 poolCount; } + /**********/ + /* Events */ + /**********/ + + event OperatorRegistered(uint64 operatorId); + event DeregistrationRequested(uint64 operatorId); + event DeregistrationCompleted(uint64 operatorId); + + /*************/ + /* Mutations */ + /*************/ + function registerOperator(uint64 operatorId) external payable; function depositCollateral(uint64 operatorId) external payable; - function withdrawCollateral(uint64 operatorId, uint256 amount) external; + function requestWithdrawal(uint64 operatorId, uint256 amount) external; function requestDeregistration(uint64 operatorId) external; function addOperatorPool(uint64 operatorId, uint32 poolId) external; function removeOperatorPool(uint64 operatorId, uint32 poolId, uint256 blameAmount) external; + + /***********/ + /* Getters */ + /***********/ + function getOperator(uint64 operatorId) external view returns (Operator memory); function getOperatorIds() external view returns (uint64[] memory); } \ No newline at end of file diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirUpkeep.sol b/contracts/ethereum/src/v1/interfaces/ICasimirUpkeep.sol index 507363229..91b9ea713 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirUpkeep.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirUpkeep.sol @@ -8,14 +8,11 @@ interface ICasimirUpkeep is AutomationCompatibleInterface { /* Enumerators */ /***************/ - /** Request type */ enum RequestType { NONE, BALANCES, DETAILS } - - /** Report status */ enum ReportStatus { FINALIZED, REQUESTING, @@ -30,20 +27,25 @@ interface ICasimirUpkeep is AutomationCompatibleInterface { event UpkeepPerformed(ReportStatus status); /*************/ - /* Functions */ + /* Mutations */ /*************/ - function checkUpkeep( - bytes calldata checkData - ) external returns (bool upkeepNeeded, bytes memory performData); - function performUpkeep(bytes calldata performData) external; - function setOracleAddress(address oracleAddress) external; - function mockFulfillRequest( bytes32 requestId, bytes memory result, bytes memory err ) external; + + /***********/ + /* Getters */ + /***********/ + + function checkUpkeep( + bytes calldata checkData + ) external returns (bool upkeepNeeded, bytes memory performData); + + + } diff --git a/contracts/ethereum/test/operators.ts b/contracts/ethereum/test/operators.ts index 854be236e..50f784a03 100644 --- a/contracts/ethereum/test/operators.ts +++ b/contracts/ethereum/test/operators.ts @@ -94,8 +94,8 @@ describe('Operators', async function () { expect(resharesRequestedEvents.length).equal(0) const operatorOwnerBalanceBefore = await ethers.provider.getBalance(operatorOwnerAddress) - const withdrawCollateral = await registry.connect(operatorOwnerSigner).withdrawCollateral(deregisteringOperatorId, ethers.utils.parseEther('4')) - await withdrawCollateral.wait() + const requestWithdrawal = await registry.connect(operatorOwnerSigner).requestWithdrawal(deregisteringOperatorId, ethers.utils.parseEther('4')) + await requestWithdrawal.wait() const operatorOwnerBalanceAfter = await ethers.provider.getBalance(operatorOwnerAddress) const deregisteredOperator = await registry.getOperator(deregisteringOperatorId) diff --git a/services/oracle/src/index.ts b/services/oracle/src/index.ts index 5ecf5c9e5..f47906376 100644 --- a/services/oracle/src/index.ts +++ b/services/oracle/src/index.ts @@ -11,7 +11,7 @@ const handlers = { DepositRequested: initiateDepositHandler, ReshareRequested: initiatePoolReshareHandler, ExitRequested: initiatePoolExitHandler, - // ForcedExitReportsRequested: reportForcedExitssHandler, + ForcedExitReportsRequested: reportForcedExitsHandler, CompletedExitReportsRequested: reportCompletedExitsHandler } diff --git a/services/oracle/src/providers/handlers.ts b/services/oracle/src/providers/handlers.ts index 9f818220a..ddb428142 100644 --- a/services/oracle/src/providers/handlers.ts +++ b/services/oracle/src/providers/handlers.ts @@ -114,9 +114,34 @@ export async function initiatePoolExitHandler(input: HandlerInput) { const poolDetails = await views.getPoolDetails(poolId) // Get operators to sign exit const dkg = new DKG({ cliPath, messengerUrl }) +} + +export async function reportForcedExitsHandler(input: HandlerInput) { + const { + provider, + signer, + manager, + views, + args + } = input - // Broadcast exit signature + const { count } = args + const stakedPoolIds = await manager.getStakedPoolIds() + let poolIndex = 0 + let remaining = count + while (remaining > 0) { + const poolId = stakedPoolIds[poolIndex] + const poolDetails = await views.getPoolDetails(poolId) + if (poolDetails.status === 1) { + remaining-- + const reportForcedExit = await manager.connect(signer).reportForcedExit( + poolIndex + ) + await reportForcedExit.wait() + } + poolIndex++ + } } export async function reportCompletedExitsHandler(input: HandlerInput) { @@ -130,11 +155,15 @@ export async function reportCompletedExitsHandler(input: HandlerInput) { const { count } = args - // In production, we get the withdrawn exit order from the Beacon API (sorting by withdrawal epoch) - // Here, we're just reporting them in the order they were exited + /** + * In production, we get the completed exit order from the Beacon API (sorting by withdrawn epoch) + * We check all validators using: + * const stakedPublicKeys = await views.getStakedPublicKeys(startIndex, endIndex) + * Here, we're just grabbing a random active pool for each forced exit + */ + const stakedPoolIds = await manager.getStakedPoolIds() let remaining = count let poolIndex = 0 - const stakedPoolIds = await manager.getStakedPoolIds() while (remaining > 0) { const poolId = stakedPoolIds[poolIndex] const poolDetails = await views.getPoolDetails(poolId) From 04132ae94e10ee8b562d347aef13cea5a2b03115 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Thu, 8 Jun 2023 00:19:20 -0400 Subject: [PATCH 66/78] Update readme overview --- contracts/ethereum/README.md | 19 +- contracts/ethereum/docs/index.md | 263 +++++++++++------- contracts/ethereum/scripts/dev.ts | 139 ++++----- contracts/ethereum/src/v1/CasimirManager.sol | 2 +- .../src/v1/interfaces/ICasimirManager.sol | 1 + contracts/ethereum/test/fixtures/shared.ts | 145 +++------- scripts/ethereum/dev.ts | 40 ++- scripts/ethereum/test.ts | 7 - services/oracle/src/index.ts | 3 +- 9 files changed, 302 insertions(+), 317 deletions(-) diff --git a/contracts/ethereum/README.md b/contracts/ethereum/README.md index a97b7741d..f9f38e9ac 100644 --- a/contracts/ethereum/README.md +++ b/contracts/ethereum/README.md @@ -3,17 +3,18 @@ Solidity contracts for decentralized staking on Ethereum ## 📝 Overview -Current Ethereum staking implementations either require a user to have 32 Ethereum or utilize a centralized 3rd party implementation that introduces additional counterparty risk to their staked assets. We propose a methodology to decentralize the Ethereum staking process that will not only improve Ethereum staking decentralization but improve the staking User Experience and create a more equitable staking experience for smaller stakers. -The Casimir contracts seamlessly connect stakers with any amount of ETH directly to high-performing Ethereum validators. Casimir proposes an approach that minimizes counterparty risk for users and improves decentralization in Ethereum staking: +Currlently stakers either need to solo-stake (and have least 32 Ether), or they need to pool their assets in a liquid staking protocol (LSD). While the former choice is a secure choice for Ether holders, the latter, LSDs, are more or less designed for Ether traders with higher risk-tolerance. Today's LSDs present an inherent counterparty risk to the user, and they rely on centralized control of staking node operators (see [The Risks of LSD](https://notes.ethereum.org/@djrtwo/risks-of-lsd)). -- Validators duties are performed by registered (collateralized) operators running distributed validator technology (DVT) (Initially we are using SSV as a first implementation) -- Keys are trustlessly managed using distributed key generation (DKG) (current implementation uses RockX's) -- Automated actions (like compounding stake or handling a slash) are carried out by a decentralized oracle network (DON) (current implementation uses Chainlink) +Casimir is designed to offer users the experience and security of solo-staking while pooling their assets. The Casimir contracts seamlessly connect stakers with any amount of Ether to a permissionless registry of high-performing node operators. Casimir aims to minimize counterparty risk for users and improve decentralization in Ethereum staking: + +- Validators duties are performed by registered (collateralized) operators running distributed validator technology (DVT) +- Keys are created and reshared using distributed key generation (DKG) +- Automated balance and status reports are carried out by a decentralized oracle network (DON) ### Architecture -Casimir distributes user deposits to Ethereum validators operated by SSV. Validator keys are shared with zero-coordination distributed key generation. Chainlink nodes report from the Beacon chain and SSV to sync rewards, manage slashing, and automate validator creation and exiting. +Casimir distributes user deposits to Ethereum validators operated by SSV. Validator keys are shared with zero-coordination distributed key generation. Chainlink nodes report from the Beacon chain and SSV to sync balances and rewards, manage collateral recovery, and automate validator creation and exits. ```mermaid graph LR @@ -22,7 +23,7 @@ graph LR B(Manager Contract) C(Beacon Deposit Contract) D(SSV Contract) - G(PoR Contract) + G(Oracle Contract) H(Functions Contract) I(Automation Contract) end @@ -46,7 +47,7 @@ graph LR E2 --> F21(SSV Operator 5) E2 --> F22(SSV Operator 6) E2 --> F23(SSV Operator 7) - E2 --> F24(SSV Operator 8) + E2 --> F24(SSV Operator n) end G <--> I @@ -57,7 +58,7 @@ graph LR J1(Chainlink Node 1) J2(Chainlink Node 2) J3(Chainlink Node 3) - J4(Chainlink Node 4) + J4(Chainlink Node n) end J1 --> G diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 0c0bc0f66..7015b625f 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -72,7 +72,7 @@ _Validate the caller is the authorized pool_ modifier onlyOracle() ``` -_Validate the caller is the manager oracle_ +_Validate the caller is the oracle_ ### onlyOracleOrRegistry @@ -106,36 +106,6 @@ modifier onlyUpkeep() _Validate the caller is the upkeep contract_ -### validDeposit - -```solidity -modifier validDeposit() -``` - -_Validate a deposit_ - -### validWithdrawal - -```solidity -modifier validWithdrawal(uint256 amount) -``` - -_Validate a withdrawal_ - -### validDistribution - -```solidity -modifier validDistribution(uint256 amount) -``` - -_Validate a distribution_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| amount | uint256 | The amount to validate | - ### constructor ```solidity @@ -614,7 +584,7 @@ Get the expected effective balance ### getPendingWithdrawalEligibility ```solidity -function getPendingWithdrawalEligibility(uint256 index, uint256 period) public view returns (bool) +function getPendingWithdrawalEligibility(uint256 index, uint256 period) public view returns (bool pendingWithdrawalEligibility) ``` Get the eligibility of a pending withdrawal @@ -630,7 +600,7 @@ Get the eligibility of a pending withdrawal | Name | Type | Description | | ---- | ---- | ----------- | -| [0] | bool | pendingWithdrawalEligibility The eligibility of a pending withdrawal | +| pendingWithdrawalEligibility | bool | The eligibility of a pending withdrawal | ### getReadyPoolIds @@ -744,84 +714,163 @@ Get the upkeep balance uint256 poolCapacity ``` +Pool capacity + ### id ```solidity uint32 id ``` +Pool ID + ### publicKey ```solidity bytes publicKey ``` +Validator public key + ### reshares ```solidity uint256 reshares ``` +Reshares + ### status ```solidity enum ICasimirPool.PoolStatus status ``` +Status + ### constructor ```solidity constructor(address registryAddress, uint32 _id, bytes _publicKey, uint64[] _operatorIds) public ``` +Constructor + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| registryAddress | address | The registry address | +| _id | uint32 | The pool ID | +| _publicKey | bytes | The validator public key | +| _operatorIds | uint64[] | The operator IDs | + ### depositRewards ```solidity function depositRewards() external ``` +Deposit rewards from a pool to the manager + ### withdrawBalance ```solidity function withdrawBalance(uint32[] blamePercents) external ``` +Withdraw balance from a pool to the manager + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| blamePercents | uint32[] | The operator loss blame percents | + ### setOperatorIds ```solidity function setOperatorIds(uint64[] _operatorIds) external ``` +Set the operator IDs + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| _operatorIds | uint64[] | The operator IDs | + ### setReshares ```solidity function setReshares(uint256 _reshares) external ``` +Set the reshare count + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| _reshares | uint256 | The reshare count | + ### setStatus ```solidity function setStatus(enum ICasimirPool.PoolStatus _status) external ``` +Set the pool status + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| _status | enum ICasimirPool.PoolStatus | The pool status | + ### getDetails ```solidity -function getDetails() external view returns (struct ICasimirPool.PoolDetails) +function getDetails() external view returns (struct ICasimirPool.PoolDetails poolDetails) ``` +Get the pool details + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolDetails | struct ICasimirPool.PoolDetails | The pool details | + ### getBalance ```solidity function getBalance() external view returns (uint256) ``` +Get the pool balance + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint256 | balance The pool balance | + ### getOperatorIds ```solidity function getOperatorIds() external view returns (uint64[]) ``` +Get the operator IDs + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | uint64[] | operatorIds The operator IDs | + ## CasimirRegistry ### onlyOwnerOrPool @@ -838,6 +887,14 @@ _Validate the caller is owner or the authorized pool_ constructor(address ssvNetworkViewsAddress) public ``` +Constructor + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| ssvNetworkViewsAddress | address | The SSV network views address | + ### registerOperator ```solidity @@ -866,13 +923,13 @@ Deposit collateral for an operator | ---- | ---- | ----------- | | operatorId | uint64 | The operator ID | -### withdrawCollateral +### requestWithdrawal ```solidity -function withdrawCollateral(uint64 operatorId, uint256 amount) external +function requestWithdrawal(uint64 operatorId, uint256 amount) external ``` -Withdraw collateral from an operator +Request to withdraw collateral from an operator #### Parameters @@ -1133,23 +1190,6 @@ Update the functions oracle address | ---- | ---- | ----------- | | newOracleAddress | address | New oracle address | -### encodeResponse - -```solidity -function encodeResponse(uint128 activeBalance, uint32 activatedDeposits, uint32 completedExits, uint32 slashedExits) external pure returns (bytes) -``` - -Encode the response for testing - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| activeBalance | uint128 | Active balance | -| activatedDeposits | uint32 | Count of new deposits | -| completedExits | uint32 | Count of new exits | -| slashedExits | uint32 | Count of new slashedExits | - ### mockFulfillRequest ```solidity @@ -1549,6 +1589,18 @@ function getUpkeepBalance() external view returns (uint256 upkeepBalance) ## ICasimirPool +### PoolStatus + +```solidity +enum PoolStatus { + PENDING, + ACTIVE, + EXITING_FORCED, + EXITING_REQUESTED, + WITHDRAWN +} +``` + ### PoolDetails ```solidity @@ -1562,18 +1614,6 @@ struct PoolDetails { } ``` -### PoolStatus - -```solidity -enum PoolStatus { - PENDING, - ACTIVE, - EXITING_FORCED, - EXITING_REQUESTED, - WITHDRAWN -} -``` - ### depositRewards ```solidity @@ -1648,6 +1688,18 @@ function getOperatorIds() external view returns (uint64[]) ## ICasimirRegistry +### Operator + +```solidity +struct Operator { + uint64 id; + bool active; + bool resharing; + int256 collateral; + uint256 poolCount; +} +``` + ### OperatorRegistered ```solidity @@ -1666,18 +1718,6 @@ event DeregistrationRequested(uint64 operatorId) event DeregistrationCompleted(uint64 operatorId) ``` -### Operator - -```solidity -struct Operator { - uint64 id; - bool active; - bool resharing; - int256 collateral; - uint256 poolCount; -} -``` - ### registerOperator ```solidity @@ -1690,10 +1730,10 @@ function registerOperator(uint64 operatorId) external payable function depositCollateral(uint64 operatorId) external payable ``` -### withdrawCollateral +### requestWithdrawal ```solidity -function withdrawCollateral(uint64 operatorId, uint256 amount) external +function requestWithdrawal(uint64 operatorId, uint256 amount) external ``` ### requestDeregistration @@ -1760,33 +1800,6 @@ event OCRResponse(bytes32 requestId, bytes result, bytes err) event UpkeepPerformed(enum ICasimirUpkeep.ReportStatus status) ``` -### checkUpkeep - -```solidity -function checkUpkeep(bytes checkData) external returns (bool upkeepNeeded, bytes performData) -``` - -method that is simulated by the keepers to see if any work actually -needs to be performed. This method does does not actually need to be -executable, and since it is only ever simulated it can consume lots of gas. - -_To ensure that it is never called, you may want to add the -cannotExecute modifier from KeeperBase to your implementation of this -method._ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| checkData | bytes | specified in the upkeep registration so it is always the same for a registered upkeep. This can easily be broken down into specific arguments using `abi.decode`, so multiple upkeeps can be registered on the same contract and easily differentiated by the contract. | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| upkeepNeeded | bool | boolean to indicate whether the keeper should call performUpkeep or not. | -| performData | bytes | bytes that the keeper should call performUpkeep with, if upkeep is needed. If you would like to encode data to decode later, try `abi.encode`. | - ### performUpkeep ```solidity @@ -1823,6 +1836,33 @@ function setOracleAddress(address oracleAddress) external function mockFulfillRequest(bytes32 requestId, bytes result, bytes err) external ``` +### checkUpkeep + +```solidity +function checkUpkeep(bytes checkData) external returns (bool upkeepNeeded, bytes performData) +``` + +method that is simulated by the keepers to see if any work actually +needs to be performed. This method does does not actually need to be +executable, and since it is only ever simulated it can consume lots of gas. + +_To ensure that it is never called, you may want to add the +cannotExecute modifier from KeeperBase to your implementation of this +method._ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| checkData | bytes | specified in the upkeep registration so it is always the same for a registered upkeep. This can easily be broken down into specific arguments using `abi.decode`, so multiple upkeeps can be registered on the same contract and easily differentiated by the contract. | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| upkeepNeeded | bool | boolean to indicate whether the keeper should call performUpkeep or not. | +| performData | bytes | bytes that the keeper should call performUpkeep with, if upkeep is needed. If you would like to encode data to decode later, try `abi.encode`. | + ## Types32Array ### remove @@ -1995,6 +2035,15 @@ function registerUpkeep(struct KeeperRegistrarInterface.RegistrationParams reque constructor(address managerAddress, address registryAddress) public ``` +Constructor + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| managerAddress | address | The manager address | +| registryAddress | address | The registry address | + ### getCompoundablePoolIds ```solidity diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 9a75ad4ae..b0f36c57b 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -5,7 +5,8 @@ import { round } from '@casimir/ethereum/helpers/math' import EventEmitter, { on } from 'events' import { time, setBalance } from '@nomicfoundation/hardhat-network-helpers' import ISSVNetworkViewsJson from '@casimir/ethereum/build/artifacts/scripts/resources/ssv-network/contracts/ISSVNetworkViews.sol/ISSVNetworkViews.json' -import { depositUpkeepBalanceHandler } from '../helpers/oracle' +import { depositUpkeepBalanceHandler, initiateDepositHandler, reportCompletedExitsHandler } from '../helpers/oracle' +import { getEventsIterable } from '@casimir/oracle/src/providers/events' void async function () { const [, , , , fourthUser, keeper, oracle] = await ethers.getSigners() @@ -66,89 +67,93 @@ void async function () { await result.wait() } - const depositAmount = 320 * ((100 + await manager.feePercent()) / 100) - const stake = await manager.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) - await stake?.wait() - - await depositUpkeepBalanceHandler({ manager, signer: oracle }) - let requestId = 0 - const blocksPerReward = 50 + const blocksPerReport = 25 const rewardPerValidator = 0.105 - let lastRewardBlock = await ethers.provider.getBlockNumber() - for await (const block of on(ethers.provider as unknown as EventEmitter, 'block')) { - if (block - blocksPerReward >= lastRewardBlock) { - console.log('New reward block') - lastRewardBlock = block - const stakedPoolCount = (await manager.getStakedPoolIds()).length - if (stakedPoolCount) { - console.log(`Rewarding ${stakedPoolCount} validators ${rewardPerValidator} each`) - await time.increase(time.duration.days(1)) - - await runUpkeep({ upkeep, keeper }) - + let lastReportBlock = await ethers.provider.getBlockNumber() + ethers.provider.on('block', async (block) => { + if (block - blocksPerReport >= lastReportBlock) { + console.log('Attempting report') + await time.increase(time.duration.days(1)) + lastReportBlock = await ethers.provider.getBlockNumber() + await runUpkeep({ upkeep, keeper }) + const stakedPoolIds = await manager.getStakedPoolIds() + const stakedPoolCount = stakedPoolIds.length + const pendingPoolCount = (await manager.getPendingPoolIds()).length + if (pendingPoolCount + stakedPoolCount > 0) { + console.log('Reporting') + const activatedBalance = pendingPoolCount * 32 + const exitingPoolCount = await manager.requestedExits() + const sweptExitedBalance = exitingPoolCount.toNumber() * 32 const rewardAmount = rewardPerValidator * stakedPoolCount - let nextActiveBalance = round( - parseFloat( - ethers.utils.formatEther( - (await manager.latestActiveBalance()).add((await manager.getPendingPoolIds()).length * 32) - ) - ) + rewardAmount - ) - - let nextActivatedDeposits = (await manager.getPendingPoolIds()).length - let nextValues = { + const latestActiveBalance = await manager.latestActiveBalance() + const nextActiveBalance = round(parseFloat(ethers.utils.formatEther(latestActiveBalance.add(activatedBalance).sub(sweptExitedBalance))) + rewardAmount) + const nextActivatedDeposits = (await manager.getPendingPoolIds()).length + const nextValues = { activeBalance: nextActiveBalance, - sweptBalance: 0, + sweptBalance: sweptExitedBalance, activatedDeposits: nextActivatedDeposits, forcedExits: 0, - completedExits: 0, + completedExits: exitingPoolCount.toNumber(), compoundablePoolIds: [0, 0, 0, 0, 0] } - requestId = await fulfillReport({ upkeep, keeper, values: nextValues, requestId }) - - await runUpkeep({ upkeep, keeper }) - - const currentBalance = await ethers.provider.getBalance(manager.address) - const nextBalance = currentBalance.add(ethers.utils.parseEther(rewardAmount.toString())) - await setBalance(manager.address, nextBalance) - - await time.increase(time.duration.days(1)) - - await runUpkeep({ upkeep, keeper }) - - nextActiveBalance = round( - parseFloat( - ethers.utils.formatEther( - (await manager.latestActiveBalance()).add((await manager.getPendingPoolIds()).length * 32) - ) - ) - rewardAmount - ) - nextActivatedDeposits = (await manager.getPendingPoolIds()).length - nextValues = { - activeBalance: nextActiveBalance, - sweptBalance: rewardAmount, - activatedDeposits: nextActivatedDeposits, - forcedExits: 0, - completedExits: 0, - compoundablePoolIds: [0, 0, 0, 0, 0] + let remaining = exitingPoolCount.toNumber() + for (const poolId of stakedPoolIds) { + if (remaining === 0) break + const poolDetails = await views.getPoolDetails(poolId) + if (poolDetails.status === 3) { + remaining-- + const poolAddress = await manager.getPoolAddress(poolId) + const currentBalance = await ethers.provider.getBalance(poolAddress) + const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptExitedBalance.toString())) + await setBalance(poolAddress, nextBalance) + } + } + let finalizableCompletedExits = await manager.finalizableCompletedExits() + while (finalizableCompletedExits.toNumber() !== exitingPoolCount.toNumber()) { + finalizableCompletedExits = await manager.finalizableCompletedExits() } - - requestId = await fulfillReport({ - upkeep, - keeper, - values: nextValues, - requestId - }) - await runUpkeep({ upkeep, keeper }) } } + }) + + setTimeout(async () => { + const depositAmount = 32 * ((100 + await manager.feePercent()) / 100) + const stake = await manager.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) + await stake?.wait() + if (process.env.MOCK_ORACLE) await depositUpkeepBalanceHandler({ manager, signer: oracle }) + }, 2500) + + if (process.env.MOCK_ORACLE) { + const handlers = { + DepositRequested: initiateDepositHandler, + /** + * We don't need to handle these/they aren't ready: + * ReshareRequested: initiatePoolReshareHandler, + * ExitRequested: initiatePoolExitHandler, + * ForcedExitReportsRequested: reportForcedExitsHandler, + */ + CompletedExitReportsRequested: reportCompletedExitsHandler + } + const eventsIterable = getEventsIterable({ manager, events: Object.keys(handlers) }) + for await (const event of eventsIterable) { + const details = event?.[event.length - 1] + const { args } = details + const handler = handlers[details.event as keyof typeof handlers] + if (!handler) throw new Error(`No handler found for event ${details.event}`) + await handler({ + manager, + views, + signer: oracle, + args + }) + } } }() \ No newline at end of file diff --git a/contracts/ethereum/src/v1/CasimirManager.sol b/contracts/ethereum/src/v1/CasimirManager.sol index 3b6bc97b0..7915d4f02 100644 --- a/contracts/ethereum/src/v1/CasimirManager.sol +++ b/contracts/ethereum/src/v1/CasimirManager.sol @@ -144,7 +144,7 @@ contract CasimirManager is ICasimirManager, Ownable, ReentrancyGuard { /** IDs of pools staked */ uint32[] private stakedPoolIds; /** Exiting pool count */ - uint256 private requestedExits; + uint256 public requestedExits; /** Slashed pool count */ uint256 private forcedExits; diff --git a/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol index d79893c58..06ef66df5 100644 --- a/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol +++ b/contracts/ethereum/src/v1/interfaces/ICasimirManager.sol @@ -126,6 +126,7 @@ interface ICasimirManager { function latestActiveBalance() external view returns (uint256); function feePercent() external view returns (uint32); function requestedWithdrawalBalance() external view returns (uint256); + function requestedExits() external view returns (uint256); function finalizableCompletedExits() external view returns (uint256); function reportPeriod() external view returns (uint32); function getTotalStake() external view returns (uint256); diff --git a/contracts/ethereum/test/fixtures/shared.ts b/contracts/ethereum/test/fixtures/shared.ts index ccf286e3c..c76281cb9 100644 --- a/contracts/ethereum/test/fixtures/shared.ts +++ b/contracts/ethereum/test/fixtures/shared.ts @@ -84,18 +84,14 @@ export async function secondUserDepositFixture() { const depositAmount = round(24 * ((100 + await manager.feePercent()) / 100), 10) const deposit = await manager.connect(secondUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await deposit.wait() - if ((await manager.upkeepId()).toNumber() === 0) { await depositUpkeepBalanceHandler({ manager, signer: oracle }) } - await initiateDepositHandler({ manager, signer: oracle }) - await time.increase(time.duration.days(1)) - - await runUpkeep({ upkeep, keeper }) - let requestId = 0 + await time.increase(time.duration.days(1)) + await runUpkeep({ upkeep, keeper }) const nextValues = { activeBalance: 32, sweptBalance: 0, @@ -110,7 +106,6 @@ export async function secondUserDepositFixture() { values: nextValues, requestId }) - await runUpkeep({ upkeep, keeper }) return { manager, registry, upkeep, views, owner, firstUser, secondUser, keeper, oracle, requestId } @@ -120,11 +115,9 @@ export async function secondUserDepositFixture() { export async function rewardsPostSecondUserDepositFixture() { const { manager, registry, upkeep, views, owner, firstUser, secondUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(secondUserDepositFixture) + let requestId = latestRequestId await time.increase(time.duration.days(1)) - await runUpkeep({ upkeep, keeper }) - - let requestId = latestRequestId const nextValues = { activeBalance: 32.105, sweptBalance: 0, @@ -139,7 +132,6 @@ export async function rewardsPostSecondUserDepositFixture() { values: nextValues, requestId }) - await runUpkeep({ upkeep, keeper }) return { manager, registry, upkeep, views, owner, firstUser, secondUser, keeper, oracle, requestId } @@ -149,21 +141,11 @@ export async function rewardsPostSecondUserDepositFixture() { export async function sweepPostSecondUserDepositFixture() { const { manager, registry, upkeep, views, owner, firstUser, secondUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(secondUserDepositFixture) - const sweptRewards = 0.105 - const stakedPoolIds = await manager.getStakedPoolIds() - for (const poolId of stakedPoolIds) { - const poolAddress = await manager.getPoolAddress(poolId) - const poolSweptRewards = sweptRewards / stakedPoolIds.length - const currentBalance = await ethers.provider.getBalance(poolAddress) - const nextBalance = currentBalance.add(ethers.utils.parseEther(poolSweptRewards.toString())) - await setBalance(poolAddress, nextBalance) - } - + let requestId = latestRequestId await time.increase(time.duration.days(1)) - await runUpkeep({ upkeep, keeper }) - - let requestId = latestRequestId + const sweptRewards = 0.105 + const stakedPoolIds = await manager.getStakedPoolIds() const compoundablePoolIds = [0, 0, 0, 0, 0] for (let i = 0; i < compoundablePoolIds.length; i++) { if (i < stakedPoolIds.length) compoundablePoolIds[i] = stakedPoolIds[i] @@ -182,7 +164,13 @@ export async function sweepPostSecondUserDepositFixture() { values: nextValues, requestId }) - + for (const poolId of stakedPoolIds) { + const poolAddress = await manager.getPoolAddress(poolId) + const poolSweptRewards = sweptRewards / stakedPoolIds.length + const currentBalance = await ethers.provider.getBalance(poolAddress) + const nextBalance = currentBalance.add(ethers.utils.parseEther(poolSweptRewards.toString())) + await setBalance(poolAddress, nextBalance) + } await runUpkeep({ upkeep, keeper }) return { manager, registry, upkeep, views, owner, firstUser, secondUser, keeper, oracle, requestId } @@ -199,11 +187,9 @@ export async function thirdUserDepositFixture() { await initiateDepositHandler({ manager, signer: oracle }) + let requestId = latestRequestId await time.increase(time.duration.days(1)) - await runUpkeep({ upkeep, keeper }) - - let requestId = latestRequestId const nextValues = { activeBalance: 64, sweptBalance: 0, @@ -218,7 +204,6 @@ export async function thirdUserDepositFixture() { values: nextValues, requestId }) - await runUpkeep({ upkeep, keeper }) return { manager, registry, upkeep, views, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId } @@ -228,11 +213,9 @@ export async function thirdUserDepositFixture() { export async function rewardsPostThirdUserDepositFixture() { const { manager, registry, upkeep, views, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(thirdUserDepositFixture) + let requestId = latestRequestId await time.increase(time.duration.days(1)) - await runUpkeep({ upkeep, keeper }) - - let requestId = latestRequestId const nextValues = { activeBalance: 64.21, sweptBalance: 0, @@ -247,7 +230,6 @@ export async function rewardsPostThirdUserDepositFixture() { values: nextValues, requestId }) - await runUpkeep({ upkeep, keeper }) return { manager, registry, upkeep, views, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId } @@ -257,21 +239,11 @@ export async function rewardsPostThirdUserDepositFixture() { export async function sweepPostThirdUserDepositFixture() { const { manager, registry, upkeep, views, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(rewardsPostThirdUserDepositFixture) - const sweptRewards = 0.21 - const stakedPoolIds = await manager.getStakedPoolIds() - for (const poolId of stakedPoolIds) { - const poolAddress = await manager.getPoolAddress(poolId) - const poolSweptRewards = sweptRewards / stakedPoolIds.length - const currentBalance = await ethers.provider.getBalance(poolAddress) - const nextBalance = currentBalance.add(ethers.utils.parseEther(poolSweptRewards.toString())) - await setBalance(poolAddress, nextBalance) - } - + let requestId = latestRequestId await time.increase(time.duration.days(1)) - await runUpkeep({ upkeep, keeper }) - - let requestId = latestRequestId + const sweptRewards = 0.21 + const stakedPoolIds = await manager.getStakedPoolIds() const compoundablePoolIds = [0, 0, 0, 0, 0] for (let i = 0; i < compoundablePoolIds.length; i++) { if (i < stakedPoolIds.length) compoundablePoolIds[i] = stakedPoolIds[i] @@ -290,7 +262,13 @@ export async function sweepPostThirdUserDepositFixture() { values: nextValues, requestId }) - + for (const poolId of stakedPoolIds) { + const poolAddress = await manager.getPoolAddress(poolId) + const poolSweptRewards = sweptRewards / stakedPoolIds.length + const currentBalance = await ethers.provider.getBalance(poolAddress) + const nextBalance = currentBalance.add(ethers.utils.parseEther(poolSweptRewards.toString())) + await setBalance(poolAddress, nextBalance) + } await runUpkeep({ upkeep, keeper }) return { manager, registry, upkeep, views, owner, firstUser, secondUser, thirdUser, keeper, oracle, requestId } @@ -303,11 +281,9 @@ export async function firstUserPartialWithdrawalFixture() { const withdraw = await manager.connect(firstUser).requestWithdrawal(withdrawableBalance) await withdraw.wait() + let requestId = latestRequestId await time.increase(time.duration.days(1)) - await runUpkeep({ upkeep, keeper }) - - let requestId = latestRequestId const nextValues = { activeBalance: 64, sweptBalance: 0, @@ -322,7 +298,6 @@ export async function firstUserPartialWithdrawalFixture() { values: nextValues, requestId }) - await runUpkeep({ upkeep, keeper }) return { manager, registry, upkeep, views, firstUser, secondUser, thirdUser, keeper, oracle, requestId } @@ -336,17 +311,13 @@ export async function fourthUserDepositFixture() { const depositAmount = round(72 * ((100 + await manager.feePercent()) / 100), 10) const deposit = await manager.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await deposit.wait() - - /** Initiate next ready pools (2) */ for (let i = 0; i < 2; i++) { await initiateDepositHandler({ manager, signer: oracle }) } + let requestId = latestRequestId await time.increase(time.duration.days(1)) - await runUpkeep({ upkeep, keeper }) - - let requestId = latestRequestId const nextValues = { activeBalance: 128, sweptBalance: 0, @@ -361,7 +332,6 @@ export async function fourthUserDepositFixture() { values: nextValues, requestId }) - await runUpkeep({ upkeep, keeper }) return { manager, registry, upkeep, views, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } @@ -371,12 +341,9 @@ export async function fourthUserDepositFixture() { export async function activeBalanceLossFixture() { const { manager, registry, upkeep, views, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId: latestRequestId } = await loadFixture(fourthUserDepositFixture) + let requestId = latestRequestId await time.increase(time.duration.days(1)) - await runUpkeep({ upkeep, keeper }) - - let requestId = latestRequestId - const nextValues = { activeBalance: 126, sweptBalance: 0, @@ -385,14 +352,12 @@ export async function activeBalanceLossFixture() { completedExits: 0, compoundablePoolIds: [0, 0, 0, 0, 0] } - requestId = await fulfillReport({ upkeep, keeper, values: nextValues, requestId }) - await runUpkeep({ upkeep, keeper }) return { manager, registry, upkeep, views, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } @@ -404,12 +369,9 @@ export async function activeBalanceRecoveryFixture() { let nextActiveBalance = 127 let requestId = latestRequestId - for (let i = 0; i < 2; i++) { await time.increase(time.duration.days(1)) - await runUpkeep({ upkeep, keeper }) - const nextValues = { activeBalance: nextActiveBalance, sweptBalance: 0, @@ -418,16 +380,13 @@ export async function activeBalanceRecoveryFixture() { completedExits: 0, compoundablePoolIds: [0, 0, 0, 0, 0] } - requestId = await fulfillReport({ upkeep, keeper, values: nextValues, requestId }) - await runUpkeep({ upkeep, keeper }) - nextActiveBalance += 1 } @@ -441,20 +400,11 @@ export async function thirdUserFullWithdrawalFixture() { const thirdStake = await manager.getUserStake(thirdUser.address) const withdraw = await manager.connect(thirdUser).requestWithdrawal(thirdStake) await withdraw.wait() - - const sweptExitedBalance = 32 - const withdrawnPoolId = (await manager.getStakedPoolIds())[0] - const withdrawnPoolAddress = await manager.getPoolAddress(withdrawnPoolId) - const currentBalance = await ethers.provider.getBalance(withdrawnPoolAddress) - const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptExitedBalance.toString())) - await setBalance(withdrawnPoolAddress, nextBalance) - + + let requestId = latestRequestId await time.increase(time.duration.days(1)) - await runUpkeep({ upkeep, keeper }) - - let requestId = latestRequestId - + const sweptExitedBalance = 32 const nextValues = { activeBalance: 96, sweptBalance: sweptExitedBalance, @@ -463,16 +413,18 @@ export async function thirdUserFullWithdrawalFixture() { completedExits: 1, compoundablePoolIds: [0, 0, 0, 0, 0] } - requestId = await fulfillReport({ upkeep, keeper, values: nextValues, requestId }) - + const exitedPoolId = (await manager.getStakedPoolIds())[0] + const exitedPoolAddress = await manager.getPoolAddress(exitedPoolId) + const currentBalance = await ethers.provider.getBalance(exitedPoolAddress) + const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptExitedBalance.toString())) + await setBalance(exitedPoolAddress, nextBalance) await reportCompletedExitsHandler({ manager, views, signer: oracle, args: { count: 1 } }) - await runUpkeep({ upkeep, keeper }) return { manager, registry, upkeep, views, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } @@ -486,17 +438,13 @@ export async function simulationFixture() { let nextActiveBalance = 96 let totalRewards = 0 let requestId = latestRequestId - for (let i = 0; i < 5; i++) { await time.increase(time.duration.days(1)) - await runUpkeep({ upkeep, keeper }) - const stakedPoolIds = await manager.getStakedPoolIds() const rewardsAmount = rewardsPerValidator * stakedPoolIds.length totalRewards += round(rewardsAmount, 10) nextActiveBalance = round(nextActiveBalance + rewardsAmount, 10) - const nextValues = { activeBalance: nextActiveBalance, sweptBalance: 0, @@ -505,31 +453,19 @@ export async function simulationFixture() { completedExits: 0, compoundablePoolIds: [0, 0, 0, 0, 0] } - requestId = await fulfillReport({ upkeep, keeper, values: nextValues, requestId }) - await runUpkeep({ upkeep, keeper }) } const sweptRewards = totalRewards const stakedPoolIds = await manager.getStakedPoolIds() - for (const poolId of stakedPoolIds) { - const poolAddress = await manager.getPoolAddress(poolId) - const poolSweptRewards = sweptRewards / stakedPoolIds.length - const currentBalance = await ethers.provider.getBalance(poolAddress) - const nextBalance = currentBalance.add(ethers.utils.parseEther(poolSweptRewards.toString())) - await setBalance(poolAddress, nextBalance) - } - await time.increase(time.duration.days(1)) - await runUpkeep({ upkeep, keeper }) - const compoundablePoolIds = [0, 0, 0, 0, 0] for (let i = 0; i < compoundablePoolIds.length; i++) { if (i < stakedPoolIds.length) compoundablePoolIds[i] = stakedPoolIds[i] @@ -542,14 +478,19 @@ export async function simulationFixture() { completedExits: 0, compoundablePoolIds } - requestId = await fulfillReport({ upkeep, keeper, values: nextValues, requestId }) - + for (const poolId of stakedPoolIds) { + const poolAddress = await manager.getPoolAddress(poolId) + const poolSweptRewards = sweptRewards / stakedPoolIds.length + const currentBalance = await ethers.provider.getBalance(poolAddress) + const nextBalance = currentBalance.add(ethers.utils.parseEther(poolSweptRewards.toString())) + await setBalance(poolAddress, nextBalance) + } await runUpkeep({ upkeep, keeper }) return { manager, registry, upkeep, views, firstUser, secondUser, thirdUser, fourthUser, keeper, oracle, requestId } diff --git a/scripts/ethereum/dev.ts b/scripts/ethereum/dev.ts index 89a18f2c8..b02e866d6 100644 --- a/scripts/ethereum/dev.ts +++ b/scripts/ethereum/dev.ts @@ -33,10 +33,12 @@ void async function () { /** Set fork rpc if requested, default fork to goerli if set vaguely or unset */ const fork = argv.fork === 'true' ? 'goerli' : argv.fork === 'false' ? false : argv.fork ? argv.fork : 'goerli' - /** Default to mock external contracts */ + /** Default to mock external services */ const mock = argv.mock !== 'false' && argv.mock !== false - /** Get manager address based on shared seed nonce */ + process.env.MOCK_ORACLE = `${mock}` + process.env.MINING_INTERVAL = '12' + const seed = await getSecret('consensus-networks-bip39-seed') if (!process.env.PUBLIC_MANAGER_ADDRESS) { const wallet = getWallet(seed) @@ -53,7 +55,6 @@ void async function () { process.env.PUBLIC_VIEWS_ADDRESS = `${viewsAddress}` } process.env.BIP39_SEED = seed - echo(chalk.bgBlackBright('Your mnemonic seed is ') + chalk.bgBlue(seed)) if (fork) { @@ -62,30 +63,23 @@ void async function () { process.env.ETHEREUM_FORKING_URL = url echo(chalk.bgBlackBright('Using ') + chalk.bgBlue(fork) + chalk.bgBlackBright(' ethereum fork at ') + chalk.bgBlue(url)) } - - /** Set 12-second interval mining for dev networks */ - process.env.MINING_INTERVAL = '12' - - /** Set mock */ - process.env.MOCK_EXTERNAL_CONTRACTS = `${mock}` $`npm run node --workspace @casimir/ethereum` - // Wait for hardhat to start const hardhatWaitTime = 2500 await new Promise(resolve => setTimeout(resolve, hardhatWaitTime)) $`npm run dev --workspace @casimir/ethereum -- --network localhost` - /** Start local oracle */ - process.env.ETHEREUM_RPC_URL = 'http://localhost:8545' - $`npm run dev --workspace @casimir/oracle` - - process.on('SIGINT', () => { - const messes = ['oracle'] - if (clean) { - const cleaners = messes.map(mess => `npm run clean --workspace @casimir/${mess}`).join(' & ') - console.log(`\n🧹 Cleaning up: ${messes.map(mess => `@casimir/${mess}`).join(', ')}`) - runSync(`${cleaners}`) - } - process.exit() - }) + if (!mock) { + process.env.ETHEREUM_RPC_URL = 'http://localhost:8545' + $`npm run dev --workspace @casimir/oracle` + process.on('SIGINT', () => { + const messes = ['oracle'] + if (clean) { + const cleaners = messes.map(mess => `npm run clean --workspace @casimir/${mess}`).join(' & ') + console.log(`\n🧹 Cleaning up: ${messes.map(mess => `@casimir/${mess}`).join(', ')}`) + runSync(`${cleaners}`) + } + process.exit() + }) + } }() \ No newline at end of file diff --git a/scripts/ethereum/test.ts b/scripts/ethereum/test.ts index ede6607fb..5ddae77fc 100755 --- a/scripts/ethereum/test.ts +++ b/scripts/ethereum/test.ts @@ -8,7 +8,6 @@ import minimist from 'minimist' * Arguments: * --clean: whether to clean build directory (override default false) * --fork: mainnet, goerli, true, or false (override default goerli) - * --mock: whether to use mock contracts (override default true) * * For more info see: * - https://hardhat.org/hardhat-network/docs/overview @@ -26,9 +25,6 @@ void async function () { /** Set fork rpc if requested, default fork to goerli if set vaguely */ const fork = argv.fork === 'true' ? 'goerli' : argv.fork === 'false' ? false : argv.fork ? argv.fork : 'goerli' - /** Default to mock external contracts */ - const mock = argv.mock !== 'false' && argv.mock !== false - /** Get shared seed */ const seed = await getSecret('consensus-networks-bip39-seed') @@ -42,8 +38,5 @@ void async function () { echo(chalk.bgBlackBright('Using ') + chalk.bgBlue(fork) + chalk.bgBlackBright(' fork at ') + chalk.bgBlue(url)) } - /** Set mock */ - process.env.MOCK_EXTERNAL_CONTRACTS = `${mock}` - $`npm run test --clean=${clean} --workspace @casimir/ethereum` }() diff --git a/services/oracle/src/index.ts b/services/oracle/src/index.ts index f47906376..8c1ad5613 100644 --- a/services/oracle/src/index.ts +++ b/services/oracle/src/index.ts @@ -4,7 +4,8 @@ import { initiateDepositHandler, initiatePoolExitHandler, initiatePoolReshareHandler, - reportCompletedExitsHandler + reportCompletedExitsHandler, + reportForcedExitsHandler } from './providers/handlers' const handlers = { From ef7e731b45b97cc043d2f346967440d526df6474 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Thu, 8 Jun 2023 01:38:39 -0400 Subject: [PATCH 67/78] Fix dev reward script --- contracts/ethereum/README.md | 85 +++--- contracts/ethereum/docs/index.md | 382 ++++++++++++++------------- contracts/ethereum/scripts/dev.ts | 43 +-- contracts/ethereum/test/operators.ts | 5 - contracts/ethereum/test/users.ts | 22 +- 5 files changed, 269 insertions(+), 268 deletions(-) diff --git a/contracts/ethereum/README.md b/contracts/ethereum/README.md index f9f38e9ac..2d6595873 100644 --- a/contracts/ethereum/README.md +++ b/contracts/ethereum/README.md @@ -23,11 +23,15 @@ graph LR B(Manager Contract) C(Beacon Deposit Contract) D(SSV Contract) - G(Oracle Contract) H(Functions Contract) I(Automation Contract) end + subgraph Oracle Dao + G(Oracle) + end + G --> B + A((User)) --> B B --> C @@ -50,9 +54,8 @@ graph LR E2 --> F24(SSV Operator n) end - G <--> I + I --> B H <--> I - I <--> B subgraph Chainlink J1(Chainlink Node 1) @@ -60,11 +63,6 @@ graph LR J3(Chainlink Node 3) J4(Chainlink Node n) end - - J1 --> G - J2 --> G - J3 --> G - J4 --> G J1 --> H J2 --> H @@ -79,7 +77,7 @@ graph LR ### Contracts -Casimir deploys two internal contracts and interfaces with suite of vendor contracts from the Consensus Specs, Chainlink, OpenZeppelin, SSV, and Uniswap. All contract source code is located in the [./src](./src) directory. A Hardhat environment for development and deployment is configured in the [hardhat.config.ts](./hardhat.config.ts) file. The following contract scripts can be executed from the **monorepo root** directory: +Casimir v1 contains five internal contracts with interfaces and uses a suite of vendor contracts from Chainlink, OpenZeppelin, SSV, and Uniswap. All contract source code is located in the [./src/v1](./src/v1) directory. A Hardhat environment for development and deployment is configured in the [hardhat.config.ts](./hardhat.config.ts) file. The following contract scripts can be executed from the **monorepo root** directory: - `npm run dev:ethereum` - Run a local Ethereum network and deploy contracts - `npm run test:ethereum` - Run tests for the Ethereum contracts @@ -88,40 +86,41 @@ Casimir deploys two internal contracts and interfaces with suite of vendor contr **Internal Contracts:** -Core internal contracts and interfaces are located in the [src](./src) directory. +Core internal contracts and interfaces are located in the root of the [src/v1](./src/v1) directory. | Contract | Description | Docs | | --- | --- | --- | -| [CasimirManager](./src/CasimirManager.sol) | Manages stake distribution | [docs/index.md#casimirmanager](./docs/index.md#casimirmanager) | -| [CasimirUpkeep](./src/CasimirUpkeep.sol) | Automates event handling | [docs/index.md#CasimirUpkeep](./docs/index.md#CasimirUpkeep) | +| [CasimirManager](./src/v1/CasimirManager.sol) | Accepts and distributes deposits | [docs/index.md#casimirmanager](./docs/index.md#casimirmanager) | +| [CasimirPool](./src/v1/CasimirPool.sol) | Accepts deposits and stakes a validator | [docs/index.md#casimirpool](./docs/index.md#casimirpool) | +| [CasimirRegistry](./src/v1/CasimirRegistry.sol) | Manages operator registration | [docs/index.md#casimirregistry](./docs/index.md#casimirregistry) | +| [CasimirUpkeep](./src/v1/CasimirUpkeep.sol) | Automates and handles reports | [docs/index.md#CasimirUpkeep](./docs/index.md#CasimirUpkeep) | +| [CasimirViews](./src/v1/CasimirViews.sol) | Provides read-only access to state | [docs/index.md#casimirviews](./docs/index.md#casimirviews) | **Vendor Contracts:** -Vendor contracts and interfaces are located in the [src/vendor](./src/vendor) directory. +Vendor contracts and interfaces are located in the [src/v1/vendor](./src/v1/vendor) directory. | Contract | Description | Docs | | --- | --- | --- | -| [DepositContract](./src/vendor/interfaces/IDepositContract.sol) | Accepts Beacon deposits | Todo | -| [Functions](./src/vendor/Functions.sol) | Provides a library for Chainlink functions | Todo | -| [FunctionsBillingRegistry](./src/vendor/interfaces/FunctionsBillingRegistryInterface.sol) | Manages Chainlink function billing | Todo | -| [FunctionsClient](./src/vendor/FunctionsClient.sol) | Executes Chainlink function requests | Todo | -| [FunctionsOracle](./src/vendor/interfaces/FunctionsOracleInterface.sol) | Handles Chainlink function requests | Todo | -| [KeeperRegistry](./src/vendor/interfaces/IKeeperRegistry.sol) | Manages Chainlink upkeeps | Todo | -| [SSVNetwork](./src/vendor/interfaces/ISSVNetwork.sol) | Connects distributed validators | Todo | -| [SSVToken](./src/vendor/interfaces/ISSVToken.sol) | Serves as operator utility token | Todo | -| [WETH](./src/vendor/interfaces/IWETH.sol) | Wraps ETH for swapping | Todo | +| [DepositContract](./src/v1/vendor/interfaces/IDepositContract.sol) | Accepts Beacon deposits | – | +| [SSVNetwork](./src/v1/vendor/interfaces/ISSVNetwork.sol) | Connects distributed validators | – | +| [WETH](./src/v1/vendor/interfaces/IWETH.sol) | Wraps ETH for swapping | – | **Mock Contracts:** -Mock (development-only) contracts and interfaces are located in the [src/mock](./src/mock) directory. +Mock (development-only) contracts and interfaces are located in the [src/mock](./src/v1/mock) directory. + +| Contract | Description | Docs | +| --- | --- | --- | +| [MockFunctionsOracle](./src/v1/mock/MockFunctionsOracle.sol) | Mock Chainlink Functions | [docs/index.md#mockfunctionsoracle](./docs/index.md#mockfunctionsoracle) | ### Distributed Key Generation -Casimir trustlessly distributes validator key shares to operators using the [rockx-dkg-cli](https://github.com/RockX-SG/rockx-dkg-cli). +Casimir distributes validator key shares to operators using the [rockx-dkg-cli](https://github.com/RockX-SG/rockx-dkg-cli). The CLI is still in development, but it can be used with the local Hardhat network to generate keys and perform DKG operations. The CLI is integrated into the Casimir oracle – use the `--mock` flag when running `npm run dev:ethereum` to enable the mock DKG CLI. Otherwise, the oracle helper scripts in [./helpers/oracle](./helpers/oracle) will use pregenerated DKG keys. ### Oracles -The contract loosely depends on two decentralized oracles. The first oracle automatically syncs validator configuration, statuses, and balances when necessary conditions are met (see [Chainlink Automation](https://docs.chain.link/chainlink-automation/introduction)) by performing external requests with trust-minimized compute infrastructure (see [Chainlink Functions](https://docs.chain.link/chainlink-functions)). The second oracle watches the manager contract events, automatically executes zero-coordination distributed key generation (DKG) operations: validator key creating, resharing, and exiting (see [Chainlink Keepers](https://docs.chain.link/chainlink-keepers/introduction)) off-chain, and submits ceremony verification proofs. +The contract uses two oracles to automate the Casimir staking experience and ensure the security of user funds. The first oracle, the Casimir upkeep, reports total validator balance, swept balance, and validator actions once per day (see [Chainlink Automation](https://docs.chain.link/chainlink-automation/introduction)) using trust-minimized compute infrastructure (see [Chainlink Functions](https://docs.chain.link/chainlink-functions)). The second oracle, the Casimir DAO oracle, watches the manager contract events and automatically executes zero-coordination distributed key generation (DKG) operations: validator key creating, resharing, and exiting (see [Chainlink Keepers](https://docs.chain.link/chainlink-keepers/introduction)) off-chain, and submits ceremony verification proofs. The DAO oracle also submits verifiable report details in response to reported validator actions (like completed exits). ## 👥 Users @@ -129,65 +128,59 @@ Users can deposit any amount of ETH to the manager contract. Their deposits are ### User Fees -The contract charges a small user fee for each deposit (and some amount TBD in reward distribution) to fund the contract's operations. The fee is a percentage of the amount deposited by a user or reward distibution. +The contract charges a 5% user fee on deposits and rewards to fund the contract's operations. **User Fee Calculation:** -1. $feePercent = fees_{LINK} + fees_{SSV}$ +1. $ethAmount = depositAmount\times{\frac{100}{100 + feePercent}}$ -2. $ethAmount = depositAmount\times{\frac{100}{100 + feePercent}}$ - -3. $feeAmount = depositAmount - ethAmount$ +2. $feeAmount = depositAmount - ethAmount$ *Where:* -- $fees_{LINK}$ is the LINK fee percentage, which is [**`getLINKFee()`**](./docs/index.md#getlinkfee) in the contract. -- $fees_{SSV}$ is the SSV fee percentage, which is [**`getSSVFee()`**](./docs/index.md#getssvfee) in the contract. -- $feePercent$ is the total fee percentage, which is the sum of the LINK and SSV fees. +- $feePercent$ is the total fee percentage, which is the sum of the required ETH, LINK, and SSV fees. - $depositAmount$ is the amount of ETH deposited. - $ethAmount$ is the amount of ETH to be distributed into the contract. - $feeAmount$ is the amount of ETH to be swapped for LINK and SSV to operate the contract. ### User Stake -The manager contract adjusts a user's stake based on the change in the total reward-to-stake distribution sum since their last interaction with the contract. Each time new rewards are distributed (after either a heartbeat interval or a threshold change is detected in the oracle), the distribution sum is updated and the new rewards are staked in an auto-compounding fashion. +The manager contract adjusts a user's stake based on the change in the total reward-to-stake ratio sum since their last interaction with the contract. Each time new rewards are reported, the ratio sum is updated to include the new rewards-to-stake ratio. The ratio sum is used to calculate a user's current stake, including compounded rewards, at any time. **User Stake Calculation:** -1. Whenever a user deposits or updates their stake, their initial stake and the current distribution sum are recorded. -2. When rewards are distributed, the distribution sum is updated to include the new reward-to-stake ratio. -3. $userStake =userStake_0\times{\frac{distributionSum}{userDistributionSum_0}}$ calculates a user's current compounded stake at any time. +1. Whenever a user deposits or updates their stake, their initial stake and the current ratio sum are recorded. +2. When rewards are distributed, the ratio sum is updated to include the new reward-to-stake ratio. +3. $userStake =userStake_0\times{\frac{stakeRatioSum}{userStakeRatioSum_0}}$ calculates a user's current compounded stake at any time. *Where:* - $userStake$ is the calculated current stake of the user, including compounded rewards. This is [**`users[userAddress].stake`**](./docs/index.md#user) in the contract. - $userStake_0$ is the initial stake of the user at the time of their last deposit or stake update. This is also [**`users[userAddress].stake`**](./docs/index.md#user) in the contract, but it is accessed before settling the user's current stake. -- $distributionSum$ is the current cumulative sum of reward-to-stake ratios in the contract. This is [**`distributionSum`**](./docs/index.md#distributionsum) in the contract. -- $userDistributionSum_0$ is the cumulative sum of reward-to-stake ratios at the time the user made their last deposit or update to their stake. This is [**`users[userAddress].distributionSum0`**](./docs/index.md#user) in the contract. +- $stakeRatioSum$ is the current cumulative sum of reward-to-stake ratios in the contract. This is [**`stakeRatioSum`**](./docs/index.md#stakeratiosum) in the contract. +- $userStakeRatioSum_0$ is the cumulative sum of reward-to-stake ratios at the time the user made their last deposit or update to their stake. This is [**`users[userAddress].stakeRatioSum0`**](./docs/index.md#user) in the contract. ### User Withdrawals -Users can initiate a withdrawal of any amount of their stake at any time. **Full exits and withdrawal liquidity are still a WIP.** In the meantime, valid user withdrawals up to the to total current `readyDeposits` will be fulfilled by the contract. Note, more notes are coming soon on withdrawal liquidity, alongside an additional contract. +Users can request a withdrawal of any amount of their stake at any time. If the requested amount is available in the buffered balance (prepooled balance plus withdrawn balance), the withdrawal is fulfilled immediately. Otherwise, the withdrawal is added to the pending withdrawals queue and fulfilled when the requested amount is available (usually within 1-4 days, depending on the amount). ## 👷 Operators -Each Casimir validator is run by four selected operators holding key share to perform duties with threshold signatures on SSV. Registration is open to any SSV operator (see [Operator Registration](./README.md#operatorregistration). Operators are selected by an algorithm that ensures high-performance but emphasizes decentralization (see [Operator Selection](./README.md#operatorselection)) as user's deposit stake and new validators are required. +Each Casimir validator is run by four selected operators holding the key shares to perform duties with threshold signatures on SSV. Registration is open to any SSV operator (see [Operator Registration](./README.md#operatorregistration). Operators are selected by an algorithm that ensures high-performance but emphasizes decentralization (see [Operator Selection](./README.md#operatorselection)) as user's deposit stake and new validators are required. ### Operator Registration -Operators can join the contract registry with a small deposit of ETH for slashing collateral (see [Operator Collateral](./README.md#operatorcollateral)) and a lightweight SSV node config add-on (see [Operator Config](./README.md#operatorconfig)). +Operators can join the contract registry with a deposit of 4 ETH for collateral (see [Operator Collateral](./README.md#operatorcollateral)) and a lightweight SSV node config add-on (see [Operator Config](./README.md#operatorconfig)). ### Operator Selection Operators are chosen to run validators based on metrics fetched and derived directly from the SSV network. These metrics are mainly performance, market share, and fees. -Todo @elizyoung0011 - we should add your details about operator selection and performance monitoring thresholds. - -Operator performance is reported by (Chainlink) monitoring SSV exporter attestations. If an operator's performance is poor for an extended period of time, and their slashing collateral is below a threshold, Casimir removes the operator from existing operator groups by resharing or exiting. The latter is only required in the case that a validator has already undergone more than two reshares to avoid leaving the full key recoverable outside of the currently selected operators. +If an operator's performance is poor for an extended period of time, or their collateral is below the threshold, Casimir removes the operator from existing operator groups by resharing or exiting. The latter is only required in the case that a validator has already undergone more than two reshares to avoid leaving the full key recoverable outside of the currently selected operators. ### Operator Collateral -Todo add notes. +Collateral is used to recover lost validator effective balance at the time of completing an exit. The loss blame is assigned to the four responsible operators based on performance over the duration of the validator's existence. ### Operator Config diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index 7015b625f..ffbadf017 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -58,6 +58,14 @@ uint256 requestedWithdrawalBalance Total pending withdrawal amount +### requestedExits + +```solidity +uint256 requestedExits +``` + +Exiting pool count + ### onlyPool ```solidity @@ -1206,6 +1214,152 @@ Fulfill the request for testing | response | bytes | Aggregated response from the user code | | err | bytes | Aggregated error from the user code or from the sweptStake pipeline Either response or error parameter will be set, but never both | +## CasimirViews + +### constructor + +```solidity +constructor(address managerAddress, address registryAddress) public +``` + +Constructor + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| managerAddress | address | The manager address | +| registryAddress | address | The registry address | + +### getCompoundablePoolIds + +```solidity +function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5] poolIds) +``` + +Get the next five compoundable pool IDs + +_Should be called off-chain_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolIds | uint32[5] | The next five compoundable pool IDs | + +### getOperators + +```solidity +function getOperators(uint256 startIndex, uint256 endIndex) external view returns (struct ICasimirRegistry.Operator[]) +``` + +Get operators + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | struct ICasimirRegistry.Operator[] | operators The operators | + +### getPendingValidatorPublicKeys + +```solidity +function getPendingValidatorPublicKeys(uint256 startIndex, uint256 endIndex) external view returns (bytes[]) +``` + +Get the pending validator public keys + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes[] | validatorPublicKeys The pending validator public keys | + +### getStakedValidatorPublicKeys + +```solidity +function getStakedValidatorPublicKeys(uint256 startIndex, uint256 endIndex) external view returns (bytes[]) +``` + +Get the staked validator public keys + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | bytes[] | validatorPublicKeys The staked validator public keys | + +### getPoolDetails + +```solidity +function getPoolDetails(uint32 poolId) external view returns (struct ICasimirPool.PoolDetails poolDetails) +``` + +Get a pool's details by ID + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolId | uint32 | The pool ID | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| poolDetails | struct ICasimirPool.PoolDetails | The pool details | + +### getSweptBalance + +```solidity +function getSweptBalance(uint256 startIndex, uint256 endIndex) public view returns (uint256 balance) +``` + +Get the swept balance + +_Should be called off-chain_ + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| startIndex | uint256 | The start index | +| endIndex | uint256 | The end index | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| balance | uint256 | The swept balance | + ## ICasimirManager ### Token @@ -1497,6 +1651,12 @@ function feePercent() external view returns (uint32) function requestedWithdrawalBalance() external view returns (uint256) ``` +### requestedExits + +```solidity +function requestedExits() external view returns (uint256) +``` + ### finalizableCompletedExits ```solidity @@ -1863,6 +2023,44 @@ method._ | upkeepNeeded | bool | boolean to indicate whether the keeper should call performUpkeep or not. | | performData | bytes | bytes that the keeper should call performUpkeep with, if upkeep is needed. If you would like to encode data to decode later, try `abi.encode`. | +## ICasimirViews + +### getCompoundablePoolIds + +```solidity +function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5]) +``` + +### getOperators + +```solidity +function getOperators(uint256 startIndex, uint256 endIndex) external view returns (struct ICasimirRegistry.Operator[]) +``` + +### getPoolDetails + +```solidity +function getPoolDetails(uint32 poolId) external view returns (struct ICasimirPool.PoolDetails) +``` + +### getPendingValidatorPublicKeys + +```solidity +function getPendingValidatorPublicKeys(uint256 startIndex, uint256 endIndex) external view returns (bytes[]) +``` + +### getStakedValidatorPublicKeys + +```solidity +function getStakedValidatorPublicKeys(uint256 startIndex, uint256 endIndex) external view returns (bytes[]) +``` + +### getSweptBalance + +```solidity +function getSweptBalance(uint256 startIndex, uint256 endIndex) external view returns (uint256) +``` + ## Types32Array ### remove @@ -2027,190 +2225,6 @@ struct RegistrationParams { function registerUpkeep(struct KeeperRegistrarInterface.RegistrationParams requestParams) external returns (uint256) ``` -## CasimirViews - -### constructor - -```solidity -constructor(address managerAddress, address registryAddress) public -``` - -Constructor - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| managerAddress | address | The manager address | -| registryAddress | address | The registry address | - -### getCompoundablePoolIds - -```solidity -function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5] poolIds) -``` - -Get the next five compoundable pool IDs - -_Should be called off-chain_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolIds | uint32[5] | The next five compoundable pool IDs | - -### getOperators - -```solidity -function getOperators(uint256 startIndex, uint256 endIndex) external view returns (struct ICasimirRegistry.Operator[]) -``` - -Get operators - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | struct ICasimirRegistry.Operator[] | operators The operators | - -### getPendingValidatorPublicKeys - -```solidity -function getPendingValidatorPublicKeys(uint256 startIndex, uint256 endIndex) external view returns (bytes[]) -``` - -Get the pending validator public keys - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes[] | validatorPublicKeys The pending validator public keys | - -### getStakedValidatorPublicKeys - -```solidity -function getStakedValidatorPublicKeys(uint256 startIndex, uint256 endIndex) external view returns (bytes[]) -``` - -Get the staked validator public keys - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | bytes[] | validatorPublicKeys The staked validator public keys | - -### getPoolDetails - -```solidity -function getPoolDetails(uint32 poolId) external view returns (struct ICasimirPool.PoolDetails poolDetails) -``` - -Get a pool's details by ID - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolId | uint32 | The pool ID | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| poolDetails | struct ICasimirPool.PoolDetails | The pool details | - -### getSweptBalance - -```solidity -function getSweptBalance(uint256 startIndex, uint256 endIndex) public view returns (uint256 balance) -``` - -Get the swept balance - -_Should be called off-chain_ - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| startIndex | uint256 | The start index | -| endIndex | uint256 | The end index | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| balance | uint256 | The swept balance | - -## ICasimirViews - -### getCompoundablePoolIds - -```solidity -function getCompoundablePoolIds(uint256 startIndex, uint256 endIndex) external view returns (uint32[5]) -``` - -### getOperators - -```solidity -function getOperators(uint256 startIndex, uint256 endIndex) external view returns (struct ICasimirRegistry.Operator[]) -``` - -### getPoolDetails - -```solidity -function getPoolDetails(uint32 poolId) external view returns (struct ICasimirPool.PoolDetails) -``` - -### getPendingValidatorPublicKeys - -```solidity -function getPendingValidatorPublicKeys(uint256 startIndex, uint256 endIndex) external view returns (bytes[]) -``` - -### getStakedValidatorPublicKeys - -```solidity -function getStakedValidatorPublicKeys(uint256 startIndex, uint256 endIndex) external view returns (bytes[]) -``` - -### getSweptBalance - -```solidity -function getSweptBalance(uint256 startIndex, uint256 endIndex) external view returns (uint256) -``` - ## MockFunctionsOracle ### constructor diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index b0f36c57b..74029cf03 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -67,13 +67,17 @@ void async function () { await result.wait() } + /** + * We are simulating the oracle reporting on a more frequent basis + * We also do not sweep or compound the rewards in this script + * Exit balances are swept as needed + */ let requestId = 0 - const blocksPerReport = 25 + const blocksPerReport = 10 const rewardPerValidator = 0.105 let lastReportBlock = await ethers.provider.getBlockNumber() ethers.provider.on('block', async (block) => { if (block - blocksPerReport >= lastReportBlock) { - console.log('Attempting report') await time.increase(time.duration.days(1)) lastReportBlock = await ethers.provider.getBlockNumber() await runUpkeep({ upkeep, keeper }) @@ -81,13 +85,12 @@ void async function () { const stakedPoolCount = stakedPoolIds.length const pendingPoolCount = (await manager.getPendingPoolIds()).length if (pendingPoolCount + stakedPoolCount > 0) { - console.log('Reporting') const activatedBalance = pendingPoolCount * 32 const exitingPoolCount = await manager.requestedExits() const sweptExitedBalance = exitingPoolCount.toNumber() * 32 const rewardAmount = rewardPerValidator * stakedPoolCount const latestActiveBalance = await manager.latestActiveBalance() - const nextActiveBalance = round(parseFloat(ethers.utils.formatEther(latestActiveBalance.add(activatedBalance).sub(sweptExitedBalance))) + rewardAmount) + const nextActiveBalance = round(parseFloat(ethers.utils.formatEther(latestActiveBalance)) + activatedBalance - sweptExitedBalance + rewardAmount, 10) const nextActivatedDeposits = (await manager.getPendingPoolIds()).length const nextValues = { activeBalance: nextActiveBalance, @@ -104,20 +107,23 @@ void async function () { requestId }) let remaining = exitingPoolCount.toNumber() - for (const poolId of stakedPoolIds) { - if (remaining === 0) break - const poolDetails = await views.getPoolDetails(poolId) - if (poolDetails.status === 3) { - remaining-- - const poolAddress = await manager.getPoolAddress(poolId) - const currentBalance = await ethers.provider.getBalance(poolAddress) - const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptExitedBalance.toString())) - await setBalance(poolAddress, nextBalance) + if (remaining) { + for (const poolId of stakedPoolIds) { + if (remaining === 0) break + const poolDetails = await views.getPoolDetails(poolId) + if (poolDetails.status === 3) { + remaining-- + const poolAddress = await manager.getPoolAddress(poolId) + const currentBalance = await ethers.provider.getBalance(poolAddress) + const poolSweptExitedBalance = sweptExitedBalance / exitingPoolCount.toNumber() + const nextBalance = currentBalance.add(ethers.utils.parseEther(poolSweptExitedBalance.toString())) + await setBalance(poolAddress, nextBalance) + } + } + let finalizableCompletedExits = await manager.finalizableCompletedExits() + while (finalizableCompletedExits.toNumber() !== exitingPoolCount.toNumber()) { + finalizableCompletedExits = await manager.finalizableCompletedExits() } - } - let finalizableCompletedExits = await manager.finalizableCompletedExits() - while (finalizableCompletedExits.toNumber() !== exitingPoolCount.toNumber()) { - finalizableCompletedExits = await manager.finalizableCompletedExits() } await runUpkeep({ upkeep, keeper }) } @@ -131,6 +137,9 @@ void async function () { if (process.env.MOCK_ORACLE) await depositUpkeepBalanceHandler({ manager, signer: oracle }) }, 2500) + /** + * We are simulating the DAO oracle (@casimir/oracle) using the oracle helper + */ if (process.env.MOCK_ORACLE) { const handlers = { DepositRequested: initiateDepositHandler, diff --git a/contracts/ethereum/test/operators.ts b/contracts/ethereum/test/operators.ts index 50f784a03..0edefc92d 100644 --- a/contracts/ethereum/test/operators.ts +++ b/contracts/ethereum/test/operators.ts @@ -118,9 +118,7 @@ describe('Operators', async function () { await setBalance(withdrawnPoolAddress, nextBalance) await time.increase(time.duration.days(1)) - await runUpkeep({ upkeep, keeper }) - const nextValues = { activeBalance: 0, sweptBalance: sweptExitedBalance, @@ -129,16 +127,13 @@ describe('Operators', async function () { completedExits: 1, compoundablePoolIds: [0, 0, 0, 0, 0] } - await fulfillReport({ upkeep, keeper, values: nextValues, requestId }) - await reportCompletedExitsHandler({ manager, views, signer: oracle, args: { count: 1 } }) - await runUpkeep({ upkeep, keeper }) const stake = await manager.getTotalStake() diff --git a/contracts/ethereum/test/users.ts b/contracts/ethereum/test/users.ts index 182087e8c..9ff95459f 100644 --- a/contracts/ethereum/test/users.ts +++ b/contracts/ethereum/test/users.ts @@ -50,9 +50,7 @@ describe('Users', async function () { expect(pendingPoolIds.length).equal(2) await time.increase(time.duration.days(1)) - await runUpkeep({ upkeep, keeper }) - let requestId = 0 const firstReportValues = { activeBalance: 64, @@ -68,7 +66,6 @@ describe('Users', async function () { values: firstReportValues, requestId }) - await runUpkeep({ upkeep, keeper }) const stakedPoolIds = await manager.getStakedPoolIds() @@ -91,17 +88,9 @@ describe('Users', async function () { expect(ethers.utils.formatEther(stake)).equal('32.0') expect(ethers.utils.formatEther(userStake)).equal('32.0') - const sweptExitedBalance = 32 - const exitedPoolId = (await manager.getStakedPoolIds())[0] - const exitedPoolAddress = await manager.getPoolAddress(exitedPoolId) - const currentBalance = await ethers.provider.getBalance(exitedPoolAddress) - const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptExitedBalance.toString())) - await setBalance(exitedPoolAddress, nextBalance) - await time.increase(time.duration.days(1)) - await runUpkeep({ upkeep, keeper }) - + const sweptExitedBalance = 32 const secondReportValues = { activeBalance: 32, sweptBalance: sweptExitedBalance, @@ -116,13 +105,14 @@ describe('Users', async function () { values: secondReportValues, requestId }) - + const exitedPoolId = (await manager.getStakedPoolIds())[0] + const exitedPoolAddress = await manager.getPoolAddress(exitedPoolId) + const currentBalance = await ethers.provider.getBalance(exitedPoolAddress) + const nextBalance = currentBalance.add(ethers.utils.parseEther(sweptExitedBalance.toString())) + await setBalance(exitedPoolAddress, nextBalance) await reportCompletedExitsHandler({ manager, views, signer: oracle, args: { count: 1 } }) - const finalizableCompletedExits = await manager.finalizableCompletedExits() - expect(finalizableCompletedExits.toNumber()).equal(1) - await runUpkeep({ upkeep, keeper }) stake = await manager.getTotalStake() From ab5ae3cfe525cd1ac4ff2be1eb8b5216444fcb66 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Thu, 8 Jun 2023 01:50:20 -0400 Subject: [PATCH 68/78] Remove hardhat console --- contracts/ethereum/hardhat.config.ts | 1 - contracts/ethereum/package.json | 2 - contracts/ethereum/src/v1/CasimirManager.sol | 3 - contracts/ethereum/src/v1/CasimirPool.sol | 3 - contracts/ethereum/src/v1/CasimirRegistry.sol | 3 - contracts/ethereum/src/v1/CasimirUpkeep.sol | 3 - contracts/ethereum/src/v1/CasimirViews.sol | 3 - package-lock.json | 185 +----------------- 8 files changed, 2 insertions(+), 201 deletions(-) diff --git a/contracts/ethereum/hardhat.config.ts b/contracts/ethereum/hardhat.config.ts index e34b3f33e..e8def7e56 100644 --- a/contracts/ethereum/hardhat.config.ts +++ b/contracts/ethereum/hardhat.config.ts @@ -4,7 +4,6 @@ import { HardhatUserConfig } from 'hardhat/config' import '@typechain/hardhat' import '@nomiclabs/hardhat-ethers' import 'solidity-docgen' -import '@openzeppelin/hardhat-upgrades' import '@nomicfoundation/hardhat-toolbox' // Seed is provided diff --git a/contracts/ethereum/package.json b/contracts/ethereum/package.json index f91007634..7ab6cba4e 100644 --- a/contracts/ethereum/package.json +++ b/contracts/ethereum/package.json @@ -13,7 +13,6 @@ "dependencies": { "@chainlink/contracts": "^0.6.1", "@openzeppelin/contracts": "^4.8.0", - "@openzeppelin/contracts-upgradeable": "^4.8.0", "@uniswap/v3-core": "1.0.1", "@uniswap/v3-periphery": "^1.4.3" }, @@ -21,7 +20,6 @@ "@nomicfoundation/hardhat-network-helpers": "^1.0.6", "@nomicfoundation/hardhat-toolbox": "^2.0.2", "@nomiclabs/hardhat-ethers": "^2.0.6", - "@openzeppelin/hardhat-upgrades": "^1.21.0", "@typechain/ethers-v5": "^10.1.0", "@typechain/hardhat": "^6.1.2", "@types/chai": "^4.3.1", diff --git a/contracts/ethereum/src/v1/CasimirManager.sol b/contracts/ethereum/src/v1/CasimirManager.sol index 7915d4f02..b65648a75 100644 --- a/contracts/ethereum/src/v1/CasimirManager.sol +++ b/contracts/ethereum/src/v1/CasimirManager.sol @@ -19,9 +19,6 @@ import "@uniswap/v3-core/contracts/interfaces/IUniswapV3Factory.sol"; import "@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol"; import "@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol"; -// Dev-only imports -import "hardhat/console.sol"; - /** * @title Manager contract that accepts and distributes deposits */ diff --git a/contracts/ethereum/src/v1/CasimirPool.sol b/contracts/ethereum/src/v1/CasimirPool.sol index 79b760e18..2feb352a1 100644 --- a/contracts/ethereum/src/v1/CasimirPool.sol +++ b/contracts/ethereum/src/v1/CasimirPool.sol @@ -8,9 +8,6 @@ import "@openzeppelin/contracts/utils/math/Math.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; -// Dev-only imports -import "hardhat/console.sol"; - /** * @title Pool contract that accepts deposits and stakes a validator */ diff --git a/contracts/ethereum/src/v1/CasimirRegistry.sol b/contracts/ethereum/src/v1/CasimirRegistry.sol index 39019f7a7..87f33485e 100644 --- a/contracts/ethereum/src/v1/CasimirRegistry.sol +++ b/contracts/ethereum/src/v1/CasimirRegistry.sol @@ -7,9 +7,6 @@ import './libraries/Types.sol'; import './vendor/interfaces/ISSVNetworkViews.sol'; import "@openzeppelin/contracts/access/Ownable.sol"; -// Dev-only imports -import "hardhat/console.sol"; - /** * @title Registry contract that manages operators */ diff --git a/contracts/ethereum/src/v1/CasimirUpkeep.sol b/contracts/ethereum/src/v1/CasimirUpkeep.sol index 96ba397aa..3ca285778 100644 --- a/contracts/ethereum/src/v1/CasimirUpkeep.sol +++ b/contracts/ethereum/src/v1/CasimirUpkeep.sol @@ -7,9 +7,6 @@ import {Functions, FunctionsClient} from "@chainlink/contracts/src/v0.8/dev/func import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; -// Dev-only imports -import "hardhat/console.sol"; - /** * @title Upkeep contract that automates and handles reports */ diff --git a/contracts/ethereum/src/v1/CasimirViews.sol b/contracts/ethereum/src/v1/CasimirViews.sol index b8a5dccaa..09dc9cdea 100644 --- a/contracts/ethereum/src/v1/CasimirViews.sol +++ b/contracts/ethereum/src/v1/CasimirViews.sol @@ -5,9 +5,6 @@ import './interfaces/ICasimirViews.sol'; import './interfaces/ICasimirManager.sol'; import './interfaces/ICasimirRegistry.sol'; -// Dev-only imports -import "hardhat/console.sol"; - /** * @title Views contract that provides read-only access to the state */ diff --git a/package-lock.json b/package-lock.json index bce69032f..683039de3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -348,7 +348,6 @@ "dependencies": { "@chainlink/contracts": "^0.6.1", "@openzeppelin/contracts": "^4.8.0", - "@openzeppelin/contracts-upgradeable": "^4.8.0", "@uniswap/v3-core": "1.0.1", "@uniswap/v3-periphery": "^1.4.3" }, @@ -356,7 +355,6 @@ "@nomicfoundation/hardhat-network-helpers": "^1.0.6", "@nomicfoundation/hardhat-toolbox": "^2.0.2", "@nomiclabs/hardhat-ethers": "^2.0.6", - "@openzeppelin/hardhat-upgrades": "^1.21.0", "@typechain/ethers-v5": "^10.1.0", "@typechain/hardhat": "^6.1.2", "@types/chai": "^4.3.1", @@ -5030,49 +5028,6 @@ "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2.tgz", "integrity": "sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA==" }, - "node_modules/@openzeppelin/hardhat-upgrades": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-1.26.0.tgz", - "integrity": "sha512-ggCvdIf7A9QcMedCaswecgt3N7hacx3qYOn+4bNPqMAwslo/SJ9vN4AhV0VWkDcY4CqFFou3RFQmDWNeLMBX9A==", - "dev": true, - "dependencies": { - "@openzeppelin/upgrades-core": "^1.26.2", - "chalk": "^4.1.0", - "debug": "^4.1.1", - "defender-base-client": "^1.44.0", - "platform-deploy-client": "^0.6.0", - "proper-lockfile": "^4.1.1" - }, - "bin": { - "migrate-oz-cli-project": "dist/scripts/migrate-oz-cli-project.js" - }, - "peerDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.0", - "@nomiclabs/hardhat-etherscan": "^3.1.0", - "ethers": "^5.0.5", - "hardhat": "^2.0.2" - }, - "peerDependenciesMeta": { - "@nomiclabs/harhdat-etherscan": { - "optional": true - } - } - }, - "node_modules/@openzeppelin/upgrades-core": { - "version": "1.26.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.26.2.tgz", - "integrity": "sha512-TJORrgyun5qflPos/47P3j61gDw+7W+tEirSBOYRxfVL1WGjX1n8iaLrijPIqzyeS1MKguN1nckAMspQ4SKrxw==", - "dev": true, - "dependencies": { - "cbor": "^8.0.0", - "chalk": "^4.1.0", - "compare-versions": "^5.0.0", - "debug": "^4.1.1", - "ethereumjs-util": "^7.0.3", - "proper-lockfile": "^4.1.1", - "solidity-ast": "^0.4.15" - } - }, "node_modules/@panva/asn1.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz", @@ -7218,64 +7173,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/amazon-cognito-identity-js": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.2.0.tgz", - "integrity": "sha512-9Fxrp9+MtLdsJvqOwSaE3ll+pneICeuE3pwj2yDkiyGNWuHx97b8bVLR2bOgfDmDJnY0Hq8QoeXtwdM4aaXJjg==", - "dev": true, - "dependencies": { - "@aws-crypto/sha256-js": "1.2.2", - "buffer": "4.9.2", - "fast-base64-decode": "^1.0.0", - "isomorphic-unfetch": "^3.0.0", - "js-cookie": "^2.2.1" - } - }, - "node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/sha256-js": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz", - "integrity": "sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==", - "dev": true, - "dependencies": { - "@aws-crypto/util": "^1.2.2", - "@aws-sdk/types": "^3.1.0", - "tslib": "^1.11.1" - } - }, - "node_modules/amazon-cognito-identity-js/node_modules/@aws-crypto/util": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-1.2.2.tgz", - "integrity": "sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==", - "dev": true, - "dependencies": { - "@aws-sdk/types": "^3.1.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - } - }, - "node_modules/amazon-cognito-identity-js/node_modules/buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "node_modules/amazon-cognito-identity-js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/amazon-cognito-identity-js/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", @@ -9265,6 +9162,7 @@ "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", "dev": true, + "peer": true, "dependencies": { "nofilter": "^3.1.0" }, @@ -9937,12 +9835,6 @@ "node": ">= 10" } }, - "node_modules/compare-versions": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-5.0.3.tgz", - "integrity": "sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==", - "dev": true - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -10968,19 +10860,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defender-base-client": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/defender-base-client/-/defender-base-client-1.44.0.tgz", - "integrity": "sha512-8ZgGA93+FlxNwG9LN1nu/Au5AyCKwAWJGNf0VLiPmh4GX/Nali/7kv72K+OtZgGxTLtKDKfgN4cnhEZwfrc8dg==", - "dev": true, - "dependencies": { - "amazon-cognito-identity-js": "^6.0.1", - "async-retry": "^1.3.3", - "axios": "^0.21.2", - "lodash": "^4.17.19", - "node-fetch": "^2.6.0" - } - }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -13925,12 +13804,6 @@ "checkpoint-store": "^1.1.0" } }, - "node_modules/fast-base64-decode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz", - "integrity": "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==", - "dev": true - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -16581,16 +16454,6 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/isomorphic-unfetch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", - "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", - "dev": true, - "dependencies": { - "node-fetch": "^2.6.1", - "unfetch": "^4.2.0" - } - }, "node_modules/isomorphic-ws": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", @@ -17362,12 +17225,6 @@ "url": "https://github.com/sponsors/panva" } }, - "node_modules/js-cookie": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", - "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==", - "dev": true - }, "node_modules/js-sdsl": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", @@ -19920,6 +19777,7 @@ "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", "dev": true, + "peer": true, "engines": { "node": ">=12.19" } @@ -20856,19 +20714,6 @@ "node": ">=8" } }, - "node_modules/platform-deploy-client": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/platform-deploy-client/-/platform-deploy-client-0.6.0.tgz", - "integrity": "sha512-mBfnOvF2gb9acGJjlXBQ6VOAkKFRdljsNKHUVY5xKqzKP2PNh/RqCIvi5AR5NqLMrQ3XaMIwRvmwAjtGw7JhYg==", - "dev": true, - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "axios": "^0.21.2", - "defender-base-client": "^1.44.0", - "lodash": "^4.17.19", - "node-fetch": "^2.6.0" - } - }, "node_modules/pngjs": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", @@ -21176,26 +21021,6 @@ "node": ">= 6" } }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "node_modules/proper-lockfile/node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -27327,12 +27152,6 @@ "node": ">=14.0" } }, - "node_modules/unfetch": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", - "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==", - "dev": true - }, "node_modules/unique-string": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", From 6dafc58804578c49c1286a060ba390e28739a074 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Thu, 8 Jun 2023 11:19:26 -0400 Subject: [PATCH 69/78] Document imported contracts in vendor packages --- contracts/ethereum/README.md | 19 +++- contracts/ethereum/docs/index.md | 88 +++++++++---------- .../FunctionsSandboxLibrary/Functions.js | 0 .../chainlink}/FunctionsSandboxLibrary/Log.js | 0 .../FunctionsSandboxLibrary/Sandbox.js | 0 .../FunctionsSandboxLibrary/Validator.js | 0 .../FunctionsSandboxLibrary/buildRequest.js | 0 .../FunctionsSandboxLibrary/encryptSecrets.js | 0 .../getRequestConfig.js | 0 .../FunctionsSandboxLibrary/handler.js | 0 .../FunctionsSandboxLibrary/index.js | 0 .../simulateRequest.js | 0 .../chainlink/src}/API-request-source.js | 0 13 files changed, 60 insertions(+), 47 deletions(-) rename {contracts/ethereum/functions => services/chainlink}/FunctionsSandboxLibrary/Functions.js (100%) rename {contracts/ethereum/functions => services/chainlink}/FunctionsSandboxLibrary/Log.js (100%) rename {contracts/ethereum/functions => services/chainlink}/FunctionsSandboxLibrary/Sandbox.js (100%) rename {contracts/ethereum/functions => services/chainlink}/FunctionsSandboxLibrary/Validator.js (100%) rename {contracts/ethereum/functions => services/chainlink}/FunctionsSandboxLibrary/buildRequest.js (100%) rename {contracts/ethereum/functions => services/chainlink}/FunctionsSandboxLibrary/encryptSecrets.js (100%) rename {contracts/ethereum/functions => services/chainlink}/FunctionsSandboxLibrary/getRequestConfig.js (100%) rename {contracts/ethereum/functions => services/chainlink}/FunctionsSandboxLibrary/handler.js (100%) rename {contracts/ethereum/functions => services/chainlink}/FunctionsSandboxLibrary/index.js (100%) rename {contracts/ethereum/functions => services/chainlink}/FunctionsSandboxLibrary/simulateRequest.js (100%) rename {contracts/ethereum/functions => services/chainlink/src}/API-request-source.js (100%) diff --git a/contracts/ethereum/README.md b/contracts/ethereum/README.md index 2d6595873..c174ac93b 100644 --- a/contracts/ethereum/README.md +++ b/contracts/ethereum/README.md @@ -95,15 +95,28 @@ Core internal contracts and interfaces are located in the root of the [src/v1](. | [CasimirRegistry](./src/v1/CasimirRegistry.sol) | Manages operator registration | [docs/index.md#casimirregistry](./docs/index.md#casimirregistry) | | [CasimirUpkeep](./src/v1/CasimirUpkeep.sol) | Automates and handles reports | [docs/index.md#CasimirUpkeep](./docs/index.md#CasimirUpkeep) | | [CasimirViews](./src/v1/CasimirViews.sol) | Provides read-only access to state | [docs/index.md#casimirviews](./docs/index.md#casimirviews) | +| [Types](./src/v1/libraries/Types.sol) | Defines internal types | [docs/index.md#types](./docs/index.md#types) | **Vendor Contracts:** -Vendor contracts and interfaces are located in the [src/v1/vendor](./src/v1/vendor) directory. +Vendor contracts and interfaces are located in the [src/v1/vendor](./src/v1/vendor) directory, or they are imported directly from installed libraries. | Contract | Description | Docs | | --- | --- | --- | +| [AutomationRegistry](../../node_modules/@chainlink/contracts/src/v0.8/interfaces/AutomationRegistryInterface2_0.sol) | Subscribes and funds upkeeps | – | | [DepositContract](./src/v1/vendor/interfaces/IDepositContract.sol) | Accepts Beacon deposits | – | -| [SSVNetwork](./src/v1/vendor/interfaces/ISSVNetwork.sol) | Connects distributed validators | – | +| [ERC20](../../node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol) | Standardizes tokens | – | +| [FunctionsClient](../../node_modules/@chainlink/contracts/src/v0.8/dev/functions/FunctionsClient.sol) | Calls Chainlink Functions | – | +| [KeeperRegistrar](./src/v1/vendor/interfaces/KeeperRegistryInterface.sol) | Allows upkeep subscription registration | – | +| [Math](../../node_modules/@openzeppelin/contracts/utils/math/Math.sol) | Provides math helpers | – | +| [Ownable](../../node_modules/@openzeppelin/contracts/access/Ownable.sol) | Provides ownable access control | – | +| [ReentrancyGuard](../../node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol) | Secures against reentrancy | – | +| [SSVNetwork](./src/v1/vendor/interfaces/ISSVNetwork.sol) | Registers SSV validators | – | +| [SSVNetworkCore](./src/v1/vendor/interfaces/ISSVNetworkCore.sol) | Provides base SSV logic and types | – | +| [SSVNetworkViews](./src/v1/vendor/interfaces/ISSVNetworkViews.sol) | Provides read-only access to SSV network state | – | +| [SwapRouter](../../node_modules/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol) +| [UniswapV3Factory](../../node_modules/@uniswap/v3-core/contracts/interfaces/IUniswapV3Factory.sol) +| [UniswapV3PoolState](../../node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol) | [WETH](./src/v1/vendor/interfaces/IWETH.sol) | Wraps ETH for swapping | – | **Mock Contracts:** @@ -112,7 +125,7 @@ Mock (development-only) contracts and interfaces are located in the [src/mock](. | Contract | Description | Docs | | --- | --- | --- | -| [MockFunctionsOracle](./src/v1/mock/MockFunctionsOracle.sol) | Mock Chainlink Functions | [docs/index.md#mockfunctionsoracle](./docs/index.md#mockfunctionsoracle) | +| [MockFunctionsOracle](./src/v1/mock/MockFunctionsOracle.sol) | Mocks Chainlink Functions responses | [docs/index.md#mockfunctionsoracle](./docs/index.md#mockfunctionsoracle) | ### Distributed Key Generation diff --git a/contracts/ethereum/docs/index.md b/contracts/ethereum/docs/index.md index ffbadf017..c8c630cdc 100644 --- a/contracts/ethereum/docs/index.md +++ b/contracts/ethereum/docs/index.md @@ -2129,6 +2129,50 @@ _Send ETH to a user_ | user | address | The user address | | amount | uint256 | The amount of stake to send | +## MockFunctionsOracle + +### constructor + +```solidity +constructor() public +``` + +### getRegistry + +```solidity +function getRegistry() external view returns (address) +``` + +Returns the address of the registry contract + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| [0] | address | address The address of the registry contract | + +### sendRequest + +```solidity +function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) +``` + +Sends a request (encoded as data) using the provided subscriptionId + +#### Parameters + +| Name | Type | Description | +| ---- | ---- | ----------- | +| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | +| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | +| _gasLimit | uint32 | Gas limit for the fulfillment callback | + +#### Return Values + +| Name | Type | Description | +| ---- | ---- | ----------- | +| requestId | bytes32 | A unique request identifier (unique per DON) | + ## IDepositContract ### DepositEvent @@ -2225,47 +2269,3 @@ struct RegistrationParams { function registerUpkeep(struct KeeperRegistrarInterface.RegistrationParams requestParams) external returns (uint256) ``` -## MockFunctionsOracle - -### constructor - -```solidity -constructor() public -``` - -### getRegistry - -```solidity -function getRegistry() external view returns (address) -``` - -Returns the address of the registry contract - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| [0] | address | address The address of the registry contract | - -### sendRequest - -```solidity -function sendRequest(uint64 _subscriptionId, bytes _data, uint32 _gasLimit) external returns (bytes32 requestId) -``` - -Sends a request (encoded as data) using the provided subscriptionId - -#### Parameters - -| Name | Type | Description | -| ---- | ---- | ----------- | -| _subscriptionId | uint64 | A unique subscription ID allocated by billing system, a client can make requests from different contracts referencing the same subscription | -| _data | bytes | Encoded Chainlink Functions request data, use FunctionsClient API to encode a request | -| _gasLimit | uint32 | Gas limit for the fulfillment callback | - -#### Return Values - -| Name | Type | Description | -| ---- | ---- | ----------- | -| requestId | bytes32 | A unique request identifier (unique per DON) | - diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/Functions.js b/services/chainlink/FunctionsSandboxLibrary/Functions.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/Functions.js rename to services/chainlink/FunctionsSandboxLibrary/Functions.js diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/Log.js b/services/chainlink/FunctionsSandboxLibrary/Log.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/Log.js rename to services/chainlink/FunctionsSandboxLibrary/Log.js diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/Sandbox.js b/services/chainlink/FunctionsSandboxLibrary/Sandbox.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/Sandbox.js rename to services/chainlink/FunctionsSandboxLibrary/Sandbox.js diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/Validator.js b/services/chainlink/FunctionsSandboxLibrary/Validator.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/Validator.js rename to services/chainlink/FunctionsSandboxLibrary/Validator.js diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/buildRequest.js b/services/chainlink/FunctionsSandboxLibrary/buildRequest.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/buildRequest.js rename to services/chainlink/FunctionsSandboxLibrary/buildRequest.js diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/encryptSecrets.js b/services/chainlink/FunctionsSandboxLibrary/encryptSecrets.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/encryptSecrets.js rename to services/chainlink/FunctionsSandboxLibrary/encryptSecrets.js diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/getRequestConfig.js b/services/chainlink/FunctionsSandboxLibrary/getRequestConfig.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/getRequestConfig.js rename to services/chainlink/FunctionsSandboxLibrary/getRequestConfig.js diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/handler.js b/services/chainlink/FunctionsSandboxLibrary/handler.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/handler.js rename to services/chainlink/FunctionsSandboxLibrary/handler.js diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/index.js b/services/chainlink/FunctionsSandboxLibrary/index.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/index.js rename to services/chainlink/FunctionsSandboxLibrary/index.js diff --git a/contracts/ethereum/functions/FunctionsSandboxLibrary/simulateRequest.js b/services/chainlink/FunctionsSandboxLibrary/simulateRequest.js similarity index 100% rename from contracts/ethereum/functions/FunctionsSandboxLibrary/simulateRequest.js rename to services/chainlink/FunctionsSandboxLibrary/simulateRequest.js diff --git a/contracts/ethereum/functions/API-request-source.js b/services/chainlink/src/API-request-source.js similarity index 100% rename from contracts/ethereum/functions/API-request-source.js rename to services/chainlink/src/API-request-source.js From dbef77f3568ceb6ea8b3b012ee8e0114ff58b587 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Thu, 8 Jun 2023 11:21:28 -0400 Subject: [PATCH 70/78] Fill in uniswap descriptions --- contracts/ethereum/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/ethereum/README.md b/contracts/ethereum/README.md index c174ac93b..8f1076256 100644 --- a/contracts/ethereum/README.md +++ b/contracts/ethereum/README.md @@ -114,9 +114,9 @@ Vendor contracts and interfaces are located in the [src/v1/vendor](./src/v1/vend | [SSVNetwork](./src/v1/vendor/interfaces/ISSVNetwork.sol) | Registers SSV validators | – | | [SSVNetworkCore](./src/v1/vendor/interfaces/ISSVNetworkCore.sol) | Provides base SSV logic and types | – | | [SSVNetworkViews](./src/v1/vendor/interfaces/ISSVNetworkViews.sol) | Provides read-only access to SSV network state | – | -| [SwapRouter](../../node_modules/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol) -| [UniswapV3Factory](../../node_modules/@uniswap/v3-core/contracts/interfaces/IUniswapV3Factory.sol) -| [UniswapV3PoolState](../../node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol) +| [SwapRouter](../../node_modules/@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol) | Routes token swaps | – | +| [UniswapV3Factory](../../node_modules/@uniswap/v3-core/contracts/interfaces/IUniswapV3Factory.sol) | Provides access to Uniswap V3 pools | – | +| [UniswapV3PoolState](../../node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol) | Provides access to Uniswap V3 pool state | – | | [WETH](./src/v1/vendor/interfaces/IWETH.sol) | Wraps ETH for swapping | – | **Mock Contracts:** From 179c3528d0fce081f56e2fa25b49784bc75e6e70 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Thu, 8 Jun 2023 11:31:47 -0400 Subject: [PATCH 71/78] Remove mistaken link --- contracts/ethereum/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/ethereum/README.md b/contracts/ethereum/README.md index 8f1076256..7ac6ff641 100644 --- a/contracts/ethereum/README.md +++ b/contracts/ethereum/README.md @@ -133,7 +133,7 @@ Casimir distributes validator key shares to operators using the [rockx-dkg-cli]( ### Oracles -The contract uses two oracles to automate the Casimir staking experience and ensure the security of user funds. The first oracle, the Casimir upkeep, reports total validator balance, swept balance, and validator actions once per day (see [Chainlink Automation](https://docs.chain.link/chainlink-automation/introduction)) using trust-minimized compute infrastructure (see [Chainlink Functions](https://docs.chain.link/chainlink-functions)). The second oracle, the Casimir DAO oracle, watches the manager contract events and automatically executes zero-coordination distributed key generation (DKG) operations: validator key creating, resharing, and exiting (see [Chainlink Keepers](https://docs.chain.link/chainlink-keepers/introduction)) off-chain, and submits ceremony verification proofs. The DAO oracle also submits verifiable report details in response to reported validator actions (like completed exits). +The contract uses two oracles to automate the Casimir staking experience and ensure the security of user funds. The first oracle, the Casimir upkeep, reports total validator balance, swept balance, and validator actions once per day (see [Chainlink Automation](https://docs.chain.link/chainlink-automation/introduction)) using trust-minimized compute infrastructure (see [Chainlink Functions](https://docs.chain.link/chainlink-functions)). The second oracle, the Casimir DAO oracle, watches the manager contract events and automatically executes zero-coordination distributed key generation (DKG) operations: validator key creating, resharing, and exiting off-chain, and submits ceremony verification proofs. The DAO oracle also submits verifiable report details in response to reported validator actions (like completed exits). ## 👥 Users From 23c2c85e1bcd4dce7170d229cb19161c2dc8add3 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Mon, 12 Jun 2023 10:58:27 -0400 Subject: [PATCH 72/78] Add cdk resource build --- scripts/cdk/deploy.ts | 8 ++++++-- scripts/cdk/test.ts | 6 +++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/scripts/cdk/deploy.ts b/scripts/cdk/deploy.ts index 0847e2137..40c61492c 100755 --- a/scripts/cdk/deploy.ts +++ b/scripts/cdk/deploy.ts @@ -13,11 +13,15 @@ void async function () { process.env.AWS_ACCOUNT = await getSecret('casimir-aws-account') process.env.NODES_IP = await getSecret('casimir-nodes-ip') - /** Prepare the CDK app */ + /** Prepare CDK resources */ + await $`npm run build --workspace @casimir/landing` + await $`npm run build --workspace @casimir/users` + + /** Prepare CDK app */ await $`npm run bootstrap --workspace @casimir/cdk` await $`npm run synth --workspace @casimir/cdk` - /** Deploy the CDK app to AWS */ + /** Deploy CDK app to AWS */ echo('🚀 Deploying CDK app') $`npm run deploy --workspace @casimir/cdk` }() diff --git a/scripts/cdk/test.ts b/scripts/cdk/test.ts index 4ad7fde7f..69aac8f8e 100644 --- a/scripts/cdk/test.ts +++ b/scripts/cdk/test.ts @@ -14,7 +14,11 @@ void async function () { process.env.AWS_ACCOUNT = process.env.AWS_ACCOUNT || '000000000000' process.env.NODES_IP = process.env.NODES_IP || '123.456.789.012' - /** Test the CDK app */ + /** Prepare CDK resources */ + await $`npm run build --workspace @casimir/landing` + await $`npm run build --workspace @casimir/users` + + /** Test CDK app */ echo('🚀 Testing CDK app') $`npm run test --workspace @casimir/cdk` }() \ No newline at end of file From ac37349524599531f5f84e77e88eea2eb3185252 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Mon, 12 Jun 2023 16:22:46 -0400 Subject: [PATCH 73/78] Fix dev script --- contracts/ethereum/scripts/dev.ts | 11 ++++- scripts/ethereum/dev.ts | 19 +++++---- scripts/local/dev.ts | 40 +++++++++++-------- services/oracle/scripts/dev.ts | 3 ++ services/oracle/src/index.ts | 15 ++++++- .../oracle/src/interfaces/HandlerInput.ts | 6 +++ services/oracle/src/providers/config.ts | 20 +++++++++- services/oracle/src/providers/handlers.ts | 18 +++++++-- 8 files changed, 99 insertions(+), 33 deletions(-) diff --git a/contracts/ethereum/scripts/dev.ts b/contracts/ethereum/scripts/dev.ts index 74029cf03..03a56de1f 100644 --- a/contracts/ethereum/scripts/dev.ts +++ b/contracts/ethereum/scripts/dev.ts @@ -7,6 +7,7 @@ import { time, setBalance } from '@nomicfoundation/hardhat-network-helpers' import ISSVNetworkViewsJson from '@casimir/ethereum/build/artifacts/scripts/resources/ssv-network/contracts/ISSVNetworkViews.sol/ISSVNetworkViews.json' import { depositUpkeepBalanceHandler, initiateDepositHandler, reportCompletedExitsHandler } from '../helpers/oracle' import { getEventsIterable } from '@casimir/oracle/src/providers/events' +import { fetchRetry } from '@casimir/helpers' void async function () { const [, , , , fourthUser, keeper, oracle] = await ethers.getSigners() @@ -131,16 +132,22 @@ void async function () { }) setTimeout(async () => { + if (process.env.MOCK_ORACLE) { + const ping = await fetchRetry('http://localhost:3000/ping') + const { message } = await ping.json() + if (message !== 'pong') throw new Error('DKG service is not running') + } const depositAmount = 32 * ((100 + await manager.feePercent()) / 100) const stake = await manager.connect(fourthUser).depositStake({ value: ethers.utils.parseEther(depositAmount.toString()) }) await stake?.wait() - if (process.env.MOCK_ORACLE) await depositUpkeepBalanceHandler({ manager, signer: oracle }) + // Todo handle in oracle and only run here if (!process.env.MOCK_ORACLE) + await depositUpkeepBalanceHandler({ manager, signer: oracle }) }, 2500) /** * We are simulating the DAO oracle (@casimir/oracle) using the oracle helper */ - if (process.env.MOCK_ORACLE) { + if (!process.env.MOCK_ORACLE) { const handlers = { DepositRequested: initiateDepositHandler, /** diff --git a/scripts/ethereum/dev.ts b/scripts/ethereum/dev.ts index b02e866d6..e95c7b8d4 100644 --- a/scripts/ethereum/dev.ts +++ b/scripts/ethereum/dev.ts @@ -8,7 +8,7 @@ import minimist from 'minimist' * Arguments: * --clean: whether to clean build directory (override default true) * --fork: mainnet, goerli, true, or false (override default goerli) - * --mock: whether to use mock contracts (override default true) + * --mock: whether to use mock services (override default true) * * For more info see: * - https://hardhat.org/hardhat-network/docs/overview @@ -39,19 +39,19 @@ void async function () { process.env.MOCK_ORACLE = `${mock}` process.env.MINING_INTERVAL = '12' + const ethereumRpcUrl = 'http://localhost:8545' + process.env.ETHEREUM_RPC_URL = ethereumRpcUrl + const seed = await getSecret('consensus-networks-bip39-seed') + const wallet = getWallet(seed) + const nonce = nonces[fork] + const managerIndex = 1 // We deploy a mock functions oracle before the manager if (!process.env.PUBLIC_MANAGER_ADDRESS) { - const wallet = getWallet(seed) - const nonce = nonces[fork] - const managerIndex = 1 // We deploy a mock oracle before the manager const managerAddress = await getFutureContractAddress({ wallet, nonce, index: managerIndex }) process.env.PUBLIC_MANAGER_ADDRESS = `${managerAddress}` } if (!process.env.PUBLIC_VIEWS_ADDRESS) { - const wallet = getWallet(seed) - const nonce = nonces[fork] - const viewsIndex = 2 // We deploy a mock oracle before the manager - const viewsAddress = await getFutureContractAddress({ wallet, nonce, index: viewsIndex }) + const viewsAddress = await getFutureContractAddress({ wallet, nonce, index: managerIndex + 1 }) process.env.PUBLIC_VIEWS_ADDRESS = `${viewsAddress}` } process.env.BIP39_SEED = seed @@ -69,8 +69,7 @@ void async function () { await new Promise(resolve => setTimeout(resolve, hardhatWaitTime)) $`npm run dev --workspace @casimir/ethereum -- --network localhost` - if (!mock) { - process.env.ETHEREUM_RPC_URL = 'http://localhost:8545' + if (mock) { $`npm run dev --workspace @casimir/oracle` process.on('SIGINT', () => { const messes = ['oracle'] diff --git a/scripts/local/dev.ts b/scripts/local/dev.ts index a7029adbb..1d4ac96cf 100644 --- a/scripts/local/dev.ts +++ b/scripts/local/dev.ts @@ -98,8 +98,7 @@ void async function () { } else if (fork) { - process.env.ETHEREUM_RPC_URL = 'http://localhost:8545' - + /** Chain fork nonces */ const nonces = { ethereum: { mainnet: 0, @@ -107,14 +106,21 @@ void async function () { } } - /** Get manager addresses based on shared seed nonce */ + const ethereumRpcUrl = 'http://localhost:8545' + process.env.ETHEREUM_RPC_URL = ethereumRpcUrl + const seed = await getSecret('consensus-networks-bip39-seed') const wallet = getWallet(seed) const nonce = nonces[chain][fork] - const managerIndex = 1 // We deploy a mock oracle before the manager - const managerAddress = await getFutureContractAddress({ wallet, nonce, index: managerIndex }) - - process.env.PUBLIC_MANAGER_ADDRESS = `${managerAddress}` + const managerIndex = 1 // We deploy a mock functions oracle before the manager + if (!process.env.PUBLIC_MANAGER_ADDRESS) { + const managerAddress = await getFutureContractAddress({ wallet, nonce, index: managerIndex }) + process.env.PUBLIC_MANAGER_ADDRESS = `${managerAddress}` + } + if (!process.env.PUBLIC_VIEWS_ADDRESS) { + const viewsAddress = await getFutureContractAddress({ wallet, nonce, index: managerIndex + 1 }) + process.env.PUBLIC_VIEWS_ADDRESS = `${viewsAddress}` + } process.env.BIP39_SEED = seed const chainFork = forks[chain][fork] @@ -146,13 +152,15 @@ void async function () { /** Run app */ $`npm run dev --workspace @casimir/${app}` - process.on('SIGINT', () => { - const messes = ['data', 'oracle'] - if (clean) { - const cleaners = messes.map(mess => `npm run clean --workspace @casimir/${mess}`).join(' & ') - console.log(`\n🧹 Cleaning up: ${messes.map(mess => `@casimir/${mess}`).join(', ')}`) - runSync(`${cleaners}`) - } - process.exit() - }) + if (mock) { + process.on('SIGINT', () => { + const messes = ['data', 'oracle'] + if (clean) { + const cleaners = messes.map(mess => `npm run clean --workspace @casimir/${mess}`).join(' & ') + console.log(`\n🧹 Cleaning up: ${messes.map(mess => `@casimir/${mess}`).join(', ')}`) + runSync(`${cleaners}`) + } + process.exit() + }) + } }() \ No newline at end of file diff --git a/services/oracle/scripts/dev.ts b/services/oracle/scripts/dev.ts index 24543dd53..6d3145b36 100644 --- a/services/oracle/scripts/dev.ts +++ b/services/oracle/scripts/dev.ts @@ -6,6 +6,9 @@ void async function () { process.env.BIP39_PATH_INDEX = '6' process.env.MANAGER_ADDRESS = process.env.PUBLIC_MANAGER_ADDRESS process.env.VIEWS_ADDRESS = process.env.PUBLIC_VIEWS_ADDRESS + process.env.LINK_TOKEN_ADDRESS = '0x326C977E6efc84E512bB9C30f76E30c160eD06FB' + process.env.SSV_TOKEN_ADDRESS = '0x3a9f01091C446bdE031E39ea8354647AFef091E7' + process.env.WETH_TOKEN_ADDRESS = '0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6' process.env.CLI_PATH = `./${resourcePath}/build/bin/rockx-dkg-cli` process.env.MESSENGER_SRV_ADDR = 'http://0.0.0.0:3000' process.env.USE_HARDCODED_OPERATORS = 'true' diff --git a/services/oracle/src/index.ts b/services/oracle/src/index.ts index 8c1ad5613..acbd5621d 100644 --- a/services/oracle/src/index.ts +++ b/services/oracle/src/index.ts @@ -16,7 +16,17 @@ const handlers = { CompletedExitReportsRequested: reportCompletedExitsHandler } -const { provider, signer, manager, views, cliPath, messengerUrl } = config() +const { + provider, + signer, + manager, + views, + linkTokenAddress, + ssvTokenAddress, + wethTokenAddress, + cliPath, + messengerUrl +} = config() ;(async function () { const eventsIterable = getEventsIterable({ manager, events: Object.keys(handlers) }) @@ -30,6 +40,9 @@ const { provider, signer, manager, views, cliPath, messengerUrl } = config() signer, manager, views, + linkTokenAddress, + ssvTokenAddress, + wethTokenAddress, cliPath, messengerUrl, args diff --git a/services/oracle/src/interfaces/HandlerInput.ts b/services/oracle/src/interfaces/HandlerInput.ts index 2b74bc627..82996702b 100644 --- a/services/oracle/src/interfaces/HandlerInput.ts +++ b/services/oracle/src/interfaces/HandlerInput.ts @@ -10,6 +10,12 @@ export interface HandlerInput { manager: CasimirManager & ethers.Contract /** Views contract */ views: CasimirViews & ethers.Contract + /** Link token address */ + linkTokenAddress: string + /** SSV token address */ + ssvTokenAddress: string + /** WETH token address */ + wethTokenAddress: string /** DKG cli path */ cliPath: string /** DKG messenger service URL */ diff --git a/services/oracle/src/providers/config.ts b/services/oracle/src/providers/config.ts index 58c40833c..485f01f73 100644 --- a/services/oracle/src/providers/config.ts +++ b/services/oracle/src/providers/config.ts @@ -26,6 +26,14 @@ export function config() { if (!viewsAddress) throw new Error('No views address provided') const views = new ethers.Contract(viewsAddress, CasimirViewsJson.abi, provider) as CasimirViews & ethers.Contract + /** Get token addresses */ + const linkTokenAddress = process.env.LINK_TOKEN_ADDRESS + if (!linkTokenAddress) throw new Error('No link token address provided') + const ssvTokenAddress = process.env.SSV_TOKEN_ADDRESS + if (!ssvTokenAddress) throw new Error('No ssv token address provided') + const wethTokenAddress = process.env.WETH_TOKEN_ADDRESS + if (!wethTokenAddress) throw new Error('No weth token address provided') + /** Get DKG CLI path */ const cliPath = process.env.CLI_PATH if (!cliPath) throw new Error('No cli path provided') @@ -34,5 +42,15 @@ export function config() { const messengerUrl = process.env.MESSENGER_SRV_ADDR if (!messengerUrl) throw new Error('No messenger url provided') - return { provider, signer, manager, views, cliPath, messengerUrl } + return { + provider, + signer, + manager, + views, + linkTokenAddress, + ssvTokenAddress, + wethTokenAddress, + cliPath, + messengerUrl + } } diff --git a/services/oracle/src/providers/handlers.ts b/services/oracle/src/providers/handlers.ts index ddb428142..c4cae16df 100644 --- a/services/oracle/src/providers/handlers.ts +++ b/services/oracle/src/providers/handlers.ts @@ -3,12 +3,15 @@ import { DKG } from './dkg' import { HandlerInput } from '../interfaces/HandlerInput' import { CasimirManager } from '@casimir/ethereum/build/artifacts/types' import { getClusterDetails } from '@casimir/ssv' +import { getPrice } from '@casimir/uniswap' export async function initiateDepositHandler(input: HandlerInput) { const { provider, signer, manager, + ssvTokenAddress, + wethTokenAddress, cliPath, messengerUrl } = input @@ -19,7 +22,7 @@ export async function initiateDepositHandler(input: HandlerInput) { nonce }) - const newOperatorIds = [5, 6, 7, 8] // Todo get new group here + const newOperatorIds = [1, 2, 3, 4] // Todo get new group here const dkg = new DKG({ cliPath, messengerUrl }) const validator = await dkg.createValidator({ @@ -46,6 +49,15 @@ export async function initiateDepositHandler(input: HandlerInput) { const { cluster, requiredBalancePerValidator } = clusterDetails + const processed = false + const price = await getPrice({ + provider, + tokenIn: wethTokenAddress, + tokenOut: ssvTokenAddress, + uniswapFeeTier: 3000 + }) + const feeAmount = ethers.utils.parseEther((Number(ethers.utils.formatEther(requiredBalancePerValidator)) * Number(price)).toPrecision(9)) + const initiateDeposit = await (manager.connect(signer) as CasimirManager & ethers.Contract).initiateDeposit( depositDataRoot, publicKey, @@ -54,8 +66,8 @@ export async function initiateDepositHandler(input: HandlerInput) { operatorIds, shares, cluster, - requiredBalancePerValidator, - false + feeAmount, + processed ) await initiateDeposit.wait() } From a6f4d36de1d724b100630d88ae36f4ea1631815d Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Mon, 12 Jun 2023 16:29:07 -0400 Subject: [PATCH 74/78] Add mock blame to report completed exits handler in oracle service --- services/oracle/src/providers/handlers.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/services/oracle/src/providers/handlers.ts b/services/oracle/src/providers/handlers.ts index c4cae16df..ed24255c3 100644 --- a/services/oracle/src/providers/handlers.ts +++ b/services/oracle/src/providers/handlers.ts @@ -171,7 +171,7 @@ export async function reportCompletedExitsHandler(input: HandlerInput) { * In production, we get the completed exit order from the Beacon API (sorting by withdrawn epoch) * We check all validators using: * const stakedPublicKeys = await views.getStakedPublicKeys(startIndex, endIndex) - * Here, we're just grabbing a random active pool for each forced exit + * Here, we're just grabbing the next exiting pool for each completed exit */ const stakedPoolIds = await manager.getStakedPoolIds() let remaining = count @@ -181,10 +181,20 @@ export async function reportCompletedExitsHandler(input: HandlerInput) { const poolDetails = await views.getPoolDetails(poolId) if (poolDetails.status === 2 || poolDetails.status === 3) { remaining-- + + /** + * In production, we use the SSV performance data to determine blame + * We check all validators using: + * const stakedPublicKeys = await views.getStakedPublicKeys(startIndex, endIndex) + * Here, we're just hardcoding blame to the first operator if less than 32 ETH + */ const operatorIds = poolDetails.operatorIds.map((operatorId) => operatorId.toNumber()) - const blamePercents = [0, 0, 0, 0] + let blamePercents = [0, 0, 0, 0] + if (poolDetails.balance.lt(ethers.utils.parseEther('32'))) { + blamePercents = [100, 0, 0, 0] + } const clusterDetails = await getClusterDetails({ - provider: provider, + provider, ownerAddress: manager.address, operatorIds }) From bc5f9ba47b9e9f43017a0a8290b7e03787bd2403 Mon Sep 17 00:00:00 2001 From: Shane Earley Date: Mon, 12 Jun 2023 16:39:13 -0400 Subject: [PATCH 75/78] Use views to fetch pool details --- apps/web/src/components/Wallet.vue | 4 +-- .../src/composables/{ssv.ts => contracts.ts} | 30 +++++++------------ apps/web/src/composables/users.ts | 2 +- 3 files changed, 14 insertions(+), 22 deletions(-) rename apps/web/src/composables/{ssv.ts => contracts.ts} (87%) diff --git a/apps/web/src/components/Wallet.vue b/apps/web/src/components/Wallet.vue index 8cdc40e47..01d05896c 100644 --- a/apps/web/src/components/Wallet.vue +++ b/apps/web/src/components/Wallet.vue @@ -146,7 +146,7 @@